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