如何解决在 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
。
此外,以下操作是持久原子的:
- 缓存行刷新(
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(英特尔)的私人通信。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。