【发布时间】:2020-08-27 19:30:30
【问题描述】:
X86 不提供开箱即用的顺序一致性 (SC)。
X86 提供 TSO;因此它将免费提供以下障碍
[LoadLoad]
[LoadStore]
[StoreStore]
常规加载提供获取语义。
r1=A
[LoadLoad]
[LoadStore]
...
常规商店提供发布语义。
...
[StoreStore]
[LoadStore]
X=r1
因此,用于常规加载和存储的 X86 提供了获取/释放语义。
这对于 SC 来说是不够的,例如
[StoreStore]
[LoadStore]
X=r1
r2=Y
[LoadStore]
[LoadLoad]
在这种情况下,存储和加载仍然可以重新排序,因此它不是 SC。为了解决这个问题,可以添加一个 [StoreLoad] 屏障(例如 MFENCE)。
[StoreStore]
[LoadStore]
X=r1
[StoreLoad]<--
r2=Y
[LoadStore]
[LoadLoad]
所以现在我们已经从获取/释放语义升级到 SC。
在大多数情况下,读取比写入更频繁,因此对写入执行 [StoreLoad] 是最有益的。
[StoreStore]
[LoadStore]
X=r1
[StoreLoad]
我的问题是关于线性化的。线性化和 SC 之间的区别在于,对于 SC,操作的效果可以在调用开始之前或调用完成之后倾斜,但是对于线性化,要求调用的效果在调用开始和调用完成之间。
这让我产生疑问; X86 可以提供线性化吗?
让我们首先确定调用的开始和完成:
Invocation start:指令的发出;因此,当 ROB 上的条目被保留时。
调用完成:删除 ROB 的指令(例如,当项目从 SB 移动到 L1D 时的存储情况下)。
当从缓存或内存中读取数据时,负载将成为全局可见的。这是在开始之后和完成之前。 MESI 协议将防止负载读取过时的值。
当商店离开 SB 并到达 L1d 时,商店将变得全局可见。这也在调用开始和完成之间。
所以在我看来 X86 可以提供线性化。
【问题讨论】:
-
我上面对完成的定义被打破了。从 ROB 中删除存储并不意味着它是全局可见的。为此,它需要离开 SB。
标签: x86 memory-barriers consistency