2012-06-27 6 views
11

volatile変数の "積極的な"メモリ一貫性モデルを実装するCまたはC++コンパイラがありますか? 「積極的」整合性モデルとは、生成されたコードにメモリ障壁を持つ変数volatileへのすべての書き込みを伴うことを意味します。"積極的な"揮発性セマンティクスを持つCおよびC++コンパイラ

AFAIKこれは、IA64(Itanium)プラットフォーム上のCまたはC++コンパイラでの通常の動作です。 x86についてはどうですか? x86プラットフォームでvolatileの変数を処理するためのItaniumのようなアプローチを実装する(または実装するように設定できる)コンパイラはありますか?

編集:私は(コメントを読んだ後)を生成VS 2005のコードを見ていると私はvolatile変数にアクセスするときに、メモリバリアの任意の並べ替えのようになり何も表示されません。これは、MESIF(Intel)およびMOESI(AMD)キャッシュプロトコルのために、単一CPUマルチコアx86プラットフォームでメモリの一貫性を確保するのにまったく問題ありません。

しかし、これはマルチCPU SMP x86プラットフォームでは不十分と思われます。 SMPプラットフォームでは、CPU間のメモリの一貫性を保証するために、生成されたコードにメモリ障壁が必要です。私は何が欠けていますか? volatile変数の取得リリースのセマンティクスが既に存在すると主張すると、マイクロソフトは正確に何を意味しますか?

+3

[Raymond Chenによる](https://blogs.msdn.com/b/oldnewthing/archive/2011/04/19/10155452.aspx?Redirected=true)VS2005以降でこの現象が発生する – Praetorian

+2

@ Prætorian:[公式文書によると](http://msdn.microsoft.com/en-us/library/12a04hfd.aspx)も参照してください。 ; - ] – ildjarn

+0

@AndreyT:VC++ 2005またはVC++ 2005 SP1をテストしていますか? IIRC、VC++ 2005 RTMには、volatileと期待されたセマンティクスがなく、SP1とVC++ 2008+で修正されたバグがありました。 – ildjarn

答えて

2

x86 CPUは、他の負荷を伴う負荷と他の負荷を伴うストアの順序を変更しないことに注意してください。したがって、明白な障壁は必要ありません。

MSVCコンパイラは、負荷が揮発性のロードで並べ替えられないことを保証します。ストアは揮発性のストアと並べ替えられません(私は今、ロードとストアの命令の並べ替えを話しています)。ロードおよびストアします。

+0

マルチCPUケース(シングルCPUマルチコアケースとは対照的)の場合でもそうですか? – AnT

+0

@AndreyTの場合、外部バスがロードを参照する順序はロード命令の順序と同じです。店舗についても同様です。ご存知のように、キャッシュプロトコルは一貫性を保証します。言い換えれば、CPU1がストアSを実行し、CPU2がそのロードLでストアを見ると、Lに続いてCPU2によってロードされると、Sの前にCPU1によるすべてのストアが表示されます。そして、それは私の友人が取得/解放セマンティクスです:) – avakar

+0

@AndreyT、私は冗談を言っているわけではありませんが、C++委員会が ''の代わりに「volatile取得/解放セマンティクス」保証標準を作りたがっています。 – avakar

関連する問題