説明させてください。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 から受信しようとしたデータが単に存在しなくなったという意味で「忘れられた」ことはありますか? それが「忘れられた」場合、特定のスレーブ プロセスのデータを正しく処理できなくなるため、分散シミュレーション全体が停止します。
ありがとう、ベン。