MPI_SEND / MPI_RECVペアでは、データが正しく同期されない場合、データを失う可能性がありますか?

StackOverflow https://stackoverflow.com/questions/4265693

質問

説明させてください。 4つのスレーブノード1、2、3、4、およびマスターノード0を考慮してください。現在、1、2、3、4にデータを送信する必要があります。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」からのデータが到着を開始してから2に増加すると、元々2から受け取ったデータはもうありませんか? 「忘れられた」場合、分散シミュレーション全体がハングアップします。これは、特定の奴隷プロセスのデータを正しく処理できなくなることはないためです。

ありがとう、ベン。

役に立ちましたか?

解決

まず、あなたは本当に受け取るつもりですか MPI_CHAR chunkpに - an int - 受け取ってはいけません MPI_INT?

ランク1:4からのメッセージは迷子になりません - ランク0がそれらを受信することを選択するまで、彼らはキューになります。この動作は、MPI標準によって義務付けられています。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top