【发布时间】:2014-01-21 08:50:44
【问题描述】:
我正在尝试理解英特尔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 的可观察效果有何不同?
【问题讨论】:
-
只是在这里插一嘴,但我认为8.2.3.5不能用8.2.3.4解释。 8.2.3.5 示例中的意外结果不会发生,因为单个内核中的指令重新排序。发生这种情况是因为一个核心延迟看到另一个核心进行的内存更新。此外,即使在单核情况下,8.2.3.4 也可以为您提供预期的结果,因为 8.2.3.5 严格来说是多核现象。
-
@Aaron,8.2.3.4 也是多上下文的,单个进程不应该关心加载重新排序,因为如果地址冲突,它们不会重新排序,否则重新排序不会影响结果。
-
@aaron:我明白了!在存储到 [x] 之前无法将加载到 R2 移动,因为加载到 R1 会妨碍。所以8.2.3.4不能用来解释8.2.3.5。谢谢!你能把这个写下来作为答案吗?
-
@Leeor,是的,你是对的。使用单核时,您不会真正看到奇怪的结果。
-
@Arkadiy,我想我现在看得更清楚你在问什么......我认为你是对的,因为 8.2.3.2。如果没有 8.2.3.2,8.2.3.5 中的示例可能来自 8.2.3.4,即使它们是不同的底层机制。
标签: memory concurrency x86 intel