MPIプログラムの開発
MPI(Message Passing Interface)のデバッグが難しいというお話。
世のMPIライブラリ利用者ってデバッグをどうやっているのでしょうか…?
MPIを使ったプログラムだとデバッグの基本中の基本、Printfデバッグが一筋縄ではできません。
#include <stdio.h>
#include "mpi.h"
int main(int argc, char *argv[]) {
int numprocs, myid;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
printf("Hello World.\n");
MPI_Finalize();
return 0;
}
例えば、上のようなプログラムを実行します。
$ mpiexec -np 4 ./a.out
Hello World.
Hello World.
Hello World.
Hello World.
とか出てくるはずです。
普通にやると複数のプロセスの出力が一つにまとまるせいで、どのプロセスが変な出力を出したのか全く見えません。
かと言って以下のように、毎度毎度ランク番号を出すわけにもいきません。
printf("[%d], Hello World.\n", myid);
MPIのOSS実装の一つであるOpen MPIには以下のようなオプションがあり、このオプション付きで実行するとランク番号ごとに出力を行うようになります。
$ mpiexec --output-filename hogehoge -np 4 ./a.out
これで、各プロセスごとに出力ファイルが別ファイルに出力されるようになり、printfデバッグがしやすくなると思います。
まぁデバッグならプロセスにアタッチするとか、coreファイルデバッグとかあると思いますが、最も単純なデバッグ方法をMPIプログラムでも使える方法を書いてみました。