- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现了一个英特尔文档,其中指出使用字符串(不是 std::string
,而是汇编字符串指令)时需要内存屏障,以防止 CPU 重新排序它们。
但是,当两个线程(在两个不同的内核上)访问同一个内存时,是否也需要内存屏障?我想到的场景是其中一个不“拥有”高速缓存行的 CPU 写入此内存,而核心写入其存储缓冲区(而不是其高速缓存)。需要一个内存屏障将值从存储缓冲区刷新到缓存,所以其他核心可以获得这个值?
我不确定在英特尔上,MESI 协议(protocol)是否可以处理这个问题?
(我试图(糟糕地)解释上面的内容在下面的论文中得到了更好的描述,第 6-12 页):
http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf
上面的论文非常笼统,我不确定英特尔 CPU 是如何处理这个问题的。
最佳答案
MESI 协议(protocol)适用于缓存,存储缓冲本质上是预缓存,这意味着它是一个尚未向外界“发布”的存储,其同步点尚未确定。
您还需要记住,缓存一致性仅保证写入不会发生在缓存行的陈旧副本上并且不会在此过程中丢失。此类协议(protocol)的唯一保证是隐藏您拥有具有复制值的缓存的事实(本身就是性能优化),并向程序员/操作系统暴露单级平面物理内存的错觉。
就其本身而言,不能保证从多个内核读取和写入的顺序,为此,您需要使用 ISA 提供的其他构造(如锁、栅栏和依赖内存排序规则)来管理代码。
您描述的情况是不可能的,因为它破坏了第一部分 - 不拥有线路的核心无法写入内存,因为它会错过拥有线路的核心中的更新数据(如果存在)。在 MESI 协议(protocol)下会发生的情况是,写入将被缓冲一段时间,当轮到它发出时 - 它会发送所有权请求,这将使其他内核中该行的所有副本无效(如果有一个修改后的副本),并获取更新的数据。只有这样,编写器核心才能修改该行并将其标记为已修改。
但是,如果 2 个内核同时写入同一行,MESI 协议(protocol)仅保证这些写入将有一些顺序,而不是您可能想要的特定顺序。更糟糕的是 - 如果每个核心都写了几行,并且您希望这些写操作具有原子性,MESI 不保证这一点。您需要主动添加互斥锁或某种屏障,以强制硬件以您想要的方式执行写入。
关于assembly - MESI 协议(protocol)是否足够,还是仍然需要内存屏障? (英特尔 CPU),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27522190/
在并发读取和写入行中(仅读取和存储)。当一行在修改或读取模式下由核心拥有时会发生什么,以及一些其他核心问题存储在该行上的操作(假设这些读取和写入是 std::atomic::load 和 std::a
我对缓存行有一些误解。我正在使用 Haswell和 Ubuntu .现在假设我们有 2 线程应用程序,其中会发生以下情况。 mov [addr], dword 0xAC763F ;starting T
MESI(修改、独占、共享、无效)协议(protocol)用于 CPU 缓存进行通信并确保它们都使用缓存行的最新值。当一个 CPU 修改高速缓存行值时,订阅此高速缓存行的所有其他 CPU 都会在高速缓
如果核心写入但缓存线不在其 L1 中,则它写入存储缓冲区。另一个 Core 请求缓存行,MESI 看不到 Store Buffer 更新并返回未修改的缓存行。 Store Buffer 很快就会被刷新
在下面显示的伊利诺斯 MESI 协议(protocol)的状态转换图中,为什么在从状态 S 转换到状态 I 时有一个 Flush' 信号,在从状态 E 转换到状态 I 时有一个 Flush 信号,观察
我知道 MESI 协议(protocol)用于在多处理器系统中实现缓存一致性。但我不知道它是如何实现的。非常感谢您对此的任何帮助。 最佳答案 缓存一致性协议(protocol)通常在硬件中实现(在 C
如果 MESI 协议(protocol)阻止其他内核写入“独占”拥有的数据,那么 x86 LOCK 前缀的目的是什么? 我对 LOCK 提供的内容和 MESI 提供的内容感到有些困惑? 我了解 MES
我想知道 MOESI 相对于 MESI 缓存一致性协议(protocol)有什么好处,以及目前哪种协议(protocol)更受现代架构的青睐。如果成本不允许, yield 通常不会转化为实现。 MOE
我正在做一个项目,该项目是在 VHDL 中实现具有某种缓存一致性(我选择 MESI)的双处理器系统。我只想确认这一件事:共享缓存行上的写入命中应该会导致缓存 Controller 在共享总线上发送无效
我想在 intel Broadwell 中了解 MESI 的更多细节。 假设一个 cpu 插槽有 6 个核心 core 0 到 core 5 , 他们每个人都有自己的 L1$ 和 L2$ 并共享 L3
我在阅读有关缓存一致性协议(protocol)的讲座的幻灯片时遇到了以下问题:如果使用具有直写策略的缓存,哪些 MESI 状态是相关的? 也给出了答案:I(无效)和S(Shared Unmodifie
我发现了一个英特尔文档,其中指出使用字符串(不是 std::string ,而是汇编字符串指令)时需要内存屏障,以防止 CPU 重新排序它们。 但是,当两个线程(在两个不同的内核上)访问同一个内存时,
在 MESI 协议(protocol)中当一个 CPU: 执行读操作 发现缓存行处于无效状态 其他缓存中没有其他非无效副本 它需要从内存中获取数据。这将需要一定数量的周期来执行此操作。那么缓存行的状态
这是关于跨cache 不同层的缓存一致性协议(protocol)。 .我对L1的理解(X86_64)就是说,它由一个核心和 L2 独家拥有。介于 2 个内核和 L3 之间用于 CPU 插槽中的所有内核
我是一名优秀的程序员,十分优秀!