X86 如何在微观架构上实现记忆屏障的传递性/累积性特性?
我一直在阅读x86内存模型的工作原理以及x86上的屏障指令的重要性,并与其他架构(如ARMv8)进行了比较。在x86和ARMv8体系结构中,内存模型似乎(并非有意双关语)尊重传递性/累积性,即如果CPU 1看到CPU0的存储,而CPU2看到CPU1的存储,这只有在CPU1看到CPU0存储时才会发生,那么CPU2也必须看到CPU0的存储。我所指的例子是保罗·麦肯尼的著名论文第6.1节中的例子1和2(虽然相关,但很老,在他最新的perf-cook书中也有同样的内容)。如果我理解正确,x86使用存储队列(或存储顺序缓冲区)在存储全局可见(即写入L1D)之前对其进行排序(以及其他micro-arch优化)。我的问题是x86 arch(和其他arch)如何实现(微体系结构)传递性属性?存储队列确保特定CPU的存储以特定顺序全局可见,但如何确保一个CPU的存储顺序与不同CPU的存储顺序一致?在x86上,只有一个一致性域。当存储提交到L1d缓存时,所有其他核心将在同一时间看到它们。总的来说,加上MESI,就足以给我们一个所有线程都能同意的总存储订单 一些ISA(包括PowerPC)没有该属性(实际上是因为物理核心内的失效存储跨SMT线程进行存储转发)。因此,在POWER硬件上,其他两个阅读器可以以不同的顺序查看来自两个线程的X86 如何在微观架构上实现记忆屏障的传递性/累积性特性?,x86,x86-64,cpu-architecture,memory-barriers,micro-architecture,X86,X86 64,Cpu Architecture,Memory Barriers,Micro Architecture,我一直在阅读x86内存模型的工作原理以及x86上的屏障指令的重要性,并与其他架构(如ARMv8)进行了比较。在x86和ARMv8体系结构中,内存模型似乎(并非有意双关语)尊重传递性/累积性,即如果CPU 1看到CPU0的存储,而CPU2看到CPU1的存储,这只有在CPU1看到CPU0存储时才会发生,那么CPU2也必须看到CPU0的存储。我所指的例子是保罗·麦肯尼的著名论文第6.1节中的例子1和2(虽然相关,但很老,在他最新的perf-cook书中也有同样的内容)。如果我理解正确,x86使用存储队
mou
存储。
(大概是PowerPC上的屏障阻止了该转发。)
ARM内存模型过去允许IRIW(独立读写器)重新排序,但实际上没有一个ARM硬件能够做到这一点。ARM能够增强他们的内存模型,以保证所有内核都同意由多个其他内核完成的存储的全局订单
(存储转发仍然意味着执行存储的核心在其变得全局可见之前就可以立即看到它。当然,负载排序要求核心能够说他们看到了他们观察到的关于独立写入排序的任何内容。)
如果所有Core都必须就存储的全局排序达成一致,那么(在您的示例中)从Core2看到存储意味着Core1一定已经发生了,并且您也可以看到它。 (假设Core2使用适当的屏障或获取加载或释放存储,以确保其存储发生在其加载看到Core1存储之后。)
可能还与: