【问题标题】:Does STLR(B) provide sequential consistency on ARM64?STLR(B) 是否在 ARM64 上提供顺序一致性?
【发布时间】:2021-05-05 08:11:33
【问题描述】:

对于在原子数据类型的对象上执行的存储(例如,std::atomic<uint8_t>),GCC 生成:

  • MOV 指令在 release-store (std::memory_order_release) 的情况下,
  • sequential-consistent-store (std::memory_order_seq_cst) 的情况下使用XCHG 指令。

当目标架构是 x86_64 时。但是,当是ARM64(AArch64)时,在这两种情况下,GCC都会生成相同的指令,即STLRB。没有生成其他指令(例如内存屏障),Clang 也会发生同样的情况。这是否意味着这条被描述为具有 store-relase 语义的指令实际上也提供了顺序一致性?

例如,如果两个内核上运行的两个线程将使用STLRB 存储到不同的内存位置,那么这两个存储的顺序是否唯一?这样所有其他线程都保证遵守相同的顺序?

我在问,因为根据this answer,使用 acquire-loads,不同的线程可能会观察到 release-stores 的不同顺序。为了观察相同的顺序,需要顺序一致性。

现场演示:https://godbolt.org/z/hajMKnd53

【问题讨论】:

    标签: c++ x86-64 atomic arm64 memory-model


    【解决方案1】:

    是的,stlr 是单独存储发布的,ldar 不能传递更早的 stlr(即没有 StoreLoad 重新排序)——它们之间的交互满足 seq_cst 要求的一部分,即 acq / rel 没有。 (ARMv8.3 ldapr 就像 ldar 没有这种交互,只是一个普通的获取负载,允许更有效的 acq_rel。)

    所以在 ARMv8.3 上,seq_cst 和 acq/rel 的区别在于负载端。 8.3 之前的 ARMv8 在仍然允许 StoreLoad 重新排序的同时无法执行 acq / rel,因此不幸的是,如果您在发布存储之后获取加载其他内容,它会很慢。 ARMv8.3 修复了这个问题,使 acq / rel 与 x86 一样高效。

    在 x86 上,everything 是获取加载或释放存储(因此 acq_rel 是免费的),实现顺序一致性的最坏方法是对 seq_cst 存储执行完全屏障。 (您希望原子加载便宜,并且代码使用默认的 seq_cst 内存顺序很常见。)

    C/C++11 mappings to processors 讨论了想要廉价负载的权衡,如果您必须选择负载或存储来附加完整的障碍。)


    另外,IRIW 试金石测试(所有线程都同意独立存储的顺序)由 ARMv8 内存模型保证,即使对于发布存储也是如此。它保证是“multicopy-atomic”,这意味着当存储对任何其他核心可见时,它同时对所有其他核心可见。这足以让所有核心就所有商店的总订单达成一致,达到他们可以通过两次获取负载观察到的任何限制。

    实际上,这意味着只有通过提交 L1d 缓存才能看到存储,这是一致的。例如,不是通过共享物理核心the mechanism for IRIW reordering on the few POWER CPUs that can produce the effect in real life 的逻辑核心之间的存储转发。 ARMv8 最初在纸面上允许这样做,但 ARM CPU 从未这样做过。他们加强了内存模型,以简单地保证未来的 CPU 不会像那样怪异。详情请见Simplifying ARM Concurrency: Multicopy-Atomic Axiomatic and Operational Models for ARMv8

    请注意,所有线程能够就订单达成一致的保证适用于 ARM64 上的所有存储,包括松弛。 (在具有连贯共享内存的机器中,很少有硬件机制可以创建它,因此只有在罕见的 ISA 上 seq_cst 必须实际执行任何特定的操作来防止它。)

    x86 的 TSO(Total Store Order)内存模型在名称中具有所需的产权。是的,它更强大,基本上是程序顺序加上带有存储转发的存储缓冲区。 (所以这允许 StoreLoad 重新排序,并且对于一个核心到see its own stores before they're globally visible,但没有别的。忽略 NT 存储,以及 NT 从 WC 内存(如视频 RAM)加载......)

    【讨论】:

    • 感谢您的解释。这是否意味着在 x86_64 上,mov 执行的 store-release 不是“多副本原子”?我一直认为 ARM 的内存模型较弱,但在我看来,在这个特定方面,它实际上更强大。
    • @DanielLangr:添加了一段关于 x86 的内容;它的内存模型有时被称为 TSO,Total Store Order,所以您正在寻找的保证是正确的名称:P(并且还更新了第一部分,在更详细地阅读了问题以查看您正在寻找的原因之后后面的发布商店与 x86 上的 seq_cst 不同,但与 ARM 不同。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多