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

What is the relationship between the _mm_sfence intrinsic and a SFENCE instruction?

我正在试验非时间指令,并且已经熟悉普通 load/stores 的栅栏是如何操作的。

Intel 定义了与非时态操作相关的内在函数 _mm_sfence,手册将其定义为:

Guarantees that every preceding store is globally visible before any subsequent store.

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

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

_mm_sfence 内在函数做两件事:

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