-1

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プロセッサの場合:)ルートプロセッサ( )は正しく動作しますが、ランク1のプロセッサは変数を0認識しないため、の代わりに表示されます。a-8589934604

誰か助けてもらえますか?
よろしく

4

3 に答える 3

7

プロセス0でのみ割り当てaています。MPIはメモリを共有しないため、プロセス1で値4を取得する場合は、プロセス0とプロセス1からa呼び出す必要があります。MPI_SendMPI_Recv

于 2010-01-13T19:16:40.503 に答える
1

ブロッキングだけでは不十分です。データを他のプロセスに送信する必要があります(メモリはプロセス間で共有されません)。

すべてのプロセス間でデータを共有するには、以下を使用します

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は、ルートプロセスの送信者であり、非ルートプロセスの受信者です

次の方法で、特定のプロセスにデータを送信することもできます。

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)
于 2010-05-04T00:49:22.090 に答える
1

変数aが初期化されていません-それがその番号を表示する理由である可能性があります。MPIでは、変数aはプロセス間で複製されます。したがって、には2つの値がありa、そのうちの1つは初期化されていません。あなたが書きたい:

int a = 4;
if (myrank == RootProc)
...

または、MPI_sendルート(id 0)で、およびMPI_recvスレーブ(id 1)でを実行して、ルートの値もスレーブに設定されるようにします。

注:そのコードは私の頭の中で小さなアラームをトリガーするので、何かをチェックする必要があり、これをより多くの情報で編集します。それまでは、初期化されていない値が問題になることは間違いありません。 事実を確認しました。コードが適切にインデントされておらず、欠落しているものを見逃しました{}。投稿したスニペットはあまり効果がなく、スレーブが直接入力するため、バリアの良い例ではありませんが、ルートは変数の値をに設定してから4入力します。それが実際に機能することをテストするには、おそらく、プロセスの1つにある種のスリープメカニズムが必要です。これにより、他のプロセスも生成され(正しい用語であることが望まれます)、coutスリープが終了するまで印刷されなくなります。

于 2010-01-13T19:15:53.427 に答える