我试图理解英特尔系统编程指南的 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的可观察效果有何不同?
8.2.3.5
如果您希望内存排序严格干净,即使您承认8.2.3.4
允许加载与不同地址的存储重新排序,那么示例应该是"令人惊讶的" .
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则看到相反的情况.
这是关于该存储器模型的一致性的非常重要的观察,前面的例子没有证明.这种细微差别是顺序一致性和总存储排序之间的最大区别- 第二个例子打破了SC,第一个没有.