我读到了 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
/release
或acq_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 负载可以只是一个简单的 mov
。 Same for acq/rel being just plain mov
for both load and store 。这就是为什么正如他所说, lfence
和 sfence
与 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/