大規模並列計算

2011年4月9日

はじめに

OpenFOAM で大規模並列計算 (ノード間並列計算) を行う方法について。

使用バージョン

OpenFOAM 1.7.1

必要なもの

OpenFOAM (OpenMPI) でノード間並列計算を行うには、互いに SSH で接続可能なマシンを用意する必要がある。

ノード間並列計算の準備

並列計算自体は 1 ノード内のマルチコア並列計算と同様である。ノード間並列計算の場合、ケースディレクトリの置き方が問題である。3 つの方法がある。

  • 共有ディレクトリに置く。
  • 同じパスに置く。
  • バラバラに置く。

共有ディレクトリに置く

NFS を使って、全ノードで同じパスに共有ディレクトリを作るのが一番使いやすい。共有ディレクトリにケースディレクトリを置いて計算を実行するだけである。データを分散させたり回収したりする必要がない。難点は、各ノードへのデータ転送がパフォーマンスを悪化させることである。

同じパスに置く

共有ディレクトリを使わない方法としては、ケースディレクトリを全ノードで同じパスに置くという方法がある。各ノードですべてのデータが必要なわけではないので、decomposePar でできる "processor*" をそれぞれ必要な分だけ設置すればよい。結果もそれぞれそこに入る。共有ディレクトリを使うよりはパフォーマンスが良い。手動での操作は煩雑なので (特にノードが増えると)、データ転送の工夫が必要になる。

バラバラに置く

各ノードでデータを置くパスを一致させないこともできる。その指定は decomposeParDict で行う。"distributed" キーワードで "yes" を指定し、"roots" に各 CPU コアごと (ノードごとではない) のパス ("..." の形) を並べればよい。

ノード間並列計算の実行

計算は mpirun で行う。1 ノード内の計算と異なるのは、マシンのリストを指定することである。

$ mpirun --hostfile machines -np 32 icoFoam -parallel

"--hostfile" で指定している machines はテキストファイルで、マシンと使用 CPU コア数を指定する。

host1 cpu=4
host2 cpu=4
...

mpirun は別のノードにアクセスする際に SSH を使う。ノード数分の認証が必要になるので、ノード数分のパスワードを聞いてくる (8 ノード並列なら自分以外の 7 ノード分の認証が必要)。実行のたびにこれを行うのは面倒なので、SSH の公開鍵認証 (パスフレーズなしで) の設定を行っておくとよい。