3

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

4

2 回答 2

4

是的,movnti在自然对齐的地址上是原子的,就像 x86 上的所有其他自然对齐的 8/16/32/64b 存储(和加载)一样。这适用于任何内存类型(写回、写组合、不可缓存等)。有关英特尔 x86 手册中保证的措辞,请参阅该链接。

请注意,原子性与内存排序是分开的。普通的 x86 存储是发布存储操作,但 movnt 存储是“宽松的”。

有趣的事实:32 位代码可以使用 x87 ( fild/ fistp) 或 SSE/MMXmovq进行原子 64 位加载/存储。gcc 的std::atomic实现实际上就是这样做的。只有大于 8B 的 SSE 访问(例如movapsmovntps16B/32B/64B 向量存储)不能保证是原子的。(即使 16B 操作在某些硬件上也是原子操作,但没有标准方法可以检测到这一点)。

于 2016-05-26T23:20:20.583 回答
-1

显然不是:

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

于 2013-09-04T01:33:55.390 回答