Multithreading faststorefence的行为是什么?

Multithreading faststorefence的行为是什么?,multithreading,visual-c++,memory-barriers,memory-fences,Multithreading,Visual C++,Memory Barriers,Memory Fences,关于这个问题,我只对x86和x86-64感兴趣。 对于MSVC 2005,faststorefence的文档说明:“保证在任何后续存储之前,前面的每个存储都是全局可见的。” 对于MSVC 2008和2010,它改为:“保证在任何后续内存引用之前,所有以前的内存引用(包括加载和存储内存引用)都是全局可见的。” 后者的编写方式意味着,在我看来,这也会阻止CPU在旧存储之前对负载进行重新排序。这与第一个定义不同,第一个定义意味着内在功能仅用于处理非时态存储与较旧存储的阻塞或重新排序(只有其他重新

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

对于MSVC 2005,faststorefence的文档说明:“保证在任何后续存储之前,前面的每个存储都是全局可见的。”

对于MSVC 2008和2010,它改为:“保证在任何后续内存引用之前,所有以前的内存引用(包括加载和存储内存引用)都是全局可见的。”

后者的编写方式意味着,在我看来,这也会阻止CPU在旧存储之前对负载进行重新排序。这与第一个定义不同,第一个定义意味着内在功能仅用于处理非时态存储与较旧存储的阻塞或重新排序(只有其他重新排序的x86(-64)可以处理)。

然而,文档似乎自相矛盾:“在x64平台上,此例程生成的指令比sfence指令的存储速度更快。在x64平台上使用此内在指令而不是_mm_sfence。”

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


PS:在寻找这个函数的GCC版本时,我遇到了
long local__asm____;volatile________;(“锁定;或$0,%0;”:“m”(本地))但我认为它来自32位代码;64位模拟是什么?

您引用的GCC版本相当于MSVC生成的代码。它依赖于以下事实:x86/x86-64处理器体系结构文档指定加载和存储不会使用
LOCK
ed指令重新排序


我不清楚这是否适用于非时态存储,因为一般来说,内存模型限制不适用于这些指令。

你能给出一个比
\uu faststoreffence
更好的问题标题吗?@JaredFarrish:迟做总比不做好:)嗨,安东尼,谢谢你的回答。目前尚不清楚的是,为什么该内在特性的文档指定它在x64平台上比在32和64平台上更快。这是否意味着锁定指令比仅在x86-64上的mfence更便宜?此外,如果它防止加载和存储都被重新排序,这是否足以保证顺序一致性(不包括非临时存储的情况)?此内在特性仅在x86-64上的MSVC中可用;我不知道为什么。我希望它在x86-64上的成本与x86上的
MFENCE
相同,因为体系结构基本相同。如果忽略非时态存储,那么这就足以保证顺序一致性。