7


7

私は、マルチプロセッサの場合にコードを壊すことさえできるコードの並べ替えのようなものを探しています。

4 Answer


13


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

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

この問題についての非常に良い扱いは、Linuxカーネルのソースドキュメント、http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;fにあります。 = Documentation / memory-barriers.txt; hb = HEAD [Documentation / memory-barriers.txt]。

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


0


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

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

ここでこれについて話しているハーブサッターの本当に良いビデオがあります:

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


0


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


0


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

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

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