次のコードでは:
if (rank==0) master();
else slave();
...
void master()
{
int i=0;
}
...
void slave()
{
int i=1;
MPI_BCAST(&i,1,MPI_INT,0,COMM);
}
スレーブ ノードはマスター ノードで「i(==0)」をブロードキャストし、すべてのスレーブ ノードの「i」値を 0 に設定しますか?
次のコードでは:
if (rank==0) master();
else slave();
...
void master()
{
int i=0;
}
...
void slave()
{
int i=1;
MPI_BCAST(&i,1,MPI_INT,0,COMM);
}
スレーブ ノードはマスター ノードで「i(==0)」をブロードキャストし、すべてのスレーブ ノードの「i」値を 0 に設定しますか?
セマンティクスが正しいことを投稿したことから少し不明確です-コミュニケーターのすべてのプロセスは を呼び出す必要がありますMPI_BCAST
、これはMPIの集合操作の1つです。プログラムは、 の呼び出しでルートを指定したMPI_BCAST
プロセスが、指定されたコミュニケーター内の他のすべてのプロセスにメッセージを送信し、それらのプロセスがメッセージを受信したかのように動作します。
MPI_BCAST
あなたのスニペットは、「スレーブ」プロセスと呼ばれるものでのみ呼び出された場合に呼び出しが成功すると考えていることを示唆していますが、これは正しくありません。
ただし、呼び出しの構文は正しいです。
コメントに応じて編集
私は、すべてのプロセスが を呼び出すコードを実行する必要があると考えていますMPI_BCAST
。あなたが示唆するように、疑似コードが次のような場合:
if (myrank == master) then
do_master_stuff ...
call mpi_bcast(...)
end if
if (myrank /= master) then
call mpi_bcast(...)
do_worker_stuff ...
end if
その後、呼び出しは失敗します。ジョブ管理またはオペレーティング システムがそれを認識して削除するまで、プログラムが停止する可能性があります。MPI_BCAST
MPI 内には、 (または他の集合通信ルーチンのいずれかの)呼び出しをスコープ間で「一致させる」ためのメカニズムはありません。
あなたの疑似コードは次のようになるはずです
if (myrank == master) then
do_master_stuff ...
end if
if (myrank /= master) then
do_worker_stuff ...
end if
! all together now
call mpi_bcast(...)
またはプログラムが必要とするバリアント