首页 > 后端开发 > C++ > 什么时候应该使用 _mm_sfence、_mm_lfence 和 _mm_mfence?

什么时候应该使用 _mm_sfence、_mm_lfence 和 _mm_mfence?

Susan Sarandon
发布: 2024-11-15 14:44:02
原创
998 人浏览过

When Should You Use _mm_sfence, _mm_lfence, and _mm_mfence?

什么时候应该使用 _mm_sfence、_mm_lfence 和 _mm_mfence?

多线程编程引入了与并发相关的复杂性,需要维护数据的机制完整性和同步性。 Intel 的内在函数库提供了多个函数,包括 _mm_sfence、_mm_lfence 和 _mm_mfence,用于控制 x86 架构中的内存排序。

x86 中的内存排序

x86 CPU 具有很强的有序内存模型,但 C 和 C 的模型较弱。因此,需要采取额外的预防措施来确保正确的内存排序并防止数据损坏或竞争条件。

_mm_sfence

_mm_sfence 主要在非临时 (NT) 存储之后使用(_mm_stream_*) 以防止推测性重新排序。 NT 存储是弱有序的,这意味着它们相对于其他内存操作可能出现无序发生。 _mm_sfence 创建一个屏障,确保 NT 存储提交到内存后,后续内存操作变得全局可见。

_mm_lfence

_mm_lfence 很少用作负载栅栏。它仅在从写入组合 (WC) 内存区域(例如视频 RAM)加载时才有意义。 _mm_lfence 可以阻止后续指令的执行,直到其退出,这对于微基准测试非常有用。

_mm_mfence

_mm_mfence 提供顺序一致性,确保后续加载之前无法读取值之前的商店变得全球可见。如果您实现自定义版本的 std::atomic 或需要显式控制可能是推测性的操作的内存排序,它会很有用。

摘要

  • 在 NT 存储之后使用 _mm_sfence 来防止数据损坏和竞争条件。
  • 避免_mm_lfence 用于加载排序,除非专门处理 WC 内存区域。
  • _mm_mfence 提供顺序一致性,但可能比锁定原子读-修改-写操作效率低。
  • 考虑使用 C 11 std::用于内存同步的atomic或C11 stdatomic,因为它们提供了更方便和优化的方法。

以上是什么时候应该使用 _mm_sfence、_mm_lfence 和 _mm_mfence?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板