MPIで並列処理

だいぶ前にもMPIでの高速化にちょっと興味を持って触ってみたのですが、この度並列処理しないと時間が足りなさそうな事態になったので必要に迫られてMPIを使ってみました。前にちょっと使ったので簡単にいけるだろー、と思ってたのですが、意外とはまりました。はまったとこだけ書くので、詳しい使い方は書きません。解説というより自分用メモです。

LAMとMPICH

MPIとは単なる仕様で、実装としては代表的なものにLAMというのとMPICHというのがあるようです。ソースレベルでは(ほぼ)互換性があるようです。基本はUNIX互換OS用みたいですが、MPICHはWindows用もあるみたいです。LinuxWindows両方使う僕には興味ありますが、Fedoraにデフォルトで入っているLAMを使うことにします。

とりあえず入門用にリンクです。詳しい使い方はMPIで検索すればすぐ見つかりますが。

LAMのバージョン

LAMは、マシンごとのバージョンが違うとうまく動きません。メジャーバージョン(?)(7.x.xと6.x.xとか)が違うとまず絶望的です。2桁目も違うとちょっとまずそうです。(7.0.xではライブラリを静的リンクしてるのに、7.1.xでは動的リンクしてて7.1.xでコンパイルしたプログラムは7.0.xのマシンで動かないとか)。バージョンが下のマシンから上のマシンにつなぐ分には問題ない…んでしょうか(?)

ディストリビューション&バージョンの違い

研究室には、計算してなさそうなマシンは何台もありますが、VineRedhatFedora、しかも違うバージョンが混在してるので、そのまま使うのは難しいです。Fedoraみたいな新しいのはgccの新しいバージョン使ってるので、FedoraコンパイルしたのをVineで実行すると「〜〜.soがないぞ!」って怒られます。とりあえず、gccとLAMのバージョンが一番古そうなVineコンパイルしたら(今回は)うまくいきました。

あと、Vineにはapt-getで入れたのですが、lambootはデフォルトでrshを使うようになってます。いまどきrshもないと思うんですが。で、つながらないぞって言われるので、環境変数 LAMRSH を "ssh -x" にしてやればsshを使えます。詳しくは以下で。

sshで入るときに毎度パスワードの入力を求められるので、公開鍵暗号+エージェントもしくは公開鍵暗号パスフレーズなしを使ってパスワード入力を省略しないとめんどくさすぎるので注意。

lamhosts

ホストの設定ファイルです。どうせ指定しないといけないので名前は何でもいいようですが。CPUが複数あるとき(マルチCPUやHyper Threading)は、ホスト名を複数回指定するかcpu=2のように指定すればいいようです。

blinky
blinky
blinky
blinky
pinky cpu=2

あと、ホスト名を名前解決してIPアドレスにしたときに127.0.0.1になるとダメみたいです。Fedoraなんかはデフォルトで、自分のマシン名は127.0.0.1になるように /etc/hosts に設定されてるので注意です。

  • /etc/hosts を設定して、ホスト名のアドレスを(ループバックでない)外向きのアドレスに指定する。
  • ホスト名でなくIPアドレスを指定する。

のどちらかをする必要がありそうです。( http://www.lam-mpi.org/faq/category4.php3#question11 )

プログラム中の入出力

  • コマンドライン引数は、全プロセスでargc, argvに入ってます。
  • 標準出力、標準エラー出力は全プロセスmpirunした端末に出ます。
  • 標準入力は1プロセスだけ。入力データの複製はされません。データの入力が必要ならnfs等を使ってファイル、もしくはMPIの関数で通信で。