【问题标题】:On x86-64, is the “movnti” or "movntdq" instruction atomic when system crash?在 x86-64 上,系统崩溃时“movnti”或“movntdq”指令是原子指令吗?
【发布时间】:2021-01-04 05:37:46
【问题描述】:

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

为:

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

movntpd 假定与movntps 相同。


相关问题:

【问题讨论】:

  • @Peter Cordes 非常感谢您的专业编辑和回答!
  • 尽管clflush 本身显然是原子的,但它仍然不能保证将两个独立的存储粘合在一起成为一个原子持久性。在 clflush 之前仍然可以承诺持久性,然后系统崩溃。所以我对那个相关问题(这是后续问题)的评论仍然有些准确和相关:当目标是以原子方式将内容写入持久存储时,它不会那样工作。跨度>
  • @Peter Cordes 你的意思是不是因为cache line eviction什么的,前一个write可能在clflush之前变得持久化?两个独立的store不能原子持久化,但是它们持久化的顺序不会改变对吧?
  • 哦,对了,我忘了排序,而不是原子性,才是你真正关心的问题。如果一行内的拆分或无序回写是不可能的(无论是通过 clflush 还是其他方式,例如在两个存储之后但在 clflush 之前中断,导致驱逐),那么是的,全局可观察性顺序应该适用于写入的持久性顺序在同一缓存行内。这就是我所期望的情况,但文档留下了重新排序的可能性。幸运的是,哈迪确认现实符合预期。

标签: x86-64 atomic cpu-architecture sse persistent-memory


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我想澄清一下哈迪的回答,它说缓存行刷新是持久原子的。 Hadi 认为缓存行是 x86 上与 pmem 通信的单元是正确的,但是如果您使用多条指令来设置缓存行中的值,则可能随时发生驱逐,这只会使您的更新的一部分持久化。如果不使用 TSX 之类的东西,在您准备好写入之前,没有任何东西会强制缓存行保持未写入状态。直到 MOVDIR64B 可用,您才能真正使用一条指令持久地持久化 64 个字节。
  • @andy 我不知道你有一个 SO 帐户!感谢您的澄清。我认为即使对于单个指令,如果该指令被解码为多个存储微指令,那么这些存储在退休方面只是原子的,而不是全局可观察性或持久性。这就是为什么我在回答中使用了“store uop”这个词,而不是使用“store”之类的模棱两可的词。
猜你喜欢
  • 2021-04-02
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多