【问题标题】:The strong-ness of x86 store instruction wrt. SC-DRF?x86 存储指令的强度。 SC-DRF?
【发布时间】:2022-01-11 21:46:48
【问题描述】:

我读到 Herb 的 atomic Weapons talk 并有一个关于第 42 页的问题:

他提到(50:00 在video):

(x86) 商店比他们需要的强大得多......

我不明白的是:如果图表上的x86“S”是一个普通的商店,即mov,我认为它并不比SC-DRF强,因为它是只有一个发布商店加上总商店订单(这就是为什么你需要一个xchg 用于 SC 商店)。但如果它意味着一个 SC 商店,即xchg,它应该落在“完全 SC”栏上,因为它实际上是一个完整的障碍。 我应该如何看待这个 x86 "S" 在图表上的强项?

(SC-DRF 是 Data Race Free 程序的顺序一致执行的保证,只要它们不使用任何顺序低于std::memory_order_seq_cst 的原子。ISO C++ 和 Java 以及其他语言都提供了这一点。 )

【问题讨论】:

  • 什么是 SC-DRF?
  • @ThomasMatthews 代表“无数据竞争程序的顺序一致性”。您可以观看 Herb 的“原子武器”讲座以了解更多信息。

标签: c++ cpu-architecture memory-barriers stdatomic memory-model


【解决方案1】:

是的,他在那里显示 xchg(完全屏障和 RMW 操作),而不仅仅是 mov 存储 - 一个普通的 mov 将在 SC-DRF 栏下方,因为它不提供顺序一致性它自己没有mfence 或其他障碍。

比较 ARM64 stlr / ldar - 它们不能相互重新排序(甚至 StoreLoad 也不行),但 stlr 可以 与其他后续操作重新排序,当然其他版本除外- 商店操作,或一些栅栏。 (就像我在回答your previous question 时提到的那样)。另请参阅Does STLR(B) provide sequential consistency on ARM64? 回复:与ldar 的 SC 与 ldapr 的交互仅用于 acquire / releaseacq_rel。另外Possible orderings with memory_order_seq_cst and memory_order_release 是另一个关于 AArch64 如何编译的示例(没有 ARMv8.3 LDAPR)。


但 x86 seq_cst 存储会立即耗尽存储缓冲区,即使同一线程中没有稍后的 seq_cst 加载、存储或 RMW。这种缺乏对后来的非 SC 或非原子加载/存储进行重新排序的原因使其变得比必要的更强大(也更昂贵)。

Herb Sutter 在视频前面的 at around 36:00 中对此进行了解释。他指出xchg 比必要的更强大,而不仅仅是一个 SC 版本,它可以单向重新排序与以后的非 SC 操作。 “所以我们这里的东西,是矫枉过正。比必要的强得多”在 36:30

(旁注:就在 36:00 左右,他说错了:他说“我们不会使用前 3 个保证”(x86 不会重新排序加载和存储,或存储旧负载)。但这些保证就是为什么 SC 负载可以只是简单的movSame for acq/rel being just plain mov for both load and store。这就是为什么正如他所说,lfencesfence 与 std::atomic 无关。)


所以无论如何,ARM64 可以在没有额外屏障指令的情况下达到最佳状态,对于 seq_cst 来说足够强大,但不会更强大。 (带有ldapr 的ARMv8.3 比acq_rel 要求的稍强,例如ARM64 仍然禁止IRIW 重新排序,但only a few machines can do that in practice, notably POWER

其他 L 和 S 都低于标准的 ISA 需要额外的屏障作为其 seq_cst 加载和 seq_cst 存储配方的一部分 (https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html)。

【讨论】:

  • 感谢您的解释。我想我得到了“他们比他们需要的更强大”的部分。我最后的困惑是,如果我们谈论的是xchg,它不会在图表的最顶端,即完全是 SC 吗?
  • @zanmato: 是的,我不知道为什么 x86 xchg 不能在顶部有栅栏的地方,完全是 SC。好点子。它与大多数 C++ 实现使用的 atomic_thread_fence(seq_cst)lock addl $0, (%rsp) 一样强大。 (xchg is equivalent to mfence for everything except weakly-ordered movntdqa loads from WC memory on some microarchitectures。但是 std:atomic 让程序员在使用弱排序存储后手动 sfence 或 mfence,并且许多实现确实对 atomic_thread_fence 使用锁定操作,而不是 mfence)。
  • 谢谢彼得。一如既往的出色回答和跟进!
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多