首页  >  文章  >  后端开发  >  什么时候应该使用 _mm_sfence、_mm_lfence 或 _mm_mfence?

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

Patricia Arquette
Patricia Arquette原创
2024-11-18 00:05:02387浏览

When Should You Use _mm_sfence, _mm_lfence, or _mm_mfence?

决定何时使用 _mm_sfence、_mm_lfence 或 _mm_mfence

使用多线程代码时,需要有效地控制内存排序。虽然 x86 处理器拥有严格有序的内存模型,但 C 和 C 遵循更宽松的模型。这可能会导致关于正确使用内在函数 _mm_sfence、_mm_lfence 和 _mm_mfence 的混乱。

理解内存排序

用于获取/释放语义,防止编译时重新排序正如编译器屏障概念所强调的那样,仅此一项就足够了。这确保了抽象机中操作的正确顺序,而不会因不必要的汇编指令而影响性能。 GNU C/C asm("" ::: "memory") 等选项有效地充当编译器障碍,实现这一目标,同时最大限度地减少性能影响。

或者,C 11 std::atomic 提供了一个无缝解决方案shared_var.store(tmp, std::memory_order_release),确保更改的全局可见性。如果您正在实现自己的 C11/C 11 std::atomic 版本,利用 mfence 建立顺序一致性并防止后续加载在前面的存储变得全局可访问之前获取值,则 _mm_mfence 具有潜在价值。

检查每个人的角色内在

_mm_sfence:

  • NT存储的理想选择,在设置其他线程依赖的标志之前需要一个栅栏。
  • 确保使用 NT 存储时释放/获取同步,与常规存储不同,NT 存储是弱排序的

_mm_lfence:

  • 很少用作负载栅栏,因为在涉及 WC(写组合)内存时负载仅弱排序区域。
  • 可用于控制某些处理器上的执行流程,防止稍后的指令执行,直到lfence 已完成。

_mm_mfence:

  • 对于实现您自己的 std::atomic 版本可能有用,利用 mfence 实现顺序一致性。
  • 注意:mfence 可能比锁定的atomic-RMW 慢

有关性能的注意事项

重要的是要认识到围栏不会提高商店的可见性。它们只是推迟当前线程内的操作,直到前面的操作完成为止。

结论

对于一般用例,C 11 std::atomic 或 C11 stdatomic 提供强大的功能以及用于控制内存排序的用户友好解决方案。在涉及 NT 存储或 std::atomic 自定义实现的场景中,_mm_sfence 和 _mm_mfence 可能很有价值,但仔细考虑它们对性能的影响至关重要。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn