アプリ版:「スタンプのみでお礼する」機能のリリースについて

あまりパソコンに詳しい方ではありません。

今、linuxが入ったパソコン(CPU:Intel(R)Core(TM)i7 CPU970@3.20GHz,コア数12,
メモリ:5.8GiB)で数値計算をしています。コンパイラはgfortranです。OpenMPを使って、並列計算をしています。

例えば、スレッドを5使って一つのプログラムの計算したとします。次に別のプログラムをスレッドを5使って同時に計算したとします。
CPUモニタで確認すると、合計12スレッド中、10スレッドが使用率100%になります。

しかし、計算時間はそれぞれ倍ぐらいになってしまいます。結局、プログラムを1
つずつ計算するのと同じ時間がかかります。また、使用するスレッドは5ぐらいが最適であることがわかっています。(それ以上多くしても計算時間が多くなるだけ)。つまり、12スレッド中7スレッドは常に仕事をしていません。

原因、及び解決方法はあるでしょうか?

A 回答 (2件)

各スレッドで個別に使う変数をPRIVATEに指定してありますか?


CRITICALとかBARRIER等の制御を使っていませんか?

並列計算は、各スレッドが独立している(他のスレッドと関係が無い)ほど効率がよくなります。
OpenMPでは、PRIVATEに指定していない変数はSHARED扱いになり、各スレッドで共有しようとするので、独立性が落ちます。
CRITICAL等の制御は必要なケースもありますが、他のスレッドを待ったりするために効率が落ちるので、最低限の利用に留める(できれば使わずに済むアルゴリズムにする)必要があります。
    • good
    • 0

メモリアクセスが多くなるとメモリアクセスが足を引っ張りますのでマルチCPUの効果が薄れると思います。

なので各スレッドは出来るだけ狭いメモリ領域を参照することが望ましいです(256KBを超えるランダムアクセスは低速化の要因)。
一番良いのは計算が複雑で変数や配列アクセスが極力少ないコードです。

あとCorei7 970だと実コア数は6で、倍の12に見えるのはハイパースレッディングの機能ですがプログラムの組み方次第ではハイパースレッディングでは効率的には動きません。場合によってはハイパースレッディングを切ってコア6で動かしたほうが早いかも知れません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!