代码之家  ›  专栏  ›  技术社区  ›  merlin2011

“xchg”是否包含“mfence”假定没有非时态指令?

  •  5
  • merlin2011  · 技术社区  · 6 年前

    我已经看到了 this answer this answer ,但两者似乎都没有明确说明 mfence xchg 在没有非时间指令的假设下。

    情报 instruction reference 对于 交换 提到 ,并进一步参考第8章 Volume 3A . 这个参考陈述如下。

    对于P6系列处理器,锁定操作序列化所有 未完成的加载和存储操作(即,等待它们 处理器,只有一个例外。弱引用的加载操作 有序内存类型(例如WC内存类型)可能不是

    这个 使用全栅障

    对内存中的所有加载执行序列化操作,然后 指示。这个序列化操作保证每个加载和 在程序中存储在MFENCE指令之前的指令 顺序在任何加载或存储指令之前变得全局可见 遵循MFENCE指令。1 MFENCE指令是 指令,任何LFENCE和SFENCE指令,以及任何序列化 序列化指令流。

    如果忽略弱序内存类型, lock )包括所有关于内存顺序的mfence保证?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Peter Cordes    6 年前

    假设你没有写设备驱动程序 (所以所有的内存都是写回的,而不是弱顺序的写合并),然后 xchg 就像 mfence

    NT商店很好。

    我确信这是当前硬件上的情况,并且相当肯定这是所有未来x86 CPU手册中的措辞所保证的。 交换 是一个很强的完全记忆障碍。


    从你的报价:

    (P4/Xeon)引用弱顺序内存类型(例如WC内存类型)的加载操作不能序列化。

    这是唯一能让 xchg [mem] 使用全栅障 (在奔腾4上?可能也在Sandybridge家族)。

    使用全栅障 保证这一点,这就是为什么Skylake必须加强它来修复一个错误。( Are loads and stores the only instructions that gets reordered? ,以及您链接到的答案 Does lock xchg have the same behavior as mfence? )

    NT存储被序列化 / lock 不能从WB内存执行弱顺序加载 movntdqa xmm, [mem] 在WB上,内存仍然是强顺序的(在当前的实现中,也忽略NT提示,而不是做任何减少缓存污染的事情)。


    看起来像 交换 对于seq cst stores的性能比 mov 使用全栅障 在当前的CPU上,所以应该在正常代码中使用它。(您不能意外地映射WC内存;正常的os总是为您提供用于正常分配的WB内存。WC仅用于视频RAM或其他设备内存。)


    这些保证是根据英特尔微体系结构的特定系列指定的。如果有一些共同的“基准x86”保证,我们可以为未来的英特尔和AMD CPU设想,那就太好了。

    我想但还没有检查 交换 与。 使用全栅障 AMD的情况也一样。我确信使用 交换