10

マルチプロセッサの場合にコードを壊す可能性のあるコードの並べ替えなどを探しています。

4

4 に答える 4

13

最も重要なのは、メモリアクセスの並べ替えです。

メモリフェンスまたはシリアル化命令がない場合、プロセッサはメモリアクセスを自由に並べ替えることができます。一部のプロセッサアーキテクチャには、並べ替えることができる量に制限があります。アルファは最も弱い(つまり、最も多く並べ替えることができる)ことで知られています。

この主題の非常に優れた扱いは、Linuxカーネルソースのドキュメント(Documentation / memory-barriers.txt)にあります。

ほとんどの場合、コンパイラまたは標準ライブラリのロッキングプリミティブを使用するのが最善です。これらは十分にテストされており、必要なすべてのメモリバリアが設定されている必要があり、おそらくかなり最適化されています(ロックプリミティブの最適化には注意が必要です。専門家でさえ、間違っている場合があります)。

于 2008-11-07T14:48:34.580 に答える
0

ウィキペディアには、ここに最適化手法のかなり包括的なリストがあります。

于 2008-11-07T14:44:42.277 に答える
0

はい、でもあなたの質問は正確には何ですか?

ただし、これは興味深いトピックであるため、コンパイラとプロセッサがコードを最適化するために使用するトリックは、そのコードに競合状態がない場合、複数のプロセッサを使用してもコードを壊してはなりません。これは、順次一貫性の保証と呼ばれます。プログラムに競合状態がなく、すべてのデータがアクセス前に正しくロックされている場合、コードは順次実行されたかのように動作します。

Herb Sutter がこれについて話している非常に優れたビデオがここにあります。

http://video.google.com/videoplay?docid=-4714369049736584770

誰もがこれを見るべきです:)

于 2008-11-07T14:39:08.157 に答える
0

DavidK の答えは正しいですが、言語/ランタイムのメモリ モデルを認識することも非常に重要です。競合状態がなくても、シーケンシャルな一貫性とミューテックスを使用していても、CPU のさまざまなコアで実行されているさまざまなスレッドによってデータがキャッシュされていると、コードが壊れる可能性があります。一部の言語 (Java は一例) では、ミューテックス ロックが使用されている場合にスレッド間のデータの状態を保証しますが、2 つのスレッドが同時にデータにアクセスできないようにするだけでは十分ではありません。言語ランタイムが 2 つのスレッド間でデータ状態を同期させるには、mutex を正しい方法で使用する必要があります。Java では、これは 2 つのスレッドを同じオブジェクトで同期させることによって行われます。

これは、問題と、それが javas メモリ モデルでどのように処理されるかを説明している良いページです。

http://gee.cs.oswego.edu/dl/cpj/jmm.html

于 2008-11-07T14:58:03.500 に答える