X86 为什么“;Moventi”;后跟一个“;sfence&x201D;保证持久有序?;

X86 为什么“;Moventi”;后跟一个“;sfence&x201D;保证持久有序?;,x86,cpu-architecture,memory-barriers,persistent-memory,X86,Cpu Architecture,Memory Barriers,Persistent Memory,因此,SFENCE只能保证进入LFB的数据的顺序 比如说, movnti; sfence; movnti to another address; 这里的SFENCE只能保证第一个NT存储将比下一个更早地提交到LFB。然而,由于LFB是易变的,数据还没有被持久化。输入LFB的数据是否会按输入的顺序保存?sfence确保在程序顺序中的任何后续存储变为全局可观察之前,程序顺序中的所有早期存储变为全局可观察。这里的存储包括数据存储UOP、clflush、clflushopt、clwb、movdiri和

因此,SFENCE只能保证进入LFB的数据的顺序

比如说,

movnti;
sfence;
movnti to another address;

这里的SFENCE只能保证第一个NT存储将比下一个更早地提交到LFB。然而,由于LFB是易变的,数据还没有被持久化。输入LFB的数据是否会按输入的顺序保存?

sfence
确保在程序顺序中的任何后续存储变为全局可观察之前,程序顺序中的所有早期存储变为全局可观察。这里的存储包括数据存储UOP、
clflush
clflushopt
clwb
movdiri
movdir64b

出发点取决于以下所有因素:

  • 操作类型
  • 非时间暗示的存在
  • 目标内存位置的内存类型
  • 映射到目标内存地址的设备,以及
  • 微体系结构
例如,在现代Intel服务器处理器上,如果目标缓存线在L1D中尚未以适当的一致性状态存在,则当从内存中提取目标缓存线时,一个正常的数据存储uop(不带NT提示,目标为映射到主内存的WB类型的内存位置)将到达GO,并且存储将提交到缓存。这就是为什么在Intel CSX等异步DRAM刷新(ADR)平台上,
sfence
本身不能保证持久性


关于您要询问的特定示例,
movnti
是一个带有NT提示的数据存储指令。假设目标地址映射到ADR平台上的主存,则此指令的全局可观测点与持久性域的第一个点相同。因此,在使用NVDIMM的任何Intel或AMD平台上,无论内存类型如何,都可以保证在任何后续存储变为永久存储之前,数据位于永久性域中。这是比您所说的更有力的保证(即
sfence
防止以后的存储在以前的存储之前提交),因为提交并不意味着持久性,但持久性只能在提交之后发生。虽然这里最好使用术语“retire”而不是“commit”,因为“retire”在体系结构上是有意义的,表示正在更改线程的状态,但“commit”是一种微体系结构操作,取决于设计。

我不清楚这个问题。你能给出一个示例代码序列来说明这个问题到底是关于什么的吗?@Hadi brash我编辑了这个问题。如果问题中的任何先决知识是错误的,请纠正我,谢谢。您说过“在sfence退役时,数据保证在持久性域中”,但sfence不会强制在退役前耗尽存储缓冲区(Peter Cordes的回答,第6行)。存储缓冲区不是持久性域。Intel的ADR是从iMC(集成内存控制器)开始的,因此当数据进入iMC时,sfence实际上会失效?@dangzzz您链接的答案的某些部分不准确<代码>sfence会耗尽存储缓冲区和WCB。请参阅《英特尔手册》第11.10节和第11.3节。嗯,我想我需要修正我的假设/心智模型,然后重新修改链接的答案。有什么建议吗?(如果是,请对该答案进行评论,或者如果您愿意并且有时间,请进行编辑)。感谢您对链接答案的编辑。因此,第11节的内容似乎是说它耗尽了存储缓冲区,而WCB显然意味着“在下一个存储变得可见之前”,这与SFENCE的退役无关(至少对英特尔来说不是纸面上的)。我心目中的
sfence
作为传送带(存储缓冲区)上的分隔器的模型并不疯狂,这很可能是另一个答案中实验测试的真实机制,该答案显示了存储负载在sfence+LFENCE之间的重新排序。这让我松了一口气。