集合通信の例:ブロードキャスト bcast.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 );

    v = 10;
    MPI_Bcast (&v, 1, MPI_INT, 0, MPI_COMM_WORLD);

    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{
      v = v * myrank;
      MPI_Send(&v, 1, MPI_INT, 0, 99, MPI_COMM_WORLD);
    }

    if (myrank == 0){
      printf("sum of all ranks*v = %d\n", sum);
    }
    MPI_Finalize();
}

コンパイルと実行

   % cc -64 bcast.c -lmpi
   % mpirun -np 4 ./a.out

解説

int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root,
            MPI_Comm comm)
    メッセージをrootで示されるタスクからグループ全部に向けて送信する。
    buf       送受信データバッファ
    count     送受信データの個数
    datatype  データタイプ
    root      他のタスクに対してメッセージを送信するタスクのタスク番号
    comm      通信を行うグループの指定
はじめ全プロセスに値10をブロードキャストで送る(各プロセス側の明示的な 受け取りの記述はない).各プロセスは受け取った数に自分のランク値を掛けた 値をルートプロセスに送る.ルートプロセスはそれらを合計し,プリントする.