2017-09-03 4 views
1

私はMPIを初めて使用しています。他のプロセスがルートからi番目の値を受け取る前に、ルート(例:ランク0)がすべての値を初期化する方法を質問します。 たとえば、ルートの は、arr [0] = 20、arr [1] = 90、arr [2] = 80を初期化します。3つのプロセスでMPI_Scatterを使用する

私の質問は、たとえば、プロセス(番号-2)がルートプロセスの前に少し始まっている場合です。 MPI_Scatterは80の代わりに不正確な値を送ることができますか?

他のユーザーがScatterを使用する前にルートを確実に初期化するにはどうすればよいですか?

ありがとうございました!

答えて

0

MPI_Scatter()は集合的な操作であるため、MPIライブラリはすべてを処理し、一括操作の結果は他のものより早く呼び出されたランクに依存しません。

この特定の場合、ルート以外のランクは、ルートランクがMPI_Scatter()を呼び出すまで(少なくとも)ブロックされます。

これはMPI_Send()/MPI_Recv()と変わりません。 MPI_Recv()ブロックがリモートピアの前に呼び出された場合MPI_Send()一致するメッセージ。

1

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); 
関連する問題