"xchg"是否包含假设没有非时间指令的"mfence"?



我已经看到了这个答案和这个答案,但似乎都没有明确和明确地说明在没有非时间指令的假设下mfencexchg的等价或不等价。

英特尔xchg指令参考提到,此指令对于实现信号量或类似的数据结构以实现进程同步非常有用,并进一步参考了第 3A 卷第 8 章。该参考资料陈述如下。

对于 P6 系列处理器,锁定操作将序列化所有 未完成的加载和存储操作(即,等待它们 完成(。此规则也适用于奔腾 4 和英特尔至强 处理器,但有一个例外。加载弱引用的操作 有序内存类型(如 WC 内存类型(可能不是 序列 化。

mfence文档声明以下内容。

对所有从内存加载执行序列化操作,并且 在 MFENCE 之前发出的存储到内存指令 指令。此序列化操作保证每个加载和 在程序中存储 MFENCE 指令之前的指令 订单在任何加载或存储指令之前变得全局可见 遵循MFENCE指令。1 MFENCE 指令是 订购的所有装载和存储指令,其他MFENCE 指令、任何 LFENCE 和 SFENCE 指令以及任何序列化 指令(例如 CPUID 指令(。MFENCE没有 序列化指令流。

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

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

NT商店很好。

我确信当前硬件就是这种情况,并且相当确定所有未来 x86 CPU 手册中的措辞可以保证这一点。xchg是一个非常强大的完整记忆屏障。

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

(。

从您的报价中:

(

P4/至强(引用弱序内存类型(如 WC 内存类型(的加载操作可能不会序列化。

这就是使xchg [mem]mfence弱的一件事(在奔腾4上? 可能也在桑迪布里奇家族(。

mfence确实保证了这一点,这就是为什么Skylake必须加强它来修复勘误表的原因。 (加载和存储是唯一被重新排序的指令吗?,以及你链接的答案 锁定 xchg 与 mfence 的行为相同吗?

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


看起来xchg在当前 CPU 上比mov+mfence在 seq-cst 存储中表现更好,因此您应该在普通代码中使用它。 (您不会意外映射 WC 内存;正常的操作系统将始终为您提供 WB 内存以进行正常分配。 WC 仅用于视频 RAM 或其他设备内存。


这些保证是根据英特尔微架构的特定家族指定的。 如果我们可以为未来的英特尔和AMDCPU假设一些常见的"基准x86"保证,那就太好了。

我假设但没有检查xchg与。mfenceAMD上的情况是一样的。 我确信使用xchg作为 seq-cst 存储没有正确性问题,因为这就是 gcc 以外的编译器实际所做的。

最新更新