各プロセッサが次のことを行う MPI プログラムがあります。
高価な操作を行います。
リモートで何かを保存する必要がある場合 (他のプロセッサ上にある可能性があります)、その要求をバッファーにキューに入れて続行します。
バッファがいっぱいになると、通信フェーズに入ります。
通信フェーズでは、バッファがいっぱいになったプロセッサは、バッファされた情報の一部を送信してから、「高価な操作」に戻る必要があります。もちろん、少なくとも 2 つのプロセッサが通信フェーズに入り、MPI コマンドを実行できるようになるまで、これは発生しません。
現在、すべてのプロセッサが通信フェーズに入るまで一時停止してから、次のようなことを行うことでこれに対処しています。
MPI_Allgather(Num_send_local,NTask,MPI_INT,Num_send_global,NTask,MPI_INT,MPI_COMM_WORLD);
ここで、Num_send_local は、各タスクに送信するものの数を含む長さ NTask の配列です (したがって、Num_send_global は NTask*NTask になります)。
これはうまくいきますが、多くの場合、互いに通信している可能性のあるプロセッサが、全員が送信する準備ができるまで待機するため、多くのリソースが浪費される可能性があります。
本当に私が望んでいるのは、2 つのプロセッサが通信フェーズに入るとすぐに通信が行われるようにすることですが、実装に問題があります。私は次のことを試しました:
//Tell everyone I'm in the comm phase now
for(i=0;i<NTask;i++)
{
if(Task==i)
continue;
MPI_Isend(&Num_send_local[i],1,MPI_INT,i,0,MPI_COMM_WORLD,&request[i]);
}
MPI_Recv(&local,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
remote_partner = status.MPI_SOURCE;
//Do stuff between Task and remote_partner...
しかし、これは、remote_partner がタスクの代わりに他の誰かの送信要求を受信するという問題に遭遇します。
これを行うためのより良い方法があると確信しています。誰にもアイデアはありますか?