假设没有非时间指令,“xchg”是否包含“mfence”?

Does `xchg` encompass `mfence` assuming no non-temporal instructions?

我已经看过 and this answer,但在没有非时间指令的假设下,mfencexchg的等价或不等价似乎都不清楚和明确.

英特尔instruction reference for xchg mentions that this instruction is useful for implementing semaphores or similar data structures for process synchronization, and further references Chapter 8 of Volume 3A。该参考说明如下。

For the P6 family processors, locked operations serialize all outstanding load and store operations (that is, wait for them to complete). This rule is also true for the Pentium 4 and Intel Xeon processors, with one exception. Load operations that reference weakly ordered memory types (such as the WC memory type) may not be serialized.

mfence 文档声明如下。

Performs a serializing operation on all load-from-memory and store-to-memory instructions that were issued prior the MFENCE instruction. This serializing operation guarantees that every load and store instruction that precedes the MFENCE instruction in program order becomes globally visible before any load or store instruction that follows the MFENCE instruction. 1 The MFENCE instruction is ordered with respect to all load and store instructions, other MFENCE instructions, any LFENCE and SFENCE instructions, and any serializing instructions (such as the CPUID instruction). MFENCE does not serialize the instruction stream.

如果我们忽略弱排序的内存类型,xchg(这意味着 lock)是否包含 mfence 关于内存排序的所有保证?

假设您不是在编写设备驱动程序(因此所有内存都是回写,而不是弱顺序写组合),那么是的 xchgmfence 一样强。

北领地商店都可以。

我确定当前硬件就是这种情况,并且相当确定所有未来 x86 CPU 的手册中的措辞都保证了这一点。 xchg 是一个非常强大的全内存屏障。

嗯,我还没有看过预取指令的重新排序。这可能与性能有关,甚至可能与奇怪的设备驱动程序情况下的正确性有关(在您可能不应该使用可缓存内存的情况下)。


来自您的引述:

(P4/Xeon) Load operations that reference weakly ordered memory types (such as the WC memory type) may not be serialized.

这就是 xchg [mem]mfence 弱的一件事(在 Pentium4 上?可能也在 Sandybridge 系列上)。

mfence确实保证了这一点,这就是Skylake必须加强它来修复错误的原因。 (Are loads and stores the only instructions that gets reordered?, and also the answer you linked on )

NT 存储由 xchg / lock 序列化,只有弱顺序加载可能无法序列化。 您不能从 WB 内存进行弱排序加载movntdqa xmm, [mem] WB 内存仍然是强顺序的(并且在当前的实现中,也忽略了 NT 提示而不是做任何事情来减少缓存污染)。


看起来 xchg 对于 seq-cst 存储的性能优于当前 CPU 上的 mov+mfence,因此您应该在正常代码中使用它。 (你不能不小心映射 WC 内存;普通操作系统总是会给你 WB 内存进行正常分配。WC 仅用于视频 RAM 或其他设备内存。)


这些保证是根据英特尔微体系结构的特定系列指定的。如果我们可以为未来的 Intel 和 AMD CPU 提供一些共同的 "baseline x86" 保证,那就太好了。

我假设但没有检查 xchgmfence 情况在 AMD 上是否相同。我确信使用 xchg 作为 seq-cst 存储没有正确性问题,因为 gcc 以外的编译器实际上是这样做的。