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

标签 x86-64 atomic

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

最佳答案

是的,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 操作在某些硬件上也是原子操作,但没有标准方法来检测这一点)。

关于x86-64 - 在 x86-64 上, "movnti"指令是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18604041/

相关文章:

c - 在 Linux 内核中混合汇编和 C 函数 - x64 模式

x86 - 使用和不使用 IO 位图创建适当的任务状态段 (TSS) 结构?

c - 这个 128 位整数乘法在汇编 (x86-64) 中如何工作?

C 编译器能否生成指针为 32 位的 64 位可执行文件?

c++ - 有什么方法可以从文件 C++ 中自动读取一行

c++ - C 和 C++ 原子之间的互操作性

performance - 原子操作在 warp 不同地址上的 CUDA 性能

multithreading - ARM STLR 内存排序语义

gcc - 构建交叉编译 64 位 GCC 失败

c++ - CUDA:所有 vector 元素的级联求和