问题描述
当使用像 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
。
此外,以下操作是持久原子的:
- 缓存行刷新(
CLFLUSH
或CLFLUSHOPT
), - 缓存行写回 (
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(英特尔)的私人通信。