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

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

我读到了 Herb 的原子<>武器演讲,并对第 42 页有一个疑问:

他提到(50:00 video):

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

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

( SC-DRF 是无数据争用程序的顺序一致执行的保证,只要它们不使用任何顺序弱于 std::memory_order_seq_cst 的原子即可。ISO C++ 和 Java和其他语言,提供此。)

最佳答案

是的,他正在显示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 )。

关于c++ - x86 存储指令的强度。 SC-DRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70249647/

相关文章:

c++ - std::set 中的函数和方法指针

c++ - 捕获命名空间限定的异常

operating-system - 什么是 "Logical CPU Core"

caching - 回写式缓存与直写式缓存?

c# - 线程安全类是否应该在其构造函数的末尾设置内存屏障?

c++ - 更新具有更大值的数组元素最少需要哪些内存屏障?

c++ - 调用 glGenFramebuffers() 时出现段错误?

缓存未命中和缓存命中

linux - 了解 Linux 内核循环缓冲区

c++ - 如何在 MAC OS c/c++ 中阻止 USB 存储设备