假设您没有编写设备驱动程序(所以所有的内存都是Write-Back,而不是弱序Write-Combining),那么yes xchg
一样强mfence
.
NT店还不错。
我确信当前硬件上就是这种情况,并且相当确信所有未来 x86 CPU 的手册中的措辞都保证了这一点。xchg
是一个非常强大的完整内存屏障。
嗯,我还没有看过预取指令重新排序。这可能与性能有关,甚至可能与奇怪的设备驱动程序情况下的正确性有关(在这种情况下,您可能不应该使用可缓存内存)。
从你的报价来看:
(P4/Xeon) 引用弱排序内存类型(例如 WC 内存类型)的加载操作可能无法序列化。
这就是让xchg [mem]
那么弱mfence
(在 Pentium4 上?可能也在 Sandybridge 系列上)。
mfence
does保证这一点,这就是为什么 Skylake 必须加强它来修复错误。 (加载和存储是唯一需要重新排序的指令吗? https://stackoverflow.com/questions/50494658/are-loads-and-stores-the-only-instructions-that-gets-reordered/50496379#50496379,以及您链接的答案lock xchg 与 mfence 具有相同的行为吗? https://stackoverflow.com/questions/40409297/does-lock-xchg-have-the-same-behavior-as-mfence/50279772#50279772)
NT 商店按以下方式序列化xchg
/ lock
,只有弱排序的负载可能无法序列化。您无法从 WB 内存执行弱排序加载. movntdqa xmm, [mem]
在 WB 内存上仍然是强有序的(并且在当前实现上,也忽略 NT 提示而不是采取任何措施来减少缓存污染)。
看起来像xchg
seq-cst 存储的性能优于mov
+mfence
在当前的 CPU 上,因此您应该在正常代码中使用它。 (您不能意外映射 WC 内存;普通操作系统始终会为您提供 WB 内存以进行正常分配。WC 仅用于视频 RAM 或其他设备内存。)
这些保证是根据英特尔微架构的特定系列指定的。如果我们可以为未来的 Intel 和 AMD CPU 假设一些共同的“基准 x86”保证,那就太好了。
我假设但还没有检查xchg
vs. mfence
AMD 的情况也是一样。我确信使用没有正确性问题xchg
作为 seq-cst 存储,因为这就是 gcc 之外的编译器实际上所做的事情。