微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么“movnti”后跟“sfence”可以保证持续排序?

如何解决为什么“movnti”后跟“sfence”可以保证持续排序?

SFENCE prevents NT stores from committing from the store buffer ahead of SFENCE itself.

NT store data enters an LFB directly from the store buffer.

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

例如

movnti;
sfence;
movnti to another address;

这里的SFENCE只能保证第一个NT存储会比下一个更早提交到LFB。但是,由于 LFB 是不稳定的,因此数据尚未持久化。进入LFB的数据会按照进入的顺序持久化吗?

解决方法

sfence 确保程序顺序中所有较早的存储在程序顺序中的任何较晚存储变为全局可观察之前成为全局可观察的。此处的存储包括数据存储 uops、clflushclflushoptclwbmovdirimovdir64b

GO 的要点取决于以下所有因素:

  • 操作类型,
  • 非时间性提示的存在,
  • 目标内存位置的内存类型,
  • 映射到目标内存地址的设备,以及
  • 微架构。

例如,在现代英特尔服务器处理器上,没有 NT 提示的普通数据存储 uop 目标是映射到主内存的 WB 类型的内存位置,当目标缓存行从内存中提取时,如果目标缓存行尚未存在于L1D 处于合适的一致性状态并将存储提交到缓存。这就是为什么在英特尔 CSX 等异步 DRAM 刷新 (ADR) 平台上,sfence 本身并不能保证持久性。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。