量子化された無意味な人生

意味深だけど意味が無いブログだよ(:-Q)

OpenMP難しすぎ

OpenMP @Fortran で並列化する作業を最近やっているのだが、これが全然速くならないという愚痴。
昔ちょこっとしたプログラムでやったときはスレッド数に反比例するようにすごくうまく効いたんだが、今やっているやや大規模なプログラムだと全然ダメ。
一応、

  • gprofを使ったホットスポットの特定。
  • 小さなdoループなどを闇雲に並列化しない。
  • 大きな配列のprivate指示を避ける。
  • スレッド取得(!$omp parallel)しすぎない。

ここらへんはやった。が、ダメ。
一体何が律速になっているのかすらわからないというていたらく。というのも、並列化した部分についてgprofでの結果を見ると呼んでいるサブルーチン以外の部分が大半を占めている。しかしそんなに時間のかかりそうな部分がぱっと見見つからない…。
今そのソースコードのなかにomp_get_wtimeを仕込んでいるけど正直とてもめんどくさい。
こんなこと書くと「そのくらいやらないで並列化なんて甘い」と怒られそうだけどw

そもそもなぜOpenMPは配列のreductionができないのか不思議でしょうがない。それさえできればもっと並列化簡単なのに!
大規模な数値計算って大抵大きな配列がコア部分にあるだろうし、需要はあるはず。

OpenMPを見限ってMPIにした方が楽なんだろうか。
検索するとOpenMP全然ダメ、MPIの方が断然速いですぜという声ばかり…
でもそうするとシングルコアバージョンとマルチコアバージョンを分ける必要がありそうでちょっと尻込みしている。(研究室のユーザーに使い分けを周知するのがめんどくさい…。)