x86内存排序:使用早期存储和内部处理器转发重新排序的负载

时间:2014-01-03 16:05:32

标签: memory concurrency x86 intel

我想了解英特尔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的可观察效果有何不同?

1 个答案:

答案 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 ConsistencyTotal Store Ordering之间的最大差异 - 第二个例子打破SC,第一个没有。