我一直在阅读x86内存模型是如何工作的,以及x86上的屏障指令的重要性,以及与其他体系结构(如ARMv8 )的比较。在x86和ARMv8体系结构中,内存模型似乎(没有双关意)尊重传递性/累积性,即如果CPU 1通过CPU0看到存储,而CPU2通过CPU1看到只有当CPU1看到CPU0存储时才可能发生的存储,那么CPU2也必须看到CPU 0的存储。我提到的例子是Paul的著名论文6.1节中的例1和例2(相关的,虽然旧的,也存在于他最新的perf烹饪书http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf中)。如果我正确理解,x86使用存储队列(或存储订单缓冲区)在存储变得全局可见(即写入L1D)之前订购存储(以及其他微观优化)。我的问题是x86 arch(和其他arch)是如何实现(微观架构上的)传递性的?存储队列确保特定CPU的存储按特定顺序全局可见,但如何确保一个CPU订购的存储按不同CPU的存储顺序排序?
发布于 2019-09-19 20:55:05
在x86上,只有一个相干域。当存储提交到L1d缓存时,所有其他内核都可以同时看到它们。与MESI一起,这足以给我们提供一个所有线程都能达成一致的总的存储顺序。
有几个ISAs (包括PowerPC)没有这个属性(实际上是因为在物理内核中,通过SMT线程为退役存储转发)。因此,从2个线程中存储的mo_relaxed可以通过其他两个阅读器在POWER硬件上以不同的顺序显示。Will two atomic writes to different locations in different threads always be seen in the same order by other threads? (想必是PowerPC阻止该转发的障碍)。
ARM记忆模型曾允许这种IRIW (独立读者独立作家)重新排序,但在实践中,从来没有任何ARM HW这样做过。ARM能够加强他们的记忆模型,以保证所有核心都同意由多个其他内核完成的存储的全局订单。
(商店转发仍然意味着做商店的核心看到它,在它成为全球可见之前很久。当然,内核需要负载排序才能说,他们看到了他们观察到的关于独立写作顺序的任何信息。)
如果所有核心都必须就商店的全局订购达成一致,那么(在您的示例中)从Core2查看商店意味着Core1一定已经发生了,您也可以看到它。
(假设Core2使用了适当的屏障或获取-加载或发布存储,以确保其存储发生在它的加载后,看到了Core1 1的存储。)
也可能涉及:
https://stackoverflow.com/questions/58018486
复制相似问题