4

我一直在阅读有关 x86 内存模型的工作原理以及 x86 上屏障指令的重要性以及与 ARMv8 等其他架构的比较。在 x86 和 ARMv8 架构中,内存模型似乎(没有双关语)尊重传递性/累积性,即如果 CPU 1 看到 CPU0 的存储,而 CPU2 看到 CPU1 的存储,这只有在 CPU1 看到 CPU0 存储时才会发生,那么 CPU2 也必须看到 CPU0 的存储。我所指的例子是 Paul McKenney 着名论文第 6.1 节中的示例 1 和 2(虽然很旧,但在他最新的 perf 烹饪书http://www.puppetmastertrading.com/images/hwViewForSwHackers 中也存在同样的内容。 pdf)。如果我理解正确,x86 使用存储队列(或存储顺序缓冲区)在存储全局可见(即写入 L1D)之前对存储进行排序(以及其他微架构优化)。我的问题是 x86 拱门(和其他拱门)如何实现(微架构)传递性属性?存储队列确保特定 CPU 的存储以特定顺序全局可见,但是如何确保由一个 CPU 生成的存储与由不同 CPU 生成的存储排序?

4

1 回答 1

7

在 x86 上,只有一个一致性域。当它们提交到 L1d 缓存时,存储对所有其他内核完全可见。这与一般的 MESI 一起足以为我们提供所有线程都可以同意的总存储顺序。

一些 ISA(包括 PowerPC)不具备该属性(实际上是因为在物理核心内跨 SMT 线程的退役存储的存储转发)。因此,在 POWER 硬件上的实践中,其他 2 个读者可以以不同的顺序查看 mo_relaxed来自 2 个线程的存储。对不同线程中不同位置的两次原子写入是否总是以相同的顺序被其他线程看到? (大概是 PowerPC 上的障碍阻止了该转发。)

ARM 内存模型曾经允许这种 IRIW(Independent Reader Independent Writer)重新排序,但实际上没有 ARM 硬件可以做到这一点。ARM 能够加强其内存模型,以保证所有内核都同意由多个其他内核完成的存储的全局顺序。

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


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

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


可能还相关:

于 2019-09-19T20:55:05.213 回答