transitivity/cumulativity 属性 内存屏障是如何在微架构上实现的?

How is the transitivity/cumulativity property of memory barriers implemented micro-architecturally?

我一直在阅读 x86 内存模型的工作原理和屏障指令在 x86 上的重要性,并与其他架构(如 ARMv8)进行比较。在 x86 和 ARMv8 架构中,似乎(没有双关语)内存模型尊重 transitivity/cumulativity,即如果 CPU 1 通过 CPU0 和 CPU 看到存储2 看到 CPU1 的商店,只有 CPU1 看到 CPU0 家商店才会发生,那么 CPU2 也必须看到 CPU0 的商店。我指的示例是 Paul McKenney 的著名论文第 6.1 节中的示例 1 和示例 2(相关内容虽然陈旧,但他最新的 perf cook 书 http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf 中也有同样的内容)。如果我理解正确,x86 使用存储队列(或存储顺序缓冲区)在存储变得全局可见(即写入 L1D)之前对存储进行排序(以及其他微架构优化)。我的问题是 x86 架构(和其他架构)如何实现(微架构)传递性 属性 ?商店队列确保特定 CPU 的商店以特定顺序在全球范围内可见,但是是什么确保了一个 CPU 的商店与不同 CPU 的商店订购的商店的顺序的?

在 x86 上,只有一个一致性域。当存储提交给 L1d 缓存时,它们会同时对所有其他内核可见。这与 MESI 通常足以为我们提供一个所有线程都能达成一致的总存储顺序。

一些 ISA(包括 PowerPC)没有 属性(实际上是因为在物理内核中跨 SMT 线程对退役存储进行存储转发)。因此,mo_relaxed 来自 2 个线程的存储 可以 在 POWER 硬件上的实践中被其他 2 个读者以不同的顺序看到。 (大概是 PowerPC 上的障碍阻止了转发。)

ARM 内存模型过去允许此 IRIW(独立 Reader 独立编写器)重新排序,但实际上没有 ARM 硬件存在过这样做。 ARM 能够加强他们的内存模型,以保证所有内核都同意由多个其他内核完成的存储的全局顺序。

(存储转发仍然意味着核心 执行 存储立即看到它,远在它变得全局可见之前。当然,核心需要负载排序才能能够说他们看到了他们观察到的独立写入顺序的任何内容。)


如果所有核心都必须就商店的全局排序达成一致,那么(在您的示例中)从 Core2 看到商店意味着 Core1 一定已经发生,并且您也可以看到它。

(假设 Core2 使用适当的屏障或获取加载或释放存储来确保其存储发生在其加载看到 Core1 的存储之后。)


可能还相关:

  • Concurrent stores seen in a consistent order