首页 文章

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

提问于
浏览
5

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

英特尔instruction reference for xchg 提到该指令对于实现用于进程同步的信号量或类似数据结构非常有用,并且进一步引用了Volume 3A的第8章 . 该参考文献陈述如下 .

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

mfence 文件声称如下 .

对MFENCE指令之前发出的所有内存加载和存储到内存指令执行序列化操作 . 此序列化操作保证在遵循MFENCE指令的任何加载或存储指令之前,按程序顺序在MFENCE指令之前的每个加载和存储指令都变为全局可见 . 1 MFENCE指令针对所有加载和存储指令,其他MFENCE指令,任何LFENCE和SFENCE指令以及任何序列化指令(例如CPUID指令)进行排序 . MFENCE不会序列化指令流 .

如果我们忽略弱有序的内存类型, does xchg (which implies lock) encompass all of mfence's guarantees with respect to memory ordering?

1 回答

  • 4

    Assuming you're not writing a device-driver (所以所有内存都是回写,而不是弱排序的Write-Combining),然后 yes xchg is as strong as mfence.

    NT商店很好 .

    我确信在当前的硬件上就是这种情况,并且相当确定这是由所有未来x86 CPU的手册中的措辞保证的 . xchg 是一个非常强大的完整内存屏障 .

    嗯,我没有看过预取指令重新排序 . 这可能与性能有关,甚至可能与奇怪的设备驱动程序情况相关(当你可能不应该使用可缓存的内存时) .


    从你的报价:

    (P4 / Xeon)引用弱有序存储器类型(例如WC存储器类型)的加载操作可能无法序列化 .

    这是使 xchg [mem] 弱于 mfence 的一件事(在Pentium4上?可能还在Sandybridge家族) .

    mfence 确实保证,这就是为什么Skylake必须加强它以修复错误 . (Are loads and stores the only instructions that gets reordered?,以及您在Does lock xchg have the same behavior as mfence?上链接的答案)

    NT存储由 xchg / lock 序列化,它只是弱序的负载,可能无法序列化 . You can't do weakly-ordered loads from WB memory . WB内存上的 movntdqa xmm, [mem] 仍然是强排序的(在当前实现中,也忽略了NT提示而不是做任何事情来减少缓存污染) .


    对于seq-cst存储, xchg 在当前CPU上的性能优于 mov mfence ,因此您应该在普通代码中使用它 . (您不能意外映射WC内存;正常操作系统将始终为您提供正常分配的WB内存.WC仅用于视频RAM或其他设备内存 . )


    这些保证是根据英特尔微体系结构的特定系列指定的 . 如果有一些常见的“基线x86”保证我们可以假设未来的Intel和AMD CPU,那将是很好的 .

    我假设但是没有检查过AMD的 xchgmfence 情况是否相同 . 我使用 xchg 作为seq-cst商店没有正确性问题,因为这是gcc以外的编译器实际上做的事情 .

相关问题