繁体   English   中英

在 x86 上获取发布

[英]Acquire-release on x86

在英特尔手册第 3 卷中,有一个使用早期商店重新排序负载的示例。

最初x = y = 0

核心1

mov [x], 1
mov r2, [y]

核心2

mov [y], 1
mov r1, [x]

所以r1 = r2 = 0是可能的。 问题是要求获取释放是否禁止这种情况? 在 x86 商店是发布商店,所以我认为没有。 例子:

核心1

release(mov [x], 1)
mov r2, [y]

核心2

mov [y], 1
acquire(mov r1, [x])

在这种情况下,如果acquire(mov r1, [x])加载观察 0,那么就只能得出结论release(mov [x], 1)acquire(mov r1, [x])同步C11 标准 memory model 规范立场,它不提供任何可以禁止在核心 2上重新排序mov [y], 1acquire(mov r1, [x])的保证

正确,获取/释放语义不能阻止 StoreLoad 重新排序,即先存储,然后加载并交换它们的顺序。 对于 x86 上的普通加载和存储指令,这种重新排序是允许的。

如果要避免在 C11 中进行此类重新排序,则需要在存储和加载上都使用memory_order_seq_cst 在 x86 程序集中,您需要在两条指令之间设置屏障。 mfence用于此目的,但任何lock ed read-modify-write 指令也是如此,包括xchg即使没有lock前缀也会这样做。 因此,如果您查看为memory_order_seq_cst操作生成的程序集,您会在两者之间看到一些这样的障碍。 (由于某些原因,某些寄存器和 memory 之间的lock add [rsp], 0xchg之类的内容并不重要,实际上可能比mfence性能更高,因此即使看起来很奇怪,一些编译器也会这样做。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM