-1

次のコードでは:

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 に設定しますか?

4

1 に答える 1

2

セマンティクスが正しいことを投稿したことから少し不明確です-コミュニケーターのすべてのプロセスは を呼び出す必要があります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_BCASTMPI 内には、 (または他の集合通信ルーチンのいずれかの)呼び出しをスコープ間で「一致させる」ためのメカニズムはありません。

あなたの疑似コードは次のようになるはずです

if (myrank == master) then
   do_master_stuff ...
end if

if (myrank /= master) then
   do_worker_stuff ...
end if

! all together now
call mpi_bcast(...)

またはプログラムが必要とするバリアント

于 2012-10-16T21:11:08.063 に答える