2012-04-17 8 views
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のリストを指定する方法があるかどうか疑問に思っています。

答えて

1

そうではありません。ただし、MPI_Probe()MPI_ANY_SOURCEを使用して、statusオブジェクトのMPI_SOURCEフィールドと受信したいプロセスのリストを比較することができます。一致するものがある場合は、通常のブロック受信でそのソースから受信することができます。

+0

私はそれについて疑問に思っています... MPI_Probeはメッセージに関する情報を一度だけ返すことを保証していますか?それが「悪いメッセージ」を調べて受信するとどうなりますか?それから私は "良い"メッセージが見つかるまで再度調査しなければなりませんが、 "悪い"メッセージに関する情報を返すことはありませんか? – mgilson

+0

基本的に、プローブが何をしているのかは、あなたがRecvを呼び出した場合に起こったことを教えてくれます。しかし、メッセージは破棄されず、MPI内のメッセージは追い越されないため、繰り返されるプローブは同じメッセージを何度も繰り返し調査します。これが問題であれば、いつでも受信したいすべてのランクをループし、個別に調べることができます。 – suszterpatt

+0

ええ、私はそれを行うことができますが、MPI_Probeがブロックしているので問題があります - MPI_Probeにproc番号を指定すると、私はもう一度、受信したメッセージの順序を強制します。私は唯一の解決策はN個のMPI_Iprobes(各procに1つ)を投稿し、それらのプローブが戻ってきたかどうかをテストすることです - これは簡単な方法です。 – mgilson

関連する問題