並行プログラミング - 並べ替え
プログラムを実行すると、パフォーマンスを向上させるためには、多くの場合、コンパイラやプロセッサの命令が並べ替えない持っています。
(1)並べ替えコンパイラの最適化。
コンパイラは、シングルスレッドのプログラムの前提の意味を変えない文の実行順序並べ替えることができます
(2)ILPの並べ替えを。
現代のプロセッサの命令レベル並列性の手法は、実行される命令の複数の重複します。データ依存性が存在しない場合、プロセッサは、ステートメントに対応する機械語命令の順序変更することができる
(3)メモリシステムを並べ替えを。
ロードおよびストア動作が順序外で実行される可能性が高いように見えることができるキャッシュおよび読み取り/書き込みバッファ、使用プロセッサので
並べ替えマルチスレッド・プログラムメモリ可視性の問題をもたらす可能性があります。一貫性のあるメモリ・プログラマを確保するために可視性を提供並べ替えコンパイラやプロセッサの禁止特定のタイプ。
JMMの注目仕分けルールをコンパイルするコンパイラのコンパイラの特定のタイプは、ソート(すべてのコンパイラは禁止並べ替えを落胆していない)の非常に考えて禁止しています。
プロセッサを並べ替えるために、ルールを並べ替えるプロセッサJMMはJavaコンパイラは、並べ替えによって、プロセッサ・メモリ・バリア命令の特定のタイプを禁止する、再度挿入されたメモリバリア命令の特定のタイプの命令シーケンスを生成主張します。
メモリバリア
バリアタイプ | 命令の種類 | 説明 |
---|---|---|
LoadLoad障壁 | LOAD1; LoadLoad、LOAD2 | データを確実にLOAD1 LOAD2は、ロードされたすべての後続のロード命令のロード前に |
StoreStore障壁 | Store1; StoreStore; Store2 | 前Store2及びすべての後続のストア命令に他のプロセッサに対して可視Store1(リフレッシュメモリ)を確保するために、データストレージ |
LoadStore障壁 | LOAD1; LoadStore; Store2 | LOAD1はStore2データのローディングを確実にし、すべての後続の命令を格納するメモリにフラッシュされる塩漬け |
StoreLoad障壁 | Store1、大きな負荷、LOAD2 | Store1は、データを確実に最初LOAD2にロードされ、他のプロセッサへのすべての後続のロード命令である(リフレッシュメモリを参照)見えるようになります。バリア後のメモリアクセス命令の実行前に、すべてのメモリアクセス命令(ロードおよびストア命令)StoreLoad障壁ます完了する前にバリアた後、 |
StoreLoad障壁「万能」の障壁である、それはまた、他の三つの障壁の効果があります。障壁のための最も近代的なマルチプロセッサのサポート。現在のプロセッサは、一般的にリフレッシュメモリ(バッファフルフラッシュ)に、バッファ内のすべてのデータを書きたいので、バリアオーバーヘッドの実装は、非常に高価になるだろう