5

以下に説明する順序に関して、いくつかの関連する質問があります。

  1. これらの順序付けの保証を考えると、多くの場所で明示的なフェンスは必要ありません。しかし、コンパイラ、特にGCCに「フェンス」をどのように表現できますか?つまり、プログラムの順序の保証は、オプティマイザーがプログラムを並べ替えない限りのみ適用されます。

  2. そのような保証を提供しない汎用コアを備えた一般的/人気のある新しいチップが使用されていますか?

  3. 私はC++0xでインターリーブのアイデアと少し混乱しています。これらの保証を利用するには「アトミック」クラスを使用する必要がありますか、それともこれらの保証を利用する方法を提供するドラフトに他の側面がありますか?


メモリオーダリング

IntelとAMDはどちらも、少なくともx86_64を使用して、単一のプロセッサで実行されるストア操作に関してメモリのロードがシーケンシャルであることを保証します。つまり、一部のプロセッサがこれらのストアを実行する場合:

  1. ストアA<-1
  2. ストアB<-2
  3. ストアC<-3

他のプロセッサがC(3)を認識した瞬間に、前のストアA(1)およびB(2)も認識されることが保証されます。これで、プロセッサ間の可視性がインターリーブされる可能性がありますが、任意のプロセッサからのストアの順序もシーケンシャルになります。

また、プロセッサ0がプロセッサ1によって格納された値を読み取り、次に値を書き込む場合、新しい値を読み取るプロセッサ2もプロセッサ1からその値を確認する必要があるという推移的な保証があります。

IOおよび特殊デバイスを扱う特殊なケースは無視してください。私は一般的なメモリ保証にのみ興味があります。ここでの順序付けは、並行アルゴリズムにとって最も重要であるため、私が最も興味を持っているビットです。

4

3 に答える 3

2

これらの種類の操作の習得は、SMPオペレーティングシステムを構築し、特定の種類のハードウェアと通信するために不可欠です。Linuxカーネルのドキュメントには、カーネルで使用される特定のソリューションとともに、主題の優れた概要が記載されています。彼らのmemory-barriers.txtファイルを確認することを強くお勧めします。

于 2011-04-04T19:25:47.873 に答える
0

ストアとロードが正確に必要な順序で実行されることを最も強力に保証するには、コード内のブロックに頼って、命令を明示的にasm書き出す必要がある場合があります。mov

于 2011-04-04T19:27:21.307 に答える
0

プラットフォームが逐次一貫性を保証している場合でも、複数のスレッドが同じメモリ位置にアクセスし、そのうちの少なくとも1つがそれに書き込む場合の競合状態を防ぐために、常に何らかの同期が必要になります。C ++ 0xは、このような同期を実装する3つの方法を提供します。

  1. 相互排除-std::mutexおよび関連するクラス
  2. 原子変数-std::atomic<T>
  3. 明示的なメモリバリア- std::atomic_thread_fence

後者の2つは、逐次一貫性を保証しないプラットフォームで(専門家のみ!)追加の柔軟性を可能にするメモリ順序パラメーターを受け入れますが、これはx86には関係ありません。

于 2011-04-04T19:32:19.523 に答える