在x86-64 CPU(Intel或AMD)上,是“movnti”指令,它将4/8字节写入32/64位对齐的地址原子?
答案 0 :(得分:3)
是的,movnti
在自然对齐的地址just like all other naturally-aligned 8/16/32/64b stores (and loads) on x86上是原子的。无论内存类型如何(写回,写入组合,不可缓存等),这都适用。请参阅英特尔x86手册中有关保证措辞的链接。
请注意,原子性与内存排序是分开的。正常的x86存储是release-store操作,但是movnt存储是“放松”的。
有趣的事实:32位代码可以使用x87(fild
/ fistp
)或SSE / MMX movq
来执行原子64位加载/存储。 gcc的std::atomic
实现实际上是这样做的。它只是大于8B的SSE访问(例如movaps
或movntps
16B / 32B / 64B向量存储),这些访问不是保证原子的。 (甚至16B操作都是原子的,在某些硬件上,但是没有标准的方法来检测它)。
答案 1 :(得分:0)
似乎显然不是:
由于WC协议使用弱排序的内存一致性模型,如果多个处理器可能使用不同的内存类型来读取/写入内存位置,则应使用诸如SFENCE之类的防护操作与MOVNTI指令一起使用。