Lassen Sie mich erklären. Betrachte 4 Slave-Knoten 1, 2, 3, 4 und einen Master-Knoten 0. Nun müssen 1, 2, 3, 4 Daten an 0 senden. 0 empfängt diese Daten im folgenden Format.Können in MPI_Send/MPI_Recv-Paaren Daten verloren gehen, wenn sie nicht korrekt synchronisiert sind?
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),
.
.
.
}
}
Offensichtlich ist die Reihenfolge, in der 1, 2, 3 und 4, um die Daten senden 0 kann nicht davon ausgegangen werden (da sie alle unabhängig voneinander arbeiten - 2 können Daten senden, bevor 1). Wenn also angenommen wird, dass 2 seine Daten vor 1 sendet (zum Beispiel), wird die oben gezeigte Empfangsschleife in 0 erst dann ausgelöst, wenn das Quell-Tag 'proc' im MPI_Recv-Befehl an den Prozessor '1' angepasst wurde, weil die For-Schleife forciert diese Bestellung.
Also, was passiert, ist die Schleife 'wartet', bis Daten von 1 ankommen, bevor sie etwas anderes tun können, selbst wenn Daten von 2, 3 und 4 ankommen. Was passiert mit diesen Daten, die von 2,3 ankommen? und 4 wenn es vor 1 ankommt? Kann es in dem Sinne "vergessen" werden, dass, sobald Daten von "1" ankommen und dann proc auf 2 steigt, die Daten, die sie ursprünglich von 2 zu empfangen versucht haben, einfach nicht mehr da sind? Wenn es "vergessen" wird, bleibt die gesamte verteilte Simulation hängen, weil es nie möglich ist, die Daten eines bestimmten Slave-Prozesses korrekt zu verarbeiten.
Danke, Ben.
Eigentlich, in Bezug auf Ihren ersten Kommentar, nein, ich meine nicht unbedingt MPI_INT. Da ich so viele unterschiedliche Datentypen empfangen kann (einschließlich Floats, Integers, Booleans usw.), bevorzuge ich es, alle von ihnen als MPI_CHARs zu erhalten und sie dann auf die erforderlichen Datentypen neu zu interpretieren. Können Sie irgendwelche Probleme mit dieser Methode sehen? ... Danke auch für Ihre anderen Kommentare, ich werde einen Blick auf den MPI_ANY_SOURCE Vorschlag werfen. –
Ah, ich sehe - in diesem Fall ist das Empfangen von MPI_CHAR (oder sogar MPI_BYTE) in Ordnung. – Edric