という名前のルーチンがMPIルーチンを呼び出すtransfer(int)という名前のルーチンを持っています。私のメインプログラムでは、transfer()が2回呼び出されます。MPI Isend/Irecvパフォーマンスの振る舞い
... // do some work
transfer(1); // first transfer
... // do some work again
transfer(2); // second transfer
転送(int型)機能は、私が唯一の前処理を除いて、通信時間を測定し、この
... // do some work
MPI_Barrier(MPI_COMM_WORLD);
t0 = clock();
for(int k=0; k<mpisize; k++) {
MPI_Irecv((void*)rbuffer[k], rsize[k], MPI_BYTE, k, 0, MPI_COMM_WORLD, reqs+2*k);
MPI_Isend((void*)sbuffer[k], ssize[k], MPI_BYTE, k, 0, MPI_COMM_WORLD, reqs+2*k+1);
}
MPI_Waitall(2*mpisize, reqs, status);
MPI_Barrier(MPI_COMM_WORLD);
if (mpirank==0) cerr << "Transfer took "<< (double)(clock()-t0)/CLOCKS_PER_SEC << " secs" << endl;
ノートのように見えます。 転送(1)について
、すべての送信およびバッファは各Kためにサイズ0を有する受け取ります。本質的に、コミュニケーションは起こっていません。しかし、転送は1.95秒かかった。
転送(2)の場合、各プロセッサは他のすべてのプロセッサと約20KBを送受信する必要があります。しかし、全体の転送は0.07秒しかかかりませんでした。
私はこの実験を1024プロセッサで何度も実行しました。測定値は一貫しています。この現象や何が間違っているのか説明できますか?
ありがとうございました。
MPIはまだ0バイトのメッセージを受信する必要があります。最初のsend/recvは通信チャネルの設定に忙しいかもしれません。 – Anycorn
これを少数のプロセッサで再現できますか? –