在 x86-64 上,系统崩溃时“movnti”或“movntdq”指令是原子的吗?

问题描述

当使用像 Intel optane DCPMM 这样的持久内存时,如果在执行 movnt 指令时系统崩溃(断电),是否可以在重启后看到部分结果?

对于:

  • 4 或 8 字节 movnti 哪个 x86 保证原子用于其他目的?
  • 16 字节 SSE movntdq / movntps 不能保证原子性,但实际上可能在支持持久内存的 CPU 上使用。
  • 32 字节 AVX vmovntdq / vmovntps
  • 64 字节 AVX512 vmovntdq / vmovntps 全线商店
  • 额外问题:MOVDIR64B 在支持它和 DC-PM 的未来 CPU 上保证了 64 字节写入原子性。例如Sapphire Rapids Xeon / Tiger Lake / Tremont

movntpd 被假定为与 movntps 相同。


相关问题:

解决方法

x86 上的全局可观察性和持久性的原子性保证是相同的。这意味着以下操作是持久原子的:

  • 不跨越 8 字节边界到任何有效内存类型的位置的存储 uop,以及
  • MOVDIR64B

此外,以下操作是持久原子的:

  • 缓存行刷新(CLFLUSHCLFLUSHOPT),
  • 缓存行写回 (CLWB) 和
  • 非架构缓存行逐出。
  • 英特尔处理器上的完整写入组合缓冲区刷新。 WCB 的存在和大小以及刷新的原因是特定于实现的。请参阅:Ordering of Intel non-temporal stores to the same cache line

其他一切都没有架构持久原子性保证,包括 64 字节 AVX512 vmovntdq / vmovntps 全线存储。

这些保证适用于异步 DRAM 刷新 (ADR) 平台和增强型异步 DRAM 刷新 (eADR) 平台。 (在 eADR 上,缓存层次结构位于持久性域中。请参阅:Build Persistent Memory Applications with Reliability Availability and Serviceability.

这个答案基于我与 Andy Rudoff(英特尔)的私人通信。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...