【发布时间】:2017-10-12 04:01:44
【问题描述】:
众所周知,PowerPC 的内存模型很弱,允许任何推测性的重新排序:Store-Store、Load-Store、Store-Load、Load-Load。
至少有 3 个栅栏:
-
hwsync或sync- 完整的内存屏障,防止任何重新排序 -
lwsync- 防止重新排序的内存屏障:Load-Load、Store-Store、Load-Store -
isync- 指令障碍:https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.alangref/idalangref_isync_ics_instrs.htm
例如,可以在此代码中重新排序 Store-stwcx. 和 Load-lwz?:https://godbolt.org/g/84t5jM
lwarx 9,0,10
addi 9,9,2
stwcx. 9,0,10
bne- 0,.L2
isync
lwz 9,8(1)
众所周知,isync 防止重新排序 lwarx,bne any following instructions。
但是isync 会阻止重新排序stwcx.,bne any following instructions?
即Store-stwcx. 可以早于下面的 Load-lwz 开始,并在 Load-lwz 之后执行完成吗?
即Store-stwcx. 可以在下面的 Load-lwz 开始之前预先存储到 Store-Buffer,但是对于所有 CPU 核心可见的实际到缓存的存储发生在 Load-lwz 完成之后?
正如我们从以下文件、文章和书籍中看到的:
isync不是内存栅栏,而只是指令栅栏。isync不会强制对访问内存的其他处理器和机制进行所有外部访问。isync不会等待所有其他处理器检测存储访问isync的开销非常低且非常弱(低于lwsync和hwsync)isync不保证其他处理器会按照本地发布的顺序感知以前和未来的存储 - 这需要同步指令之一。isync是获取屏障,但众所周知,获取只能应用于加载操作,不能应用于存储 (stwcx.)isync不影响数据访问,不等待所有存储都执行完毕。
主要问题,最初:a=0, b=0
- 如果 CPU-Core-0 执行:
stwcx. [a]=1bne-isynclwz [b]。 - CPU-Core-1 执行:
hwsyncstw [b]=1hwsynclwz [a]hwsync。
那么Core-0可以看到[b]==1,Core-1可以看到[a]==0吗?
还有:
isync 防止推测执行访问数据块 在设置标志之前。并结合前面 加载、比较和条件分支指令,isync 保证分支所依赖的负载( 标志)在之后发生的任何加载之前执行 isync(从共享块加载)。 isync 不是内存屏障指令,而是 load-compare-conditional branch-isync 序列可以提供这个 排序属性。
与 isync 不同,同步强制所有外部访问完成 尊重访问内存的其他处理器和机制。
- PowerPC 中的存储 Janice M. Stone,Robert P. Fitzgerald,1995:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.47.4033&rep=rep1&type=pdf
与 sync 不同,isync 不会等待所有其他处理器检测到 存储访问。 isync 比 sync 更保守,因为 它不会延迟,直到所有处理器检测到先前的负载并且 商店。
bc;isync:这是一种开销非常低且非常弱的内存形式 栅栏。 一组特定的先前负载,bc(分支 有条件的)指令依赖保证已经完成 在任何后续指令开始执行之前。然而, 存储缓冲区和缓存状态效果仍然可以使它出现 随后的负载发生在之前的负载之前 twi 指令取决于。也就是说,PowerPC 架构不 允许商店以投机方式执行,因此任何商店都遵循 twi;isync 指令保证在任何加载后发生 bc 所依赖的。
注意isync不影响数据访问,不等待 所有要执行的存储。
3.5.7.2 指令缓存块无效(icbi)
由于这种和其他特定于实现的设计 优化,而不是要求指定的指令序列 由 Power ISA 在每个缓存行的基础上执行,软件 必须只执行三个指令的单个序列才能使任何 以前的代码修改变得可见:
sync、icbi(对任何 地址),isync。
回答:
所以,isync 不保证 Store-Load 顺序,因为“isync 不是内存屏障指令”,那么isync 不保证任何以前的存储都是可见的在下一个指令完成之前到其他 CPU 核心(使用顺序一致性)。指令同步指令isync只保证指令的启动顺序,不保证指令完成的顺序,即不保证它们对其他CPU-Cores可见效果的顺序。那些,isync 允许在此代码stwcx. [a]=1; bne-; isync; lwz [b] 中重新排序 Store-Load 的可见效果。
【问题讨论】:
-
您到底担心这里发生什么?我不认为加载指令可以加载任何与存储指令中存储的数据不一致的东西。
-
@Warren Dew 我添加了 主要问题,显示了这种可能的重新排序。 IE。如果 CPU-Core-0 执行
stwcx. [a]=1; bne-; isync; lwz [b],并且所有其他 CPU-Core 执行所有步骤与hwsync的每条指令的顺序一致,那么这些其他 CPU-Core 是否可以看到 CPU-0 的 Store-Load 重新排序?
标签: multithreading assembly concurrency powerpc