【问题标题】:Does `isync` prevent Store-Load reordering on CPU PowerPC?`isync` 是否会阻止 CPU PowerPC 上的 Store-Load 重新排序?
【发布时间】:2017-10-12 04:01:44
【问题描述】:

众所周知,PowerPC 的内存模型很弱,允许任何推测性的重新排序:Store-Store、Load-Store、Store-Load、Load-Load。

至少有 3 个栅栏:

例如,可以在此代码中重新排序 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 的开销非常低且非常弱(低于lwsynchwsync

  • 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吗?


还有:

  1. https://www.ibm.com/developerworks/systems/articles/powerpc.html

isync 防止推测执行访问数据块 在设置标志之前。并结合前面 加载、比较和条件分支指令,isync 保证分支所依赖的负载( 标志)在之后发生的任何加载之前执行 isync(从共享块加载)。 isync 不是内存屏障指令,而是 load-compare-conditional branch-isync 序列可以提供这个 排序属性

  1. http://www.nxp.com/assets/documents/data/en/application-notes/AN2540.pdf

与 isync 不同,同步强制所有外部访问完成 尊重访问内存的其他处理器和机制。

  1. 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 更保守,因为 它不会延迟,直到所有处理器检测到先前的负载并且 商店。

  1. http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2745.html

bc;isync:这是一种开销非常低且非常弱的内存形式 栅栏。 一组特定的先前负载,bc(分支 有条件的)指令依赖保证已经完成 在任何后续指令开始执行之前。然而, 存储缓冲区和缓存状态效果仍然可以使它出现 随后的负载发生在之前的负载之前 twi 指令取决于。也就是说,PowerPC 架构不 允许商店以投机方式执行,因此任何商店都遵循 twi;isync 指令保证在任何加载后发生 bc 所依赖的。

  1. https://books.google.ru/books?id=TKOfDQAAQBAJ&pg=PA264&lpg=PA264&dq=isync+store+load&source=bl&ots=-4FyWvxTwg&sig=r1fitaG-Q3GHOxvSMTgLJMBVGUU&hl=ru&sa=X&ved=0ahUKEwiKjYK97urTAhUJ_iwKHbfMA58Q6AEIOjAC#v=onepage&q=isync%20store%20load&f=false

  1. https://books.google.ru/books?id=gZZgAQAAQBAJ&pg=PA71&lpg=PA71&dq=isync+store+load&source=bl&ots=bo6nTLdzEZ&sig=vCjoDmUWhn0buN_uMf8XgbDzCf4&hl=ru&sa=X&ved=0ahUKEwiKjYK97urTAhUJ_iwKHbfMA58Q6AEIcTAJ#v=onepage&q=isync%20store%20load&f=false

  1. https://books.google.ru/books?id=G2fmCgAAQBAJ&pg=PA321&lpg=PA321&dq=isync+store+load&source=bl&ots=YS4mE-4f_F&sig=OVwaJYE-SNnor-KtKrjlkOd6AOs&hl=ru&sa=X&ved=0ahUKEwiKjYK97urTAhUJ_iwKHbfMA58Q6AEIYjAH#v=onepage&q&f=false

  1. http://www.nxp.com/assets/documents/data/en/application-notes/AN3441.pdf

注意isync不影响数据访问,不等待 所有要执行的存储

  1. 第77页:https://www.setphaserstostun.org/power8/POWER8_UM_v1.3_16MAR2016_pub.pdf

3.5.7.2 指令缓存块无效(icbi)

由于这种和其他特定于实现的设计 优化,而不是要求指定的指令序列 由 Power ISA 在每个缓存行的基础上执行,软件 必须只执行三个指令的单个序列才能使任何 以前的代码修改变得可见:syncicbi(对任何 地址),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


【解决方案1】:

正如您已经猜到的并且您的大多数优秀资料都暗示,这里涉及内存访问的两个属性:

可见性

如果其他处理器可以阻止内存访问。
使用特定于处理器的缓冲区或高速缓存可以使存储在处理器上完成,但使其对其他处理器不可见。

订购

当内存访问相对于同一处理器上的其他指令执行时


排序是内存访问的处理器内方面,它控制处理器的乱序能力。
不能针对其他处理器的指令进行排序。

可见性是处理器间的一个方面,它确保内存访问的副作用对其他处理器(或通常对其他代理)可见。
存储主要副作用是更改内存位置。

通过控制这两个方面,可以强制执行进程间排序,即其他处理器看到一系列内存访问的顺序。
不言而喻,“排序”一词通常指的是第二个含义,除非在没有其他代理存在的情况下使用。
诚然,这是一个令人困惑的术语。


请注意,我对 PowerPC 架构没有信心,我只是在网上找到的一些官方文档和您提供的报价的帮助下应用该理论。

isync,就像scrfiContext-Synchronizing instructions一样,它们的主要目的是保证后续指令在前面建立的上下文中执行。 例如,执行系统调用会更改上下文,我们不希望特权代码在非特权上下文中执行,反之亦然。

这些指令等待所有先前发送的指令完成但不可见

之前发布的所有指令都已完成,至少到了无法再执行的程度 导致异常。
然而,这些指令导致的内存访问不需要有 相对于其他处理器和机制完成。

因此,根据您所说的重新排序,isync 是否会阻止 Load-Load、Load-Store 等重新排序。
从执行它的处理器的角度来看,它确实阻止了任何此类重新排序(进程内重新排序) - 所有先前的加载和存储都在 isync 完成之前完成,但它们不一定是可见的。
阻止从其他处理器的角度进行重新排序(进程间重新排序),因为它不能确保先前指令的可见性。


但是 isync 会阻止重新排序 stwcx.,bne 任何以下说明吗?

仅进程内重新排序。

即可以存储-stwcx。比后面的 Load-lwz 早开始,比 Load-lwz 晚完成?

不是从执行它们的处理器的角度来看,stwcx.lwz 开始时完成但是,使用英特尔术语,它在本地完成 - 在lwz 开始时,其他处理器可能看不到它完成。

即可以存储-stwcx。在下面的 Load-lwz 开始之前预先存储到 Store-Buffer,但对所有 CPU 核心可见的实际存储到缓存的时间晚于 Load-lwz 完成?

是的,没错。

【讨论】:

  • 谢谢!我添加了主要问题,它显示了这种可能的重新排序。 IE。如果 CPU-Core-0 执行 stwcx. [a]=1; bne-; isync; lwz [b],并且所有其他 CPU-Core 执行 sequential-consistency 中的所有步骤,每条指令使用 hwsync,那么这些其他 CPU-Core 可以看到 Store-Load CPU-0 的重新排序?
  • @Alex 抱歉回答迟了。我相信其他 CPU 仍然可以相信 Store-Load 重新排序,因为 Core0 有责任在执行加载之前将存储“推送”到内存层次结构的可见域中(使用栅栏)。但是,我不精通 PowerPC 架构,我不想提供虚假/不准确的信息。
  • 所以,isync 不保证 Store-Load 顺序,因为“isync 不是内存屏障指令”,那么isync 不保证任何在下一个指令完成之前,以前的存储将对其他 CPU 核心(使用顺序一致性)可见。指令同步指令isync只保证指令的启动顺序,不保证指令完成的顺序,即不保证它们对其他CPU-Cores可见效果的顺序。那些,isync 允许在此代码 stwcx. [a]=1; bne-; isync; lwz [b] 中重新排序 Store-Load。
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2018-10-25
相关资源
最近更新 更多