决定何时使用 _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:
_mm_lfence:
_mm_mfence:
有关性能的注意事项
重要的是要认识到围栏不会提高商店的可见性。它们只是推迟当前线程内的操作,直到前面的操作完成为止。
结论
对于一般用例,C 11 std::atomic 或 C11 stdatomic 提供强大的功能以及用于控制内存排序的用户友好解决方案。在涉及 NT 存储或 std::atomic 自定义实现的场景中,_mm_sfence 和 _mm_mfence 可能很有价值,但仔细考虑它们对性能的影响至关重要。
以上是什么时候应该使用 _mm_sfence、_mm_lfence 或 _mm_mfence?的详细内容。更多信息请关注PHP中文网其他相关文章!