モンテカルロで円周率を求めるプログラムに対し、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 (多重ループのとき、どこを並列化するか→外側が良いという話)