我一直在阅读有关x86内存模型的工作原理以及x86上屏障指令的重要性,并与ARMv8等其他体系结构进行比较。在 x86 和 ARMv8 架构中,内存模型似乎(没有双关语(尊重传递性/累积性,即如果 CPU 1 通过 CPU0 看到存储,而 CPU2 通过 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 线程进行存储转发(。 因此,在 POWER 硬件上,其他 2个阅读器可以按不同的顺序看到来自 2 个线程mo_relaxed
存储。 对不同线程中不同位置的两个原子写入是否总是被其他线程以相同的顺序看到? (据推测,PowerPC上的障碍阻止了该转发。
ARM内存模型曾经允许这个IRIW(独立读取器独立写入器(重新排序,但实际上不存在ARM HW这样做。 ARM能够加强其内存模型,以保证所有内核就由多个其他内核完成的存储的全局订单达成一致。
(存储转发仍然意味着做商店的核心立即看到它,早在它变得全局可见之前。 当然,内核需要负载排序才能说他们看到了他们观察到的独立写入排序的任何内容。
如果所有内核必须就存储的全局排序达成一致,那么(在您的示例中(从 Core2 看到存储意味着 Core1 一定已经发生,并且您也可以看到它。
(假设 Core2 使用了适当的屏障或获取加载或发布存储,以确保其存储发生在看到 Core1 存储的加载之后。
可能还与:
- 按一致顺序查看的并发存储