什么时候应该使用 _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 或需要显式控制可能是推测性的操作的内存排序,它会很有用。
摘要
以上是什么时候应该使用 _mm_sfence、_mm_lfence 和 _mm_mfence?的详细内容。更多信息请关注PHP中文网其他相关文章!