openmpi
mpich
ubuntu16.04

MPIを使用するその前に

ここを見ると、ノード間並列を行う前に、NFSとパスワードなしssh接続ができる状態にしておく事が重要らしい。

MPIの種類

MPI並列をやろうかなと思った時に最初の壁がMPIの実装が2種類(open mpi と mpich )あるけどどっち使った方が良いのか?という事です。

結論から言うと、ベンチマークを取って比較して速い方を使うというのが良いでしょう。
それで、両方使う時に問題になるのが、使い方の違いとMPI環境の切り替えです。
そこで、ここでは両方とも使って開発できるようにすることを目指します。
普通のスパコンだとコマンド一つで切り替える事ができるようになっています。

後は、mpienvのような物を使うと良いです。

MPIのインストール

仕様OS: ubuntu 16.04
apt-get install openmpi mpich でインストールできるはず。
インストールした後、 mpirun.openmpi と mpirun.mpich が存在する事を確認してください。

MPI並列をしたいプログラムをコンパイルする。

ubuntuの場合は、apt-getで比較的簡単にインストールすることができるのですが、問題は使い方です。

例としてはfortranを使っていますが、他言語でも同じです。適宜変えてください。
openmpi + gfortranの場合

 $  mpif90.openmpi test.f90

openmpi + ifortの場合

 $ env OMPI_FC=ifort mpif90.openmpi test.f90

mpich + gfortranの場合

 $ mpif90.mpich  test.f90

mpich + ifortの場合

 $ mpif90.mpich -fc=ifort test.f90

MPI並列での実行

次は実行の仕方です。
コンパイル時に使ったMPI環境で実行しましょう(当然)。

 $ mpirun.mpich -np 2 ./test.out

 $ mpirun.openmpi -np 2 ./test.out

で実行できます。

MPI並列実行での環境設定

プログラムを実行している時に、 stack size や OMP_NUM_THREADS を変更したい時がある。
でも、他ノードではstack size や OMP_NUM_THREADS がデフォルトの設定になっている場合があるので、実行時に変更したい。

 $ mpirun.mpich -np 2 bash -c "ulimit -s unlimited && export OMP_STACKSIZE=1G && export OMP_NUM_THREADS=2 && ./test.out input.txt "

みたいなオプションで変更可能。

HOSTの設定

mpirun.openmpi や mpirun.mpich で実行する時、どのノードを使うかという設定をファイルに書く事がある。
その時、問題になるのが両方の環境で書式が違うこと。

mpichの場合

 mpirun.mpich -np 2 -f hostfile ./test.out 

hostfileの中身は

 hostname:slots

みたいな感じになっている。HOSTNAMEじゃなくてIPアドレスでも良い。例えば、

 192.168.0.1:4
 192.168.0.2:4

でも良いようだ。

openmpiの場合

 mpirun.openmpi -np 2 -hostfile hostfile ./test.out

hostfileの中身は

 hostname slots=4
 192.168.0.1 slots=4

という感じ。IPアドレスでも良い。

gdb使ってデバッグしたい

コンパイルを -g オプションを使ってコンパイルした時、 segmentation fault が起これば、起こった場所が表示される。 これは便利。
しかし、mpirunをしている場合は、どのMPIプロセスで落ちたのかがわからなくて厄介。
という訳で、gdbでデバッグしたい場合の対処法。

 mpirun.mpich -np 2  xterm -hold -e gdb -ex run --args ./test.out input.txt

みたいなコマンドで、mpiプロセス毎にgdbが立ち上がって便利。

トラブルシューティング

なんらかのエラーが出る場合に原因を把握するための一連のコマンド

  • MPIが正常にインストールされているか確認
    $ mpirun.openmpi -np 2 bash -c 'hostname'
    みたいなコマンドで確認する。複数ノードを使う場合も同様。
  • 1ノードでは実行できるが、複数ノードを使うとエラーが出る
    環境変数等を確認しましょう。echo コマンド等が使用できます。
    $ mpirun.openmpi -np 2 bash -c 'ulimit -a'

参考になったもの

centOS使用の場合: https://qiita.com/kkk627/items/49c9c35301465f6780fa