我想了解英特尔System Programming Guide的第8.2节(PDF格式的第3卷)。
特别是,我看到了两种不同的重新排序方案:
8.2.3.4负载可能会与较早的商店重新排序到不同的位置
和
8.2.3.5允许处理器内转发
但是,我不明白这些场景与可观察效果POW之间的区别。这些部分提供的示例似乎可以互换。 8.2.3.4例子可以通过8.2.3.5规则以及它自己的规则来解释。反之亦然,对我来说也是如此,尽管在那种情况下我并不确定。
所以这是我的问题:是否有更好的例子或解释8.2.3.4的可观察效果与8.2.3.5的可观察效果有何不同?
答案 0 :(得分:5)
8.2.3.5
的示例应该是“令人惊讶的”,如果您希望内存排序严格干净,即使您承认8.2.3.4
允许加载对不同地址的存储重新排序。< / p>
Processor 0 | Processor 1
--------------------------------------
mov [x],1 | mov [y],1
mov R1, [x] | mov R3,[y]
mov R2, [y] | mov R4,[x]
请注意,关键部分是中间新添加的负载都返回1
(存储到负载转发使得在uarch中可以实现这一点而不会停止)。因此从理论上讲,您可以预期这两个存储都会在这些负载完成时被全局“观察”(这可能是顺序一致性的情况,其中存储和所有核心之间存在唯一的排序)。
然而,稍后R2 = R4 = 0
作为有效结果证明事实并非如此 - 实际上商店首先在本地观察。换句话说,允许这个结果意味着处理器0将存储看作time(x) < time(y)
,而处理器1则看到相反的情况。
这是关于此内存模型一致性的一个非常重要的观察,前一个示例没有证明。这个细微差别是Sequential Consistency和Total Store Ordering之间的最大差异 - 第二个例子打破SC,第一个没有。