是因为 cpu 乱序执行还是缓存一致性问题需要内存屏障?

Are memory barriers needed because of cpu out of order execution or because of cache consistency problem?

我想知道为什么需要内存屏障,我已经阅读了一些关于这个主题的文章。
有人说是因为 cpu 乱序执行,而 others 说是缓存一致性问题导致存储缓冲区和队列失效。
那么,需要内存屏障的真正原因是什么? cpu乱序执行或缓存一致性问题?或两者? cpu乱序执行和缓存一致性有关系吗? x86和arm有什么区别?

当 ISA 的内存排序规则弱于您的算法所需的语义时,您需要障碍来排序此核心/线程对 globally-visible 连贯缓存的访问。

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

您可以对 in-order CPU 进行内存重新排序。 更详细地展示了如何在 开始 按程序顺序执行指令但具有允许 hit-under-miss and/or 允许 OoO 提交的存储缓冲区。

相关:

  • 讨论了内存重新排序与乱序执行之间的区别。 (以及 x86 的强排序内存模型是如何通过硬件轨道排序在积极的 out-of-order 执行之上实现的,存储缓冲区将存储 执行 与存储 解耦对其他 threads/cores 的可见度。)
  • x86 memory ordering: Loads Reordered with Earlier Stores vs. Intra-Processor Forwarding

另请参阅 https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/ and https://preshing.com/20120930/weak-vs-strong-memory-models 了解更多基础知识。 x86 有一个“强大的”内存排序模型:程序顺序加上 store-forwarding 的存储缓冲区。 C++ acquirerelease 是“免费的”,只有原子 RMW 和 seq_cst 存储需要障碍。

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