_mm_sfence 内在函数和 SFENCE 指令之间有什么关系?

Chu*_*huu 2 x86 memory-barriers

我正在试验非时间指令,并且已经熟悉具有普通加载/存储的围栏如何操作。

Intel 定义了一个与非时间操作相关的内在,_mm_sfence,手册将其定义为:

保证每个前面的商店在任何后续商店之前都是全局可见的。

我对这个操作有一些疑问。

  1. 这只是插入 SFENCE 指令吗?如果不是,这意味着什么?
  2. 如果这不仅仅是一个 SFENCE,那么 SFENCE 指令是否也带有非临时存储的排序保证?

Had*_*ais 5

_mm_sfence内在做两件事情:

  • 插入SFENCE指令。
  • 根据编译器的不同,它会插入一个编译器写屏障,这样编译器就不会根据程序顺序对内在的任何内存写入重新排序。GCC、MSVC 和 ICC 就是这种情况。虽然不确定 Clang,但很可能它也这样做。