2011-07-11 21 views
5

MPI_BCASTを呼び出すときに、暗黙の同期はありますか?たとえば、送信者プロセスがMPI_BCASTに到達する前に、他の人がBCASTを実行してから、何も確認せずに続行できるかどうかを確認します。以下のようなコードを使用していくつかの最近のテスト:送信者と受信者のMPI_BCASTとの暗黙の同期

program test 
include 'mpif.h' 

integer ierr, tid, tmp 

call MPI_INIT(ierr) 
call MPI_COMM_RANK(MPI_COMM_WORLD, tid, ierr) 

tmp = tid 

if(tid.eq.0) then 
    call MPI_BCAST(tmp,1,MPI_INTEGER,MPI_ROOT,MPI_COMM_WORLD, ierr) 
else 

endif 

write(*,*) tid,'done' 
call MPI_FINALIZE(ierr) 

end 

2つのスレッドで、彼らは両方のMPI_BCASTへの呼び出しを行っている送信者だけにもかかわらず、完成に到達することを示しています。

出力:

1 done   0 
0 done   0 

が、これは私が(MPICH)で働いているMPIのインストールに問題がある、またはMPIのために、この標準的な動作ですか?

答えて

1

Bcastは、集合的な通信呼び出しであり、そのようなブロックです。より正確には、指定されたコミュニケータのすべてのプロセスが一致する呼び出しを行ってからBcastになるまでブロックし、その時点で通信が行われ、実行が継続されます。

あなたのコードはデバッグの目的ではあまりにも単純です。問題を示す最小限の実例を投稿できますか?

+0

OK、私は働いている完全なプログラムを入れました。 mpirunが1つ以上のプロセッサで起動されていれば、他の人がMPI_BCASTを呼び出すのを無期限に待つことはできませんが、私のマシン上では、両方のプロセスで終了してtmpの値0で書き込みを行います。 – agrippa

+0

ブロック - ルートは他のランクからの応答を必要としないので、それらを待つことはできません。特に、熱心なメッセージプロトコルでは、ルートはそのメッセージを直ちに送信し、MPI_Bcastを呼び出すまで(他のランクの一部の)バッファに座ります。 –

+1

@Jeremiah:真実ではありません。 MPI標準では、 'Bcast'が戻るまでにルートのバッファの内容がすべてのプロセスにコピーされている必要があります。 @ user631027:あなたのプログラムでは、 'Bcast'でブロック0を処理しますが、プロセス1は直ちに' Finalize'に達し、MPI_COMM_WORLDのサイズを1に減らします。プロセス0は彼が唯一であるため、に放送する。プロセス1がプロセス0のものと一致しない「Bcast」を呼び出す場合、プログラムはハングします。 – suszterpatt

0

少なくともルート(送信)プロセスでは、MPI_BcastNOTブロックであることを証明できます。あなたのプログラムがブロックされていることを確実にしたい場合は、すぐにMPI_Barrierに電話する必要があります。私は最近、誤ってルートプロセスのためにMPI_Bcast(集合的にではなく)と呼び、プログラムの実行は、古いバッファが新しい別のものに受信されたMPI_BcastへのNEXTの無関係の呼び出しバッファ。このバッファのデータ型/長さのミスマッチがガーベジ・データを生成し、そのバグを見つけるまでにしばらく時間がかかりました。

+1

こんにちはMasterHD、私はあなたが観察した行動の理由と私が元々質問を投稿する原因となった行動は同じであると信じています。 MPI_Bcastは、集合的なMPI操作です。つまり、MPI標準によってすべてのランクが参加しなければならないということを意味します。そうであれば、MPI_Bcastはブロック動作です。そうでない場合、MPIプログラムは標準に準拠していないため、未定義の動作が表示されます。私たちの両方のケースでは、その未定義の振る舞いは、何も間違っていないかのように、プログラムが楽しく進行していたことでした。 – agrippa

+0

私が作ろうとしてきたのは、 'MPI_Bcast'が本当に**ブロッキング**の方法だった場合、それを呼び出すだけで、ルートプロセスはただちにそのルートプロセスをハングアップさせ、それを続行させないことです。それはあなたの質問なのですか? – MasterHD

+1

また、@MasterHD、あなたの 'MPI_Bcast'呼び出しが送信しようとしていた十分に大きなバッファを持っていたならば、おそらくはルートプロセスもブロックしていたでしょう。内部でバッファされた少量のデータを送信していた可能性があるため、完了しました。 –

関連する問題