2010年12月21日

Openmp格闘記

SEIB-DGVMを大きな地理スケールで効率よく実行できるように、OpenMPを用いたコードの並列化に取り組みました。結果、上手くいかなかったのですが、記念(?)として作業記録を載せてみます。

まずは、自腹で購入した教科書「OpenMPによる並列プログラミング通知計算法」牛島省(著)で勉強する。この著者のFortran教本も読んだことがあるのだけど、相変わらず良く書けており、サクサクと勉強が進む。

しかし、実際にOpenMPでコードを走らせるためには、コンパイルオプションを変えて、更にジョブスケジューラーへ投げるスクリプトを変更しなければならない。このあたりの情報収集に苦労する。教科書にはOpenMPの仕様のみ記載してあるが、このような情報にも少し触れてくれていると助かる。環境依存の情報であるものの、とりあえず全体像を見せてくれれば、あとは検索で何とか対応できるので。

それでも何とか、OpenMPでサンプルコードを走らせてみる。並列計算されていることも確認。ついで、SEIB-DGVMの計算時間のかかっているループ1カ所を並列計算させてみる。一応動かすことはできたが、全然速くならない。場合によっては遅くなったりするし、おまけに計算結果が少し変わったりする。実数計算なので、演算順序が変われば丸め誤差程度の差は当然生じうるが、丸め誤差とは言えない程度の差が発生。う〜む。

いろいろ試行錯誤しているうちに、計算結果が大幅に違ってしまう問題は無くなった。しかし、なぜこのような問題が発生したのか分からずじまい。こんなの怖くて使えないよ。だいたい演算速度も、相変わらず速くならない。

2chで以下のような書込を発見
「複数のスレッドが同じ行列要素とかメモリアドレスを参照しているなら効率はたいてい悪くなる」
「OpenMPの困る所は性能がコンパイラとライブラリに依存しすぎること」
「スレッド生成・消滅のオーバーヘッドは思いのほか大きい 、$omp parallel 〜$omp end parallelが極めて複数回呼ばれる場合にパフォーマンスは非常に落ちる」

使えない?もう少し勉強してみることにするが、MPIを使うことにする。OpenMPより少し手間がかかるそうだが、結局MPIでないと並列計算はダメという意見を多く目にする。勉強したけれど、結局役に立たなかった規格はVRML以来。

まあ、並列化しようとしたサブルーチンをいじっている間に、非効率な部分の改善などを行えて、計算量とメモリ使用量を相当に軽減できたので、全く無駄になったわけではないのが救い。MPIの参考書を公費で発注したので、届くまでは、アルゴリズムの地道な改善によるコードの高速化で遊ぶことにする。こういう作業は、パズルみたいでなかなか面白いのだけど、はまりすぎないように、適当に切り上げなければ、、。
posted by さとうひさし at 22:13| Comment(0) | TrackBack(0) | 業務日誌
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/42195653

この記事へのトラックバック