2012-10-10 3 views
6

私は、問題が解決するまで「n」個のプロセスを処理する必要があるプロジェクトを持っています。各スレーブプロセスは同じコードを実行します。特定の条件が発生した場合、プロセスは他のすべてのプロセスにノンブロッキングの方法で通知する必要があります。他のプロセスも、このメッセージをノンブロッキングで受信する必要があります。MPI - 非同期ブロードキャスト/ギャザー

別々のループをスレッドしないで行う方法はありますか?

答えて

4

私はMPIを使用して以来、しばらくしています。しかし、 I関数は非ブロック化です。多分このような何か:

int comm_size = comm.Get_size(); 
int comm_rank = comm.Get_rank(); 

int* data = new int[comm_size]; 

while (some_condition) 
{ 
    //During each iteration, check for messages from other nodes 
    for (int node = 0; node < comm_size; node++) 
    { 
     if (node != comm_rank) 
     { 
      if (comm.Iprobe(node, TAG_NUM)) 
      { 
       comm.Irecv(data[node], 1, MPI_INT, node, TAG_NUM); 
      } 
     } 
    } 

    if (some_other_condition) 
    { 
     //Send the message to every node 
     for (int node = 0; node < comm_size; node++) 
     { 
      if (node != comm_rank) 
      { 
       comm.Isend(data[node], 1, MPI_INT, node, TAG_NUM); 
      } 
     } 
    } 

    //do normal work here. 
} 

delete [] data; 
+0

それはまさに私がやったことです。私はこれをまだループスルーしてすべてのメッセージを送信する必要があるので、この非効率的な非同期を考慮しませんが、それは私がやっていることに十分です。ありがとう。 – xxf8xx

+0

私は同様の問題を抱えています。データを非同期でブロードキャストします(すべてのコアのデータが最新であることは重要ではありません)。提案された実装で問題となるのは、多くの帯域幅を使用するということです。各メッセージはp-1回送信されます。ネットワーク上で可能な限り安価にメッセージを送信する(ビットマスクなど)方法はありません(たとえば、スイッチを使用している場合、スイッチは複製作業を実行できます)。私はMPJ Expressを使用しています。 –