OpenMP 簡単な検討


モンテカルロで円周率を求めるプログラムに対し、OpenMPを適用した。

Local PC : 4コア、ハイパースレッディングあり

Workstation : 大量のコア数をもっている (具体的な値は忘れた) ハイパースレッディングはなしだったはず。

実装 Case 1~3について (詳しくはコードを見ること)

Case 1 スレッドごとに、double tempを宣言。forループでの足しこみはtempへ行う。forループ終了後、tempを全体の配列へ反映。

Case 2 スレッド内のforループでの足しこみは、全体の配列へ行う。

Case 3 reduction指示を使う

感想

  • 実装をミスると、かなり遅くなることがある。
  • ハイパースレッディングは影響しうる? (LocalのPCで5スレッド使用のとき遅くなる)
  • 資料1でreductionは遅いと書いてあったが、そうでもないかも。(問題の規模にもよるかもしれない)
  • 実行環境でだいぶ計算時間に差がある。NUMAとかアーキテクチャ依存の話なのか?

コード (C言語、fortranどちらもある)

OpenMPの資料はかなりネットにあるので、探してみると良い。

資料1 (Reductionは遅いという話)

資料2 (多重ループのとき、どこを並列化するか→外側が良いという話)


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です