1

説明させてください。4 つのスレーブ ノード 1、2、3、4 とマスター ノード 0 を考えます。ここで、1、2、3、4 はデータを 0 に送信する必要があります。0 はこのデータを次の形式で受信します。

for(int proc = 1;proc<procCount;proc++) // for each processor cpu (procCount = 5)
{
    for(int p = 0;p<50;p++)
    {

    std::cout<<proc<<"\tA\t"<<p<<std::endl;

    // read in binary datas
   int chunkP;
   int realP;
   real fitnessVal;
   real fitnessValB;
   real fitnessValC;
   int conCount;
   real subConCount;
   real networkEnergyLoss;
   real movementEnergyLoss;
   long spikeCount;

   MPI_Recv (reinterpret_cast < char *>(&chunkP),
      sizeof (chunkP),
                     MPI_CHAR,proc,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
   MPI_Recv (reinterpret_cast < char *>(&realP),
      sizeof (realP),
                        .
                        .
                        .
           }
     }

明らかに、1、2、3、および 4 が 0 にデータを送信する順序を想定することはできません (これらはすべて互いに独立して動作しているため、2 が 1 より前にデータを送信する可能性があるため)。したがって、2 が 1 の前にデータを送信すると仮定すると (たとえば)、上記の 0 の受信ループは、MPI_Recv コマンドのソース タグ 'proc' がプロセッサ '1' に一致するまで開始されません。この順番。

したがって、2、3、4 からデータが到着している場合でも、ループは 1 からデータが到着するまで「待機」します。 1より前に到着?「1」からのデータが到着し始めてから proc が 2 にインクリメントされると、最初に 2 から受信しようとしたデータが単に存在しなくなったという意味で「忘れられた」ことはありますか? それが「忘れられた」場合、特定のスレーブ プロセスのデータを正しく処理できなくなるため、分散シミュレーション全体が停止します。

ありがとう、ベン。

4

1 に答える 1

3

まず、あなたは本当にチャンクPに受け取ることを意味しますMPI_CHARか?intあなたは受け取るべきではありませんMPI_INTか?

ランク1:4のメッセージは失われません。ランク0がメッセージの受信を選択するまで、メッセージはキューに入れられます。この動作は、MPI標準で義務付けられています。

メッセージが十分に大きい場合、ランク1:4は、実際にメッセージをランク0に送信できるようになるまでブロックされる可能性があります(ほとんどのMPI実装ではバッファリングが制限されています)。

また、ランク0MPI_ANY_SOURCEに最初の受信の受信を実行させて、誰が送信する準備ができているかを確認することも検討してください。ただし、対応するソースに対して後続の受信が確実に送信されるように注意する必要があります。MPI_Status構造体を調べて、メッセージが実際に送信された場所を確認してください。

于 2010-11-24T12:19:53.670 に答える