質問
WindowsでMPI(MPICH2)を使用したいです。私はこのコマンドを書きます:
MPI_Barrier(MPI_COMM_WORLD);
そして、すべてのグループメンバーがそれを呼ぶまで、すべてのプロセッサをブロックすることを期待しています。しかし、それは起こりません。コードの概略図を追加します。
int a;
if(myrank == RootProc)
a = 4;
MPI_Barrier(MPI_COMM_WORLD);
cout << "My Rank = " << myrank << "\ta = " << a << endl;
(2つのプロセッサを使用):)ルートプロセッサ(0
)正しく動作しますが、ランク1のプロセッサはわかりません a
変数、表示されます -858993460
それ以外の 4
.
誰かが私を助けることができますか?
よろしく
解決
あなたはただ割り当てられています a
プロセス0で0.MPIはメモリを共有していないので、あなたが望むなら a
プロセス1で4の値を取得するには、電話する必要があります MPI_Send
プロセス0から MPI_Recv
プロセス1から。
他のヒント
変数 a
初期化されていません - それがその数を表示する理由です。 MPI、変数 a
プロセス間で複製されているため、には2つの値があります a
, 、その1つは無知です。あなたは書きたい:
int a = 4;
if (myrank == RootProc)
...
または、あるいは、 MPI_send
ルート(ID 0)、および MPI_recv
スレーブ(ID 1)では、ルートの値もスレーブに設定されます。
注:コードは頭の中に小さなアラームをトリガーするので、何かをチェックする必要があります。これをより多くの情報で編集します。それまでは、無知の価値は間違いなくあなたにとって問題です。わかりました、私は事実をチェックしました - あなたのコードは適切にインデントされていなかったので、私は行方不明を逃しました {}
. 。あなたが投稿したスニペットはあまり多くのことをしておらず、奴隷が直接それを入力するので、障壁のあまり良い例ではありませんが、ルートは変数の値をに設定するので、障壁はあまり多くのことをしていません。 4
そして、それを入力します。それが実際に機能することをテストするために、あなたはおそらくプロセスの1つで何らかの睡眠メカニズムを望んでいます - それは他のプロセスをもたらす(それが正しい用語であることを願っています)。 cout
睡眠が終わるまで。
ブロッキングだけでは不十分です, 、他のプロセスにデータを送信する必要があります(共有されていないメモリ プロセス間)。
すべてのプロセスでデータを共有します 使用する:
int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )
だからあなたの場合:
MPI_Bcast(&a, 1, MPI_INT, 0, MPI_COMM_WORLD);
ここでは、&aフォームプロセス0を他のすべてに向けた1つの整数を送信します。 //mpi_bcastは送信者です ルートプロセス用と 受信機 非ルートプロセス用
以下でデータをSpecyficプロセスに送信することもできます。
int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest,
int tag, MPI_Comm comm )
そして、それを受け取ります:
int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)