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のために、この標準的な動作ですか?
OK、私は働いている完全なプログラムを入れました。 mpirunが1つ以上のプロセッサで起動されていれば、他の人がMPI_BCASTを呼び出すのを無期限に待つことはできませんが、私のマシン上では、両方のプロセスで終了してtmpの値0で書き込みを行います。 – agrippa
ブロック - ルートは他のランクからの応答を必要としないので、それらを待つことはできません。特に、熱心なメッセージプロトコルでは、ルートはそのメッセージを直ちに送信し、MPI_Bcastを呼び出すまで(他のランクの一部の)バッファに座ります。 –
@Jeremiah:真実ではありません。 MPI標準では、 'Bcast'が戻るまでにルートのバッファの内容がすべてのプロセスにコピーされている必要があります。 @ user631027:あなたのプログラムでは、 'Bcast'でブロック0を処理しますが、プロセス1は直ちに' Finalize'に達し、MPI_COMM_WORLDのサイズを1に減らします。プロセス0は彼が唯一であるため、に放送する。プロセス1がプロセス0のものと一致しない「Bcast」を呼び出す場合、プログラムはハングします。 – suszterpatt