当前位置: 首页 > 知识库问答 >
问题:

是否因为cpu无序执行或缓存一致性问题而需要内存障碍?

禄烨然
2023-03-14

我想知道为什么需要内存障碍,我读了一些关于这个Topic的文章
有人说这是因为cpu无序执行,而其他人说这是因为缓存一致性问题导致缓冲区存储和队列失效<那么,需要记忆障碍的真正原因是什么?cpu无序执行或缓存一致性问题?或者两者都有?cpu无序执行是否与缓存一致性有关?x86和arm之间有什么区别?

共有1个答案

华建同
2023-03-14

当ISA的内存排序规则弱于您的算法所需的语义时,您需要障碍来排序此核心/线程对全局可见一致缓存的访问。

缓存总是一致的,但这与一致性(在多个操作之间排序)是不同的。

您可以在按顺序排列的CPU上重新排序内存。更详细地说,如何加载-

相关:

  • x86 CPU是否重新排序指令?讨论内存重新排序与无序执行之间的区别。(以及x86的强有序内存模型是如何通过硬件磁道排序,以及存储缓冲区将存储执行从存储可见性解耦到其他线程/核心,从而在主动无序执行的基础上实现的。)
  • x86内存排序:与处理器内转发相比,使用早期存储重新排序的加载
  • 全局不可见加载指令

另请参见https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/和https://preshing.com/20120930/weak-vs-strong-memory-models了解更多基本信息。x86有一个“强”内存排序模型:程序顺序加上带有存储转发的存储缓冲区。C获取和发布是“免费”的,只有原子RMW和seq\u cst存储需要屏障。

ARM有一个“弱”内存排序模型:只有Cmemory_order_consume(数据依赖排序)是“免费的”,获取和发布需要特殊指令(如ldar/stlr)或障碍。

 类似资料:
  • 当无序处理器遇到以下情况时 假设所有访问都将导致缓存未命中,处理器能否在请求$R1甚至0x1337之前请求内存控制器请求0x42的内容?如果是这样,假设访问$R1将导致异常(例如,分段错误),我们可以认为0x42是推测性加载的,对吗? 顺便说一下,当加载存储单元向内存控制器发送请求时,它可以在接收到对前一个的回答之前发送第二个请求吗? 我的问题没有特别针对任何架构。欢迎与任何主流架构相关的答案。

  • 我正试图确切地理解什么是记忆障碍。根据我目前所知,使用内存屏障(例如:mfence)来防止指令从之前到之后和从之后到之前的重新排序。 这是正在使用的内存屏障的一个示例: 现在我的问题是:mfence指令是否只是一个指示CPU以何种顺序执行指令的标记?或者,它是CPU实际执行的指令,就像它执行其他指令一样(例如:)。

  • 我试图理解Java的关键字,关于在具有CPU缓存的多线程程序中写入易失性原子变量。 我已经阅读了一些教程和Java语言规范,特别是关于“订购前发生”的第17.4.5节。我的理解是,当一个线程将一个新值写入一个可变变量时,更新后的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现: > 线程可以在CPU缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句

  • 1)谁能解释一下为什么显示的是31GB而不是60GB。2)还有助于为上述参数设置最佳值。

  • 内存和性能配置不足是导致应用程序运行缓慢或崩溃的主要原因吗?

  • 我正在评估Apache Ignite,以检查它是否符合我们公司的需要。到目前为止还好。现在我正试图了解near cache特性在一致性方面是如何工作的。 我的问题是:除了这个文档之外,还有其他文档解释它是如何工作的吗?特别是,我想知道对任何其他实例的任何后续读请求(在写请求之后)是否会获得更新的数据(没有最终的一致性)。 谢了!