11

是否有任何 C 或 C++ 编译器为volatile变量实现“积极的”内存一致性模型?通过“积极的”一致性模型,我的意思是volatile在生成的代码中伴随所有对具有内存屏障的变量的写入。

AFAIK,这是 IA64 (Itanium) 平台上 C 或 C++ 编译器的习惯行为。x86呢?是否有一个编译器可以实现(或可以配置为实现)类似 Itanium 的方法来处理volatilex86 平台上的变量?

编辑:我正在查看 VS 2005 生成的代码(在阅读了评论之后),并且在访问volatile变量时我看不到任何类似于任何类型的内存屏障的东西。由于 MESIF (Intel) 和 MOESI (AMD) 缓存协议,这非常适合确保单 CPU 多核 x86 平台上的内存一致性。

但是,这在多 CPU SMP x86 平台上似乎是不够的。SMP 平台在生成的代码中需要内存屏障,以确保 CPU 之间的内存一致性。我错过了什么?当微软声称他们已经在volatile变量上具有获取-释放语义时,究竟是什么意思?

4

1 回答 1

2

应该注意的是,x86 CPU 既不会将加载与其他加载一起重新排序,也不会将存储与其他存储一起重新排序。因此,不需要明确的障碍。

MSVC 编译器将确保加载不会使用 volatile 加载重新排序,并且存储不会使用 volatile 存储重新排序(当然,我现在谈论的是重新排序加载和存储指令),从而保证了 volatile 加载和存储的获取和释放语义分别.

于 2012-06-27T20:33:02.163 回答