我一直在阅读有关x86内存模型如何工作以及屏障指令在x86上的意义,并与其他体系结构(例如ARMv8)进行比较。在x86和ARMv8架构中,内存模型都遵循(无双关),即传递性/累积性,即,如果CPU 1看到CPU0的存储,而CPU2看到CPU1的存储,则只有在CPU1看到CPU0的存储时才会发生,然后CPU2还必须查看CPU0的存储。我要参考的示例是保罗·麦肯尼(Paul McKenney)着名论文6.1节中的示例1和2(尽管相关,但在他最新的perf cook book http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf中也存在同样的问题)。如果我理解正确,那么x86使用商店队列(或商店订单缓冲区)对商店进行排序(以及其他微体系结构优化),然后使其成为全局可见(即写入L1D)。我的问题是x86拱(和其他拱)如何实现(微架构)传递性?存储队列确保按特定顺序使特定CPU的存储在全局范围内可见,但是又如何确保一个CPU进行的存储排序与不同CPU进行的存储排序呢?
答案 0 :(得分:6)
在x86上,只有一个一致性域。当所有其他核心提交到L1d缓存时,它们就会在同一时间对所有其他核心可见。通常,与MESI一起使用就足以给我们提供所有线程可以达成共识的总存储订单。
一些ISA(包括PowerPC)不具有该属性(实际上是由于跨SMT线程的物理核心内已退休存储的存储转发)。因此,在实际使用POWER硬件时,另外2个读者可以按不同的顺序查看来自2个线程 的mo_relaxed
存储。 Will two atomic writes to different locations in different threads always be seen in the same order by other threads?
(大概是PowerPC上的障碍阻碍了该转发。)
用于允许此IRIW(独立读取器独立编写器)重新排序的ARM内存模型,但实际上,不存在执行此操作的ARM HW。 ARM能够增强其内存模型,以确保所有内核都同意由其他多个内核完成的存储的全局顺序。
(商店转发仍然意味着,核心正在做商店会立即看到它,早在全局可见之前。当然,需要进行负载排序才能使核心能够说出他们看到了什么关于他们观察到的独立写入顺序的信息。)
如果所有核心都必须同意商店的全局排序,那么(在您的示例中)从Core2查看商店意味着Core1必须已经发生,并且您也可以看到它。
(假设Core2使用适当的障碍或获取负载或释放存储以确保其存储在看到Core1的存储的负载之后发生。)
可能还与以下内容有关: