集合通信の例:ブロードキャスト 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をブロードキャストで送る(各プロセス側の明示的な
受け取りの記述はない).各プロセスは受け取った数に自分のランク値を掛けた
値をルートプロセスに送る.ルートプロセスはそれらを合計し,プリントする.