6

关于这个问题,我只对 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 位模拟?

4

1 回答 1

3

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

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

于 2011-06-27T08:57:17.887 回答