以下に説明する順序に関して、いくつかの関連する質問があります。
これらの順序付けの保証を考えると、多くの場所で明示的なフェンスは必要ありません。しかし、コンパイラ、特にGCCに「フェンス」をどのように表現できますか?つまり、プログラムの順序の保証は、オプティマイザーがプログラムを並べ替えない限りのみ適用されます。
そのような保証を提供しない汎用コアを備えた一般的/人気のある新しいチップが使用されていますか?
私はC++0xでインターリーブのアイデアと少し混乱しています。これらの保証を利用するには「アトミック」クラスを使用する必要がありますか、それともこれらの保証を利用する方法を提供するドラフトに他の側面がありますか?
メモリオーダリング
IntelとAMDはどちらも、少なくともx86_64を使用して、単一のプロセッサで実行されるストア操作に関してメモリのロードがシーケンシャルであることを保証します。つまり、一部のプロセッサがこれらのストアを実行する場合:
- ストアA<-1
- ストアB<-2
- ストアC<-3
他のプロセッサがC(3)を認識した瞬間に、前のストアA(1)およびB(2)も認識されることが保証されます。これで、プロセッサ間の可視性がインターリーブされる可能性がありますが、任意のプロセッサからのストアの順序もシーケンシャルになります。
また、プロセッサ0がプロセッサ1によって格納された値を読み取り、次に値を書き込む場合、新しい値を読み取るプロセッサ2もプロセッサ1からその値を確認する必要があるという推移的な保証があります。
IOおよび特殊デバイスを扱う特殊なケースは無視してください。私は一般的なメモリ保証にのみ興味があります。ここでの順序付けは、並行アルゴリズムにとって最も重要であるため、私が最も興味を持っているビットです。