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

dan*_*zzz 5 sse x86-64 atomic cpu-architecture persistent-memory

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

为了:

  • 4 或 8 字节movntix86 保证原子用于其他目的?
  • 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


相关问题:

Had*_*ais 4

以下操作保证是持久原子的:

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

请注意,英特尔 SDM V3 第 8.1.1 节中提到的所有原子保证都适用于持久内存。

此外,以下操作始终是原子的:

vmovntdq对于其他所有内容(包括 64 字节 AVX512 /vmovntps全线存储),没有架构上的持久原子性保证。

这些保证适用于异步 DRAM 刷新 (ADR) 平台和增强型异步 DRAM 刷新 (eADR) 平台。(在 eADR 上,缓存层次结构位于持久性域中。请参阅:构建具有可靠性、可用性和可服务性的持久性内存应用程序。

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

  • 我想澄清哈迪的答案,它说缓存行刷新始终是原子的。Hadi 是正确的,缓存行是与 x86 上的 pmem 通信的单元,但如果您使用多个指令来设置缓存行中的值,则随时可能发生驱逐,从而仅使部分更新持久化。如果不使用 TSX 之类的东西,就不会强制缓存行保持未写入状态,直到您准备好写入为止。直到 MOVDIR64B 可用后,您才能真正使用一条指令持久保存 64 字节。 (2认同)
  • @andy我不知道你有一个SO帐户!感谢您的澄清。我认为,即使对于单个指令,如果该指令被解码为多个存储微指令,那么这些存储对于退休而言只是原子的,而不是全局可观察性或持久性。这就是为什么我在答案中使用术语“store uop”,而不是使用“store”之类的含糊不清的东西。 (2认同)