热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《假设没有非时间指令,`xchg`是否包含`mfence`?》经验,为你挑选了1个好方法。

我已经看到这个答案和这个答案,但也显得清晰和明确有关的等价或不等价mfencexchg没有非时间指示的假设下.

英特尔指令参考对于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上的xchgvs. mfence情况是否相同。我敢肯定,xchg用作seq-cst存储区不会有正确性问题,因为那是gcc以外的编译器实际所做的。


推荐阅读
author-avatar
伊人憔悴儡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有