众所周知,PowerPC具有弱内存模型,允许任何推测性重新排序:存储存储,加载存储,存储加载,负载加载。
至少有3个围栏:
hwsync
或sync
- 完整的内存屏障,可防止任何重新排序lwsync
- 阻止重新排序的内存障碍:加载 - 加载,存储 - 存储,加载 - 存储isync
- 指令障碍:https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.alangref/idalangref_isync_ics_instrs.htm 例如,可以在此代码中重新排序商店 - stwcx.
和加载 - 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
?
即。可以存储 - stwcx.
早于以下加载开始 - lwz
,并且加载时间晚于加载 - lwz
吗?
即。可以存储 - stwcx.
preforms存储到Store-Buffer之前的Load - lwz
开始,但实际存储到所有CPU核心可见的缓存发生的时间晚于Load - {{ 1}}完成了?
正如我们从以下文件,文章和书籍中看到的那样:
lwz
不是内存栏,但它只是指令栏。
isync
不会强制所有外部访问完成其他访问内存的处理器和机制。
isync
不会等待所有其他处理器检测存储访问
isync
开销非常低且非常弱(低于isync
和lwsync
)
hwsync
并不保证本地发布的订单中的其他处理器会感知到以前和将来的商店 - 这需要其中一条同步说明。
isync
是获取障碍,但正如我们所知,获取只能应用于加载操作,而不能用于存储(isync
)
stwcx.
不会影响数据访问,不会等待所有商店执行。
主要问题,最初:a = 0,b = 0
isync
stwcx. [a]=1
bne-
isync
。 lwz [b]
hwsync
stw [b]=1
hwsync
lwz [a]
。 然后Core-0可以看到hwsync
而Core-1看到[b]==1
?
此外:
isync可防止推测性执行访问数据块 在标志设定之前。并结合前面的 加载,比较和条件分支指令,isync 保证分支所依赖的负载(负载 flag)在之后发生的任何负载之前执行 isync(从共享块加载)。 isync不是内存屏障指令,但是 load-compare-conditional分支异步序列可以提供此功能 订购物业。
与isync 不同,sync会强制完成所有外部访问 尊重访问内存的其他处理器和机制。
与同步不同, isync不会等待所有其他处理器检测到 存储访问。 isync比同步更不保守,因为 它不会延迟,直到所有处理器都检测到以前的负载和 存储
bc; isync:这是一种非常低开销且非常弱的内存形式 fence。 bc(分支机构)的一组特定前置负载 有条件的)指令取决于保证已完成 在任何后续指令开始执行之前。然而, 存储缓冲区和缓存状态效果可以使它出现 随后的负载发生在之前的负载之前 twi指令取决于。也就是说,PowerPC架构没有 允许商店以推测方式执行,所以任何商店都在跟随 twi; isync指令保证在任何加载后发生 bc所依赖的。
请注意, isync不会影响数据访问,也不会等待 所有要执行的商店。
3.5.7.2指令高速缓存块无效(icbi)
由于这个和其他特定于实现的设计 优化,而不是要求指定的指令序列 通过Power ISA以每个缓存行为基础执行软件 必须只执行三个指令的单个序列才能生成任何一个 以前的代码修改变得可见:
[a]==0
,sync
(对任何代码修改) 地址),icbi
。
解答:
因此,isync
并不保证存储加载顺序,因为" isync不是内存屏障指令",然后{{1}在下一个指令完成之前,我们不保证任何以前的存储对其他CPU核心可见(使用顺序一致性)。指令同步命令isync
仅保证启动指令的顺序,但不保证指令的完成顺序,即不保证其对其他CPU核的可见效果的顺序。那些isync
允许在此代码isync
中重新排序Store-Load的可见效果。
答案 0 :(得分:2)
正如您所猜测的那样,您的大多数优秀来源都意味着,此处涉及内存访问的两个属性:
如果其他处理器可以正面访问内存 使用特定于处理器的缓冲区或缓存可以使存储在处理器上完成,但使其对其他处理器不可见。
执行内存访问时,请遵循同一处理器上的其他指令 。
Ordering是内存访问的 intra-processor 方面,它控制处理器的无序功能。
对于其他处理器的指令,无法进行排序。
可见性是一个处理器间方面,它确保内存访问的副作用对其他处理器(或通常对其他代理)可见。 商店主要副作用是更改内存位置。
通过控制这两个方面,可以强制执行进程间排序,即其他处理器看到一系列内存访问的顺序。
不言而喻,“排序”一词通常指的是第二个含义,除非在没有其他代理人存在的情况下使用
这无疑是一个令人困惑的术语。
请注意,我对PowerPC架构没有信心,我只是在网上找到的一些官方文档和您提供的报价的帮助下应用该理论。
isync
,就像sc
和rfi
Context-Synchronizing instructions一样,其主要目的是保证后续指令在前一个指令的上下文中执行。
例如,执行系统调用会更改上下文,我们不希望特权代码在非特权上下文中执行,反之亦然。
这些说明等待所有先前发送的指令完成但不能可见
以前发布的所有说明都已完成,至少已经完成了 引起异常。
但是,这些指令导致的内存访问不需要 完成了其他处理器和机制。
因此,根据重新排序的含义,isync
会阻止负载,加载存储等重新排序。
确实从执行处理器的角度来防止任何此类重新排序(进程内重新排序) - 所有以前的加载和存储都在isync
完成之前完成,但它们不一定可见。
它不会阻止从其他处理器(进程间重新排序)的角度重新排序,因为它不能确保先前指令的可见性。
但isync会阻止重新排序stwcx。,bne< - >以下任何指示?
仅进行内部流程重新排序。
即。可以Store-stwcx。比以下Load-lwz更早开始,并且在Load-lwz之后执行完成?
从执行它们的处理器的角度来看,stwcx.
在<{1}}开始时已完成,但是,使用英特尔术语,它是在本地完成 - 其他处理器在lwz
开始时可能看不到它已完成。
即。可以Store-stwcx。 preforms存储到Store-Buffer的时间早于以下Load-lwz开始,但实际存储到所有CPU内核可见的缓存发生的时间晚于Load-lwz完成?
是的,确实。