在x86-64上,是“;Moventi”;或;movntdq“;系统崩溃时的指令原子?
当使用诸如Intel optane DCPMM之类的持久性内存时,如果执行movnt指令时系统崩溃(断电),是否可能在重新启动后看到部分结果 用于:在x86-64上,是“;Moventi”;或;movntdq“;系统崩溃时的指令原子?,x86-64,atomic,cpu-architecture,sse,persistent-memory,X86 64,Atomic,Cpu Architecture,Sse,Persistent Memory,当使用诸如Intel optane DCPMM之类的持久性内存时,如果执行movnt指令时系统崩溃(断电),是否可能在重新启动后看到部分结果 用于: 4或8字节movinti哪种x86保证用于其他目的的原子 16字节SSEmovntdq/movntps,不保证是原子的,但实际上可能在支持持久内存的CPU上 32字节AVXvmovntdq/vmovntps 64字节AVX512vmovntdq/vmovntps全线存储 附加问题:它保证了64字节写入原子性,在支持它和DC-PM的未来CPU上。e
- 4或8字节
哪种x86保证用于其他目的的原子movinti
- 16字节SSE
/movntdq
,不保证是原子的,但实际上可能在支持持久内存的CPU上movntps
- 32字节AVX
/vmovntdq
vmovntps
- 64字节AVX512
/vmovntdq
全线存储vmovntps
- 附加问题:它保证了64字节写入原子性,在支持它和DC-PM的未来CPU上。e、 g
movntpd
与movntps
相同
相关问题:
- 对
- 不跨越8字节边界到任何有效内存类型位置的存储uop,以及
MOVDIR64B
- 缓存线刷新(
或CLFLUSH
)CLFLUSHOPT
- 缓存线写回(
),以及CLWB
- 非体系结构缓存线逐出
- 英特尔处理器上的完全写入组合缓冲区刷新。WCB的存在和大小以及刷新的原因是特定于实现的。请参阅:
vmovntdq
/vmovntps
全线存储,没有体系结构的持久原子性保证
这些保证适用于异步DRAM刷新(ADR)平台和增强型异步DRAM刷新(eADR)平台。(在eADR上,缓存层次结构位于持久性域中。请参阅:)
此答案基于我与Andy Rudoff(英特尔)的私人通信。@Peter Cordes非常感谢您的专业编辑和回答!尽管
clflush
本身显然是原子的,但它仍然不能保证将两个单独的存储粘合到一个原子持久性中;在clflush之前仍然可以提交持久性,然后系统崩溃。因此,我对这个相关问题的评论(这是一个后续问题)仍然有点准确和相关:当目标是以原子方式将内容写入持久性存储时,它不会像这样工作。@Peter Cordes您的意思是,由于缓存线逐出或其他原因,前一次写入可能在clflush之前变为持久性吗?两个单独的存储不能以原子方式持久化,但是他们坚持的顺序不会改变,对吗?哦,对了,我忘记了顺序,不是原子性,是你真正关心的。如果无法在一行内进行拆分或无序写回(无论是通过clflush还是其他方式,例如在两个存储之后但在clflush之前中断,从而导致逐出),则全局可观测性顺序应适用于同一缓存线内写入的持久性顺序。这正是我所期望的情况,但文档保留了重新排序的可能性。幸运的是,Hadi得到了现实与预期相符的确认。我想澄清Hadi的答案,它说缓存线刷新始终是原子的。Hadi认为缓存线是与x86上的pmem通信的单元,这是正确的,但是如果您使用多条指令来设置缓存线中的值,则随时都可能发生逐出,这只会使更新的一部分持久化。如果不使用TSX之类的工具,在您准备写入缓存线之前,不会强制缓存线保持未写入状态。直到MOVDIR64B可用,你才能用一条指令永久保存64字节。@andy我不知道你有一个SO帐户!谢谢你的澄清。我认为,即使对于一条指令,如果该指令被解码成多个存储UOP,那么这些存储就失效而言只是原子的,而不是全局可观测性或持久性。这就是为什么我在回答中使用术语“存储uop”,而不是使用诸如“存储”之类模棱两可的词