__faststorefence的行为是什么?

Dis*_*ame 6 multithreading memory-fences visual-c++ memory-barriers

关于这个问题,我只对x86和x86-64感兴趣.

对于MSVC 2005,__ faststorefence的文档说:"保证每个先前的商店在任何后续商店之前全局可见."

对于MSVC 2008和2010,它改为:"保证每个先前的内存引用,包括加载和存储内存引用,在任何后续内存引用之前全局可见."

写入后者的方式,我认为这也会阻止CPU在旧商店之前重新排序负载.这与第一个定义不同,后者暗示内在函数仅用于处理使用旧存储的非临时存储的阻塞或重新排序(唯一的其他重新排序x86(-64)确实如此).

然而,文档似乎与自己相矛盾:"在x64平台上,此例程生成的指令比sfence指令更快的存储范围.在x64平台上使用此内在而不是_mm_sfence."

这意味着它仍然具有类似sfence的功能,因此仍然可以使用较旧的存储重新排序负载.那是哪个呢?有人能解决我的困惑吗?

PS:寻找这个函数的GCC版本,我遇到了long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));但我觉得它来自32位代码; 什么是64位模拟?

Ant*_*ams 3

您引用的 GCC 版本相当于 MSVC 生成的代码。它依赖于 x86/x86-64 处理器架构文档指定加载和存储不使用LOCKed 指令重新排序这一事实。

我不清楚这是否适用于非临时存储,因为通常内存模型限制不适用于这些指令。

  • 此内在函数仅在 x86-64 上的 MSVC 中可用;我不知道为什么。我希望它在 x86-64 上的成本与 x86 上“MFENCE”相同,因为架构本质上是相同的。如果您忽略非临时存储,那么这对于顺序一致性来说是足够的围栏。 (2认同)