MPI standardはCOMMがintracommunicator場合ルートN を実行した場合のように、結果は
ことを指定は操作、MPI_Send(sendbuf+i, sendcount, extent(sendtype), sendcount, sendtype, i,...)
を送信し、各プロセスは、受信を実行し、MPI_Recv(recvbuf, recvcount, recvtype, i,...)
。
これは、すべての非ルートプロセスが、それぞれの要素が送信されるまでrecvcount
まで待つことを意味します。これは同期ルーチンとも呼ばれます(通信が完了するまでプロセスは待機します)。
通信ルーチンを呼び出した時点で、送信バッファが再び使用可能になるまで(この場合は、MPI_Scatter
が返るまで)、送信されるデータが正しいことをプログラマが保証します。 MPIのみのプログラムでは、各プロセスがプログラムを順番に実行するので、MPI_Scatter
の呼び出しの前に初期化コードを配置するのと同じくらい簡単です。
以下は、文書の例5.11に基づく例である:
MPI_Comm comm = MPI_COMM_WORLD;
int grank, gsize,*sendbuf;
int root, rbuf[100];
MPI_Comm_rank(comm, &grank);
MPI_Comm_size(comm, &gsize);
root = 0;
if(grank == root) {
sendbuf = (int *)malloc(gsize*100*sizeof(int));
// Initialize sendbuf. None of its values are valid at this point.
for(int i = 0; i < gsize * 100; i++)
sendbuf[i] = i;
}
rbuf = (int *)malloc(100*sizeof(int));
// Distribute sendbuf data
// At the root process, all sendbuf values are valid
// In non-root processes, sendbuf argument is ignored.
MPI_Scatter(sendbuf, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm);