2010-11-24 6 views
1

私を説明させてください。 4つのスレーブノード1,2,3,4とマスタノード0を考えてみましょう。1,2,3,4が0にデータを送信する必要があります。このデータは次の形式で受信されます。 ( - 2が1前にデータを送信することがあり、それらは全て互いに独立して動作しているので)MPI_Send/MPI_Recvペアで、データが正しく同期されないと、データを失う可能性がありますか?

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の前にデータを送信すると仮定すると、MPI_Recvコマンドのソースタグ 'proc'がプロセッサ '1'にマッチするまで、上記の0の受信ループは開始されません。この注文。

2から3のデータがすでに到着していても、何か他のことができる前に、1からデータが到着するまで、ループは '待機'します。2,3から到着したこのデータはどうなりますか1の前に到着すれば4? '1'のデータが到着してからprocが2に増加すると、もともと2から受け取ろうとしていたデータはそれ以上存在しないという意味で「忘れてもよい」ことができますか? 「忘れてしまった」場合は、特定のスレーブプロセスのデータを正しく処理することができないため、分散シミュレーション全体がハングするだけです。

ありがとう、 ベン。

答えて

3

まず、をチャンクに受信することを意味しますか - int - MPI_INTを受け取ってはいけませんか?

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

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

あなたはまた、送信準備が整った人を見るために最初に受信するために、0ランクをMPI_ANY_SOURCE受信すると考えるかもしれません。その後の受信が対応する送信元に送信されるように注意する必要があります。MPI_Status構造体にメッセージが実際に送信された場所を調べます。

+0

実際、あなたの最初のコメントに関して、いいえ、私は必ずしもMPI_INTを意味しません。私はたくさんの異なるデータ型(浮動小数点数、整数、ブール値などを含む)を受け取るので、私はそれらをすべてMPI_CHARとして受け取り、必要なデータ型に再解釈することを好みます。このメソッドの問題は見えますか?他のコメントもありがとうございます。私はdefをMPI_ANY_SOURCEの提案を見ていきます。 –

+0

ああ、私は見る - その場合、MPI_CHAR(またはMPI_BYTE)を受け取っても問題ない。 – Edric

関連する問題