在x86-64上,“movnti”指令是原子的吗?

时间:2013-09-04 01:30:46

标签: x86-64 atomicity

在x86-64 CPU(Intel或AMD)上,是“movnti”指令,它将4/8字节写入32/64位对齐的地址原子?

2 个答案:

答案 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访问(例如movapsmovntps 16B / 32B / 64B向量存储),这些访问不是保证原子的。 (甚至16B操作都是原子的,在某些硬件上,但是没有标准的方法来检测它)。

答案 1 :(得分:0)

似乎显然不是:

  

由于WC协议使用弱排序的内存一致性模型,如果多个处理器可能使用不同的内存类型来读取/写入内存位置,则应使用诸如SFENCE之类的防护操作与MOVNTI指令一起使用。