MPICH2でMPEを使う

最近MPICH2をよく使っている。MPICHとMPICH2ではMPE(Multi-Processing Environment)の使い方が変わったようなので、ちょっとはまってしまった。そのときのメモ。
MPICHのときは、MPEを使ってMPIアプリケーションのログを取るのはコンパイル時のオプションに「-mpilog」を指定するだけでよかったのだが、MPICH2のmpiccにはそのオプションがなくなっているようだ。また、MPI関数のトレースを取るには「-mpitrace」オプションを指定するだけだったのだが、このオプションもなくなっているようだった。MPICHの場合はこれらのオプションを指定すると、「-mpilog」の場合はリンク時に「-llmpe -lmpe」がリンクされ、「-mpitrace」の場合は「-ltmpe -lmpe」がリンクされる。
MPICH2でもlibmpe.a、liblmpe.a、libtmpe.aが存在することが確認できたので、アプリケーションのリンク時にこれらを指定したところ、無事、ログの出力、MPI関数のトレースができた。つまり、MPIアプリケーションをtest.cとすると、以下のようにコンパイル、リンクすれば、実行時にログを録るバイナリtestが生成される。

$ mpicc -c test.c
$ mpicc -o test test.o -llmpe -lmpe

MPI関数のトレースを録るには「-llmpe」の変わりに「-ltmpe」を指定すればよい。

しかし、このようにリンクをしてもFortranアプリケーションのログやコールトレースを録ることができなかった。いろいろ調べたり、試してみたところ、MPICH2に付属のlibmpe_f2cmpi.aをリンクすればよいことがわかった。しかし、出力されるログファイルの名前が「Unknown.clog2」となってしまう。おそらく、Fortranアプリケーションの実行ファイル名をプログラム側から取得できないためなのだろう。
Fortranアプリケーションをtest.fとすると以下のようにコンパイル、リンクすればよい。

$ mpif90 -c test.f
$ mpif90 -o test test.o -lmpe_f2cmpi -llmpe -lmpe

このとき、ライブラリのリンク順に注意。
コンパイラにログやトレースを録るためのオプションが無いことや、Fortranアプリケーションのログファイルが全てUnknown.clog2になってしまうなど、MPE周りの実装はまだまだなのかな?