【问题标题】:What is the relationship between cache coherence and memory barriers?缓存一致性和内存屏障之间有什么关系?
【发布时间】:2020-03-18 13:59:34
【问题描述】:

据我所知,内存屏障用于避免out-of-order execution。然而,在谈到缓存一致性时,也经常提到内存屏障。我不确定这两个概念是如何联系起来的,因为 - 根据我的发现 - 缓存一致性应该已经通过各种协议在硬件级别得到保证,例如梅西等。使用内存屏障防止乱序执行是否是另一种(手动)授予缓存一致性的方法?

【问题讨论】:

  • 简单的回答,无需深入了解实现细节,就是乱序 CPU 可以按照与程序顺序不同的顺序访问缓存。缓存一致性协议无法将这些访问重新置于程序顺序中,但内存屏障可以阻止它们从一开始就脱离程序顺序。

标签: multithreading assembly cpu-architecture cpu-cache memory-barriers


【解决方案1】:

在现代 CPU 上,存储首先进入存储缓冲区。当存储离开存储缓冲区并应用到缓存行时,才会涉及缓存一致性协议。

当存储在存储缓冲区中挂起时,进行存储的 CPU 可以从存储缓冲区中读回它(存储到加载转发),但其他 CPU 暂时无法观察到存储的影响。

x86MFENCE等内存屏障等待存储缓冲区耗尽:

对在 MFENCE 指令之前发出的所有从内存加载和存储到内存指令执行序列化操作。这种序列化操作保证了在程序顺序中位于 MFENCE 指令之前的每个加载和存储指令在 MFENCE 指令之后的任何加载或存储指令之前变得全局可见。 MFENCE 指令相对于所有加载和存储指令、其他 MFENCE 指令、任何 LFENCE 和 SFENCE 指令以及任何序列化指令(例如 CPUID 指令)进行排序。 MFENCE 不序列化指令流。

更多详情请见Memory Barriers: a Hardware View for Software Hackers

【讨论】:

  • 第一部分不错,但sfence 不相关。 sfence 不会停止 StoreLoad 重新排序,只会停止 x86 通常已禁止的 StoreStore,NT 存储除外。 mfence 是一个更好的例子:它会阻止以后加载指令读取缓存,直到存储缓冲区耗尽。 sfence 没有。请注意,它没有按内存负载排序。在存储缓冲区耗尽之前它不会阻止执行,它只会阻止以后存储的提交,直到存储缓冲区耗尽。你可以把它想象成在存储缓冲区中设置了一个没有任何东西可以越过的“栅栏”。
  • @PeterCordes 你说的很对,mfence 是正确的例子。已更正。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2019-09-13
  • 2014-09-03
  • 2012-07-02
  • 2018-08-24
  • 1970-01-01
相关资源
最近更新 更多