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