並列和:parallel_sum.c
#include "mpi.h"
main( argc, argv )
int argc;
char **argv;
{
int myrank;
int p;
int sum, v;
int i;
MPI_Status status;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
MPI_Comm_size( MPI_COMM_WORLD, &p );
if (myrank == 0){
sum = 0;
for (i=1; i<p; i++){
MPI_Recv(&v, 1, MPI_INT, i, 99, MPI_COMM_WORLD, &status);
sum = sum + v;
}
}
else{
MPI_Send(&myrank, 1, MPI_INT, 0, 99, MPI_COMM_WORLD);
}
if (myrank == 0){
printf("sum of all ranks = %d\n", sum);
}
MPI_Finalize();
}
コンパイルと実行
% cc -64 hello.c -lmpi
% mpirun -np 4 ./a.out
解説
各プロセスは自分のランクをルートプロセスに送る.ルートプロセスは各
プロセスのランクを合計し,出力する.MPI_SendとMPI_Recvは同期型の送受信で
あるため,合計を出力する前に,すべての値が合計されたことは保障される.