MPI_SEND / MPI_RECVペアでは、データが正しく同期されない場合、データを失う可能性がありますか?
-
27-09-2019 - |
質問
説明させてください。 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。