热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如果我不使用围栏,核心可以花多长时间看到另一个核心的写入?

如何解决《如果我不使用围栏,核心可以花多长时间看到另一个核心的写入?》经验,为你挑选了1个好方法。

我一直试图谷歌我的问题,但老实说,我不知道如何简洁地陈述问题.

假设我在多核Intel系统中有两个线程.这些线程在同一个NUMA节点上运行.假设线程1写入X一次,然后只是偶尔读取它向前移动.进一步假设,线程2连续读取X. 如果我不使用内存栅栏,在线程1写入X和线程2看到更新值之间可以有多长时间?

我知道X的写入将转到存储缓冲区并从那里到缓存,此时MESIF将启动,线程2将通过QPI查看更新的值.(或者至少这是我收集到的).我假设存储缓冲区将被写入存储围栏中的缓存或者是否需要重用该存储缓冲区条目,但我不知道存储缓冲区是否已分配给写入.

最终我要为自己回答的问题是,如果线程2有可能在一个相当复杂的应用程序中看到线程1的写入几秒钟而正在做其他工作.



1> Peter Cordes..:

记忆障碍,不要让其他线程看到你的店的任何更快。 (除了阻止以后的加载可以稍微减少提交缓冲存储的争用。)

存储缓冲区始终尝试尽快将已退休(已知的非推测性)存储提交到L1d高速缓存。由于MESI / MESIF / MOESI,这使它们在全球范围内可见。存储缓冲区没有设计为适当的高速缓存或写合并缓冲区(尽管它可以将背对背存储合并到同一高速缓存行),因此需要清空自身以为新存储腾出空间。与高速缓存不同,它希望保持自身为空而不是不满。

栅栏/屏障通过使当前线程等待而不是通过提高商店可见性来工作。

完全屏障(mfencelocked操作)的简单实现是使管线停止运行,直到存储缓冲区耗尽为止,但是高性能实现可以做得更好,并允许与内存顺序限制分开的无序执行。

(不幸的是,Skylake mfence确实完全阻止了乱序执行,以修复晦涩的SKL079勘误,涉及从WC内存中的NT加载。但是lock addxchg或者仅此而已,则只能阻止以后的加载读取L1d或存储缓冲区,直到屏障到达存储区的末尾。缓冲区。mfence在较早的CPU上大概也没有这个问题。)


通常,在非x86架构(具有显式的asm指令以应对较弱的内存屏障,例如仅关注StoreStore篱笆而不关心负载)的原理是相同的:阻塞需要阻塞的任何操作,直到该核心完成了任何内容的早期操作类型。

有关:

全局不可见的加载指令讨论了加载变得全局可见的含义。

内存屏障是否可以确保高速缓存一致性已完成?

记忆屏障是否既充当标记又充当指示?


最终,我要为自己解答的问题是线程2是否有可能几秒钟看不到线程1的写入

不,最坏情况下的延迟可能类似于存储缓冲区长度(Skylake上的56个条目,从BDW中的42个条目)乘以高速缓存未命中延迟的时间,因为x86的强大内存模型(无StoreStore重新排序)要求存储按顺序提交。但是用于多个高速缓存行的RFO可以一次运行,因此最大延迟可能是其的1/5(保守估计:有10个行填充缓冲区)。在飞行中也可能存在来自负载的竞争,但是我们只需要一个数量级的包络数。

可以说,在3GHz CPU上,RFO延迟(DRAM或其他内核的延迟)为300个时钟周期(基本组成)。因此,商店变得全局可见的最坏情况下的延迟可能类似于300 * 56 / 5= 3360核心时钟周期。因此,在一个数量级内,我们假设3GHz CPU的最坏情况约为1微秒。(CPU频率抵消了,因此以纳秒为单位的RFO延迟估计会更有用)。

那是您的所有商店都需要等待很长时间才能获得RFO的原因,因为它们位于未缓存或由其他核心拥有的位置。而且它们都没有背对背地位于同一缓存行,因此没有一个可以合并到存储缓冲区中。因此,通常您希望它会更快。

我认为没有任何可行的机制可以花费一百微秒,更不用说一秒钟了。


推荐阅读
  • 如何解决《英特尔x86_64处理器不仅是流水线架构,还是超标量?》经验,为你挑选了1个好方法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 如何解决《volatile语句的负载障碍在哪里?》经验,为你挑选了1个好方法。 ... [详细]
  • IhaveWindows8.1prowithanAMDprocessor.IinstalledtheAndroidSDKandEclipse.Itworksbut ... [详细]
  • 如何解决《所有64位intel架构是否都支持SSSE3/SSE4.1/SSE4.2指令?》经验,为你挑选了1个好方法。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • 英特尔处理器类产品严重缺货致使整体价格继续飙升
    英特尔目前已经向外透露由于产能问题和良品率较低问题,导致今年英特尔处理器类产品可能面临缺货现象 ... [详细]
  • 如何解决《intelcorei5是否属于i686或x86_64系列》经验,为你挑选了1个好方法。 ... [详细]
  • 这篇文章主要讲解了“Intel与ARM处理器有什么不同”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ ... [详细]
author-avatar
翔未央图_971
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有