x86 存储指令的强度 wrt。 SC-DRF?

The strong-ness of x86 store instruction wrt. SC-DRF?

我阅读了 Herb 的原子<>武器谈话,并对第 42 页有疑问:

他提到(video 中的 50:00):

(x86) stores are much stronger than they need to be...

我不明白的是:如果图表上的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, 和其他语言, 提供这个。)

是的,他在那里展示 xchg(完全障碍和 RMW 操作),而不仅仅是 mov 商店 - 普通 mov 将低于 SC-DRF 栏,因为如果没有 mfence 或其他障碍,它本身不会提供顺序一致性。

比较 ARM64 stlr / ldar - 它们不能相互重新排序(甚至不能是 StoreLoad),但是 stlr 可以与其他后续操作一起重新排序,当然除了其他发布存储操作或一些栅栏。 (就像我在回答 ). See also re: interaction with ldar for SC vs. ldapr for just acquire / release or acq_rel. Also 时提到的 AArch64 如何编译的另一个例子(没有 ARMv8.3 LDAPR)。


但是 x86 seq_cst 存储当场耗尽存储缓冲区,即使在同一线程中没有稍后 seq_cst 加载、存储或 RMW.这种缺乏对后来的非 SC 或非原子 loads/stores 重新排序的原因使它比必要的更强大(也更昂贵)。

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

(旁注:就在 36:00 左右,他说错了:他说“我们不会使用这前 3 个保证”(x86 不会重新排序加载与加载或存储商店,或具有较旧负载的商店)。但这些保证是为什么 SC 负载可以只是一个普通的 mov。这就是为什么如他所说,lfencesfence与 std::atomic 无关。)


所以无论如何,ARM64 可以在没有额外屏障指令的情况下达到最佳效果,对于 seq_cst 来说足够强大,但没有更强。 (具有 ldapr 的 ARMv8.3 略强于 acq_rel 的要求,例如 ARM64 仍然禁止 IRIW 重新排序,但

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