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