MPICH2でMPI関数オーバーラップ
MPICH2のプロファイリングインターフェースを使ってMPI関数をオーバーラップする方法のメモ。
MPICHのときと同じで、プロファイリングインターフェースが提供されているので、PMPI_XXX関数を用いてMPI_XXXを実装すればMPI関数のオーバーラップができる。
例えば、MPI_Sendの実行時間を計測するには以下のように実装すればよい。
#include <stdio.h> #include "mpi.h" int MPI_Send(void *buffer, const int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) { double t1, t2; t1 = MPI_Wtime(); int result = PMPI_Send(buffer, count, datatype, dest, tag, comm); t2 = MPI_Wtime(); fprintf(stderr, "MPI_Send time: %0.6f\n", (t2-t1)); return result; }
これをprofile_mpi_send.cのように保存し、次のようにコンパイル、ライブラリ作成する。
$ mpicc -g -Wall -c profile_mpi_send.c $ ar cr libpms.a profile_mpi_send.o $ ranlib libpms.a
ここで作成したライブラリlibpms.aを対象アプリケーションにリンクすれば、オーバーラップした関数を使用できる。例えば、test.cがMPIアプリケーション、test.cとlibpms.aが同じディレクトリにあるとすると、以下のようにコンパイル、リンクできる。
$ mpicc -g -Wall -c test.c $ mpicc -L. -o test test.o -lpms
Fortranアプリケーションの場合には昨日の記事と同じ工夫が必要。つまり、リンク時に「libmpe_f2cmpi.a」とリンクさせる必要がある。リンク順にも注意。
$ mpif90 -g -Wall -c test.f $ mpif90 -g -Wall -L. -o test test.o -lmpe_f2cmpi -lpms