プロセス間でビンが分解されたメッシュを考えてみましょう。イメージ内の数字はプロセスのランクです。受信の受信を停止するプロセスがどのように知っていますか?
各時間ステップでは、ポイントの一部が移動して新しいデスティネーションに送信する必要があります。このポイント送信は、移動されたポイントを有するすべてのプロセスによって行われる。この画像では、左下隅のビンの点のみが例として示されています。
プロセスが受信メッセージを引き続き受信する必要があるかどうかわかりません。問題は、受信者は、ポイントがその地域を通過しない可能性があるので、メッセージが到着するかどうかを知らないことさえあるということです。
また、ポイントの送信元と送信先は、青いポイントと同じである場合があります。
編集:以下の問題を表現する不完全なコードです。
void transfer_points()
{
world.isend(dest, ...);
while (true)
{
mpi::status msg = world.iprobe(any_source, any_tag);
if (msg.count() != 0)
{
world.irecv(any_source, ...);
}
// but how long keep probing?
if (???) {break;}
}
}
基本的に特別な停止メッセージを送信する必要があります。 – Zulan
'MPI_Alltoall()'を使って各プロセスからのメッセージ数を知るにはどうしたらいいですか? – Gilles
転送するポイントがない場合でも常にすべてのネイバーにメッセージを送信することをお勧めします。つまり、すべての受信が常に完了します。これがヌルメッセージであることを示すには、特別なタグを使用するか、MPI_Get_countを使用して着信メッセージの長さを調べることができます。 –