SFENCE防止NT store在SFENCE之前从store缓冲区提交。
NT存储数据直接从存储缓冲区进入LFB。
因此SFENCE只能保证进入LFB的数据的顺序。
例如,
movnti;
sfence;
movnti to another address;
这里的SFENCE只能保证第一个NT store将比下一个更早地提交到LFB。然而,由于LFB是不稳定的,数据还没有被持久化。输入LFB的数据会按照输入的顺序被持久化吗?
sfence
确保所有较早的程序顺序store在任何较晚的程序顺序store变为全局可观察之前变为全局可观察。这里的存储包括数据存储uops、clflush
、clflushopt
、clwb
、movdiri
和movdir64b
。
GO的点取决于以下所有条件:
- 操作类型,
- 非时间提示的存在,
- 目标内存位置的内存类型,
- 设备映射到目标内存地址,和
- 微体系结构。
例如,在现代英特尔服务器处理器上,当从内存中取出目标缓存线时,如果L1D中没有以合适的相干状态存在,则没有NT提示的正常数据存储up将映射到主存的WB类型的内存位置到达GO,并且存储被提交到缓存中。这就是为什么在异步DRAM刷新(ADR)平台上,如英特尔CSX,sfence
本身不能保证持久性。
关于您所询问的具体示例,movnti
是带有NT提示的数据存储指令。假设目标地址映射到ADR平台上的主存,则该指令的全局可观察点与持久性域的第一个点相同。因此,在任何带有nvdimm的Intel或AMD平台上,无论内存类型如何,都可以保证在任何后续存储变为持久化之前,数据都位于持久化域中。这是一个比您所说的(sfence
防止较晚的存储在较早的存储之前提交)更强的保证,因为提交并不意味着持久化,但持久化只能在提交之后发生。虽然在这里使用"退休"这个词可能更好;而不是"承诺";因为"retire"在体系结构上是有意义的,并指示更改线程的状态,但要"提交"。是一个微架构操作,取决于设计。