2010-11-24 4 views
1

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.

Antwort

3

Erstens, meinst du wirklich, eine MPI_CHAR in chunkP zu erhalten - eine int - sollten Sie nicht eine erhalten?

Die Nachrichten aus den Rängen 1: 4 gehen nicht verloren - sie werden in die Warteschlange eingereiht, bis Rang 0 entscheidet, sie zu empfangen. Dieses Verhalten wird vom MPI-Standard vorgeschrieben.

Wenn die Nachrichten groß genug sind, können Ränge 1: 4 blockieren, bis sie ihre Nachrichten tatsächlich an Rang 0 senden können (die meisten MPI-Implementierungen haben eine begrenzte Pufferung).

Sie könnten auch in Betracht ziehen, Rang 0 haben ein MPI_ANY_SOURCE erhalten für den ersten Empfang zu sehen, wer bereit ist zu senden. Sie müssen jedoch darauf achten, dass nachfolgende Empfänger für die entsprechende Quelle gebucht werden. Sehen Sie in der Struktur MPI_Status nach, woher die Nachricht tatsächlich gesendet wurde.

+0

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. –

+0

Ah, ich sehe - in diesem Fall ist das Empfangen von MPI_CHAR (oder sogar MPI_BYTE) in Ordnung. – Edric

Verwandte Themen