作者:伊人憔悴儡 | 来源:互联网 | 2022-12-06 20:13
我已经看到这个答案和这个答案,但也显得清晰和明确有关的等价或不等价mfence
和xchg
没有非时间指示的假设下.
英特尔指令参考对于xchg
提到这个指令是用于实现信号量或进程同步相似的数据结构有用,和其它参考文献的第8章卷3A.该参考文献陈述如下.
对于P6系列处理器,锁定操作会序列化所有未完成的加载和存储操作(即等待它们完成).对于奔腾4和英特尔至强处理器,此规则也是如此,但有一个例外.引用弱有序内存类型(例如WC内存类型)的加载操作可能无法序列化.
该mfence
文件声称如下.
对MFENCE指令之前发出的所有内存加载和存储到内存指令执行序列化操作.此序列化操作保证在遵循MFENCE指令的任何加载或存储指令之前,按程序顺序在MFENCE指令之前的每个加载和存储指令都变为全局可见.1 MFENCE指令针对所有加载和存储指令,其他MFENCE指令,任何LFENCE和SFENCE指令以及任何序列化指令(例如CPUID指令)进行排序.MFENCE不会序列化指令流.
如果我们忽略弱有序的内存类型,xchg(暗示lock
)是否包含了关于内存排序的所有mfence保证?
1> Peter Cordes..:
假设您没有编写设备驱动程序(因此所有内存均为Write-Back,而不是弱排序的Write-Combining),则yes xchg
与一样强mfence
。
NT商店很好。
我确信当前的硬件就是这种情况,并且可以肯定的是,所有将来的x86 CPU手册中的措辞都可以保证这一点。 xchg
是一个非常强大的完整内存屏障。
嗯,我还没看过预取指令的重新排序。这可能与性能有关,甚至在怪异的设备驱动程序情况下(甚至在您本不应该使用可缓存内存的情况下)也可能与正确性有关。
从您的报价:
(P4 / Xeon)引用弱排序的内存类型(例如WC内存类型)的加载操作可能无法序列化。
那是使它变得更xchg [mem]
弱的一件事mfence
(在Pentium4上?也许也在Sandybridge系列上)。
mfence
确实保证了这一点,这就是为什么Skylake必须加强它以解决错误。(是否仅加载和存储了要重新排序的指令?以及您链接的答案是否与锁xchg的行为与mfence相同?)
NT存储区由xchg
/ 序列化lock
,它只是弱序列化的负载,可能无法序列化。 您不能从WB内存进行弱排序的加载。 movntdqa xmm, [mem]
WB内存上的内存仍然是有序的(在当前的实现中,它也忽略了NT提示,没有采取任何措施来减少缓存污染)。
xchg
在seq-cst存储上,它看起来比在当前CPU上的mov
+ 性能更好mfence
,因此应在普通代码中使用它。(您不能意外地映射WC内存;正常的操作系统始终会为您提供WB内存以进行正常分配。WC仅用于视频RAM或其他设备内存。)
这些保证是根据特定的英特尔微体系结构系列指定的。如果我们可以为将来的Intel和AMD CPU承担一些通用的“基准x86”保证,那就太好了。
我假设但尚未检查AMD上的xchg
vs. mfence
情况是否相同。我敢肯定,xchg
用作seq-cst存储区不会有正确性问题,因为那是gcc以外的编译器实际所做的。