Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在x86-64上,是“;Moventi”;或;movntdq“;系统崩溃时的指令原子?_X86 64_Atomic_Cpu Architecture_Sse_Persistent Memory - Fatal编程技术网

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

在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

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

用于:

  • 4或8字节
    movinti
    哪种x86保证用于其他目的的原子
  • 16字节SSE
    movntdq
    /
    movntps
    ,不保证是原子的,但实际上可能在支持持久内存的CPU上
  • 32字节AVX
    vmovntdq
    /
    vmovntps
  • 64字节AVX512
    vmovntdq
    /
    vmovntps
    全线存储
  • 附加问题:它保证了64字节写入原子性,在支持它和DC-PM的未来CPU上。e、 g
假定
movntpd
movntps
相同


相关问题:


x86在全局可观察性和持久性方面的原子性保证是相同的。这意味着以下操作始终是原子的:

  • 不跨越8字节边界到任何有效内存类型位置的存储uop,以及
  • MOVDIR64B
此外,以下操作始终是原子的:

  • 缓存线刷新(
    CLFLUSH
    CLFLUSHOPT
  • 缓存线写回(
    CLWB
    ),以及
  • 非体系结构缓存线逐出
  • 英特尔处理器上的完全写入组合缓冲区刷新。WCB的存在和大小以及刷新的原因是特定于实现的。请参阅:
对于其他所有内容,包括64字节AVX512
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”,而不是使用诸如“存储”之类模棱两可的词