並列和: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は同期型の送受信で あるため,合計を出力する前に,すべての値が合計されたことは保障される.