1
MPI_Recv(または同等の)呼び出しにソースのリストを渡すことは可能ですか?現在、私のコードは次のようになっています:ソースのリストを含むMPI_Recv
do i=nod1,nod2
call mpi_recv(tmp,n,MPI_REAL,MPI_ANY_SOURCE,tag,MPI_COMM_WORLD,status,ierr)
... do stuff with tmp here
call mpi_send(tmp,n,MPI_REAL,status(MPI_SOURCE),tag,MPI_COMM_WORLD,ierr)
enddo
もちろん、これは私の望むことを保証するものではありません。 (nod2が1つのメッセージを送信する前にnod1がここで2つのメッセージを送信した場合、nod2のメッセージはこの繰り返し中に受信されないため、悪いことになります)。互いに(十分に)同期されていてください...しかし、それは受け取られるのを許されているprocsのリストを指定する方法があるかどうか疑問に思っています。
私はそれについて疑問に思っています... MPI_Probeはメッセージに関する情報を一度だけ返すことを保証していますか?それが「悪いメッセージ」を調べて受信するとどうなりますか?それから私は "良い"メッセージが見つかるまで再度調査しなければなりませんが、 "悪い"メッセージに関する情報を返すことはありませんか? – mgilson
基本的に、プローブが何をしているのかは、あなたがRecvを呼び出した場合に起こったことを教えてくれます。しかし、メッセージは破棄されず、MPI内のメッセージは追い越されないため、繰り返されるプローブは同じメッセージを何度も繰り返し調査します。これが問題であれば、いつでも受信したいすべてのランクをループし、個別に調べることができます。 – suszterpatt
ええ、私はそれを行うことができますが、MPI_Probeがブロックしているので問題があります - MPI_Probeにproc番号を指定すると、私はもう一度、受信したメッセージの順序を強制します。私は唯一の解決策はN個のMPI_Iprobes(各procに1つ)を投稿し、それらのプローブが戻ってきたかどうかをテストすることです - これは簡単な方法です。 – mgilson