質問

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top