4

In Socket-Programmierung haben wir select() Funktion, die uns ermöglicht, gleichzeitig mehrere Sockets zu überprüfen. Ich möchte wissen, gibt es eine solche Funktion auch in der MPI-Bibliothek?Was ist äquivalent zu Socket-Programmierung select() in MPI?

In der ersten for-Schleife des folgenden Codes sende ich mehrere nicht blockierende Sende- und Empfangsanforderungen von einem zu jedem anderen Knoten. In der zweiten for-Schleife, statt auf jeden Knoten in sequentieller Reihenfolge zu warten, möchte ich mit der Verarbeitung der Daten des Knotens beginnen, der seine Daten zuerst sendet. Ich möchte wissen, ob es irgendeinen Weg gibt, das zu tun?

for(id=0; id<numtasks; id++){ 
     if(id == taskid) continue; 
     if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
     if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
} 

for(id=0; id<numtasks; id++){ 
     if(id == taskid) continue; 
     if(recvCount[id] != 0){ 
       MPI_Wait(&reqs[id], &status); 
       for(i=0; i<recvCount[id]; i++) 
         splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]); 
     } 
}  

Nach den Antworten, ich habe versucht, meinen Code zu ändern, aber ich bin immer noch während der Laufzeit Segmentation Fault Fehler. Bitte helfen Sie mir, den Fehler herauszufinden.

for(id=0; id<numtasks; id++){ 
     if(id == taskid) continue; 
     if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
     if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
} 

reqs[taskid] = reqs[numtasks-1]; 
for(i=0; i<numtasks-1; i++){ 
     MPI_Waitany(numtasks-1, reqs, &id, &status); 
     if(id == taskid) id = numtasks-1; 
     for(i=0; i<recvCount[id]; i++) 
       splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]); 
} 
+2

Was ist zum Beispiel mit ['MPI_Waitany()'] (https://www.open-mpi.org/doc/v1.8/man3/MPI_Waitany.3.php)? – Gilles

+0

@Gilles Bitte überprüfen Sie meine bearbeitete Frage –

+4

Sorry, aber Ihr Code-Snippet ist nicht klar genug für mich genauer zu sein. Was ich jedoch sagen kann, ist, dass die Verwendung derselben Anfrage sowohl für einen Sende- als auch einen Empfang ein Rezept für ein Desaster ist. Und Sie sollten 'reqs [id]' auf 'MPI_REQUEST_NULL' setzen, nachdem Sie es benutzt haben, und prüfen, ob' id' 'MPI_UNDEFINED' ist bevor Sie es in Ihrer' MPI_Waitany() 'Schleife verwenden ... – Gilles

Antwort

3

Der nächste Äquivalent MPI_Waitsome wäre, bieten Ihnen eine Liste von Anfragen und es kehrt, sobald mindestens eine Anforderung abgeschlossen ist. Es gibt jedoch kein Timeout wie in select. Es gibt auch MPI_Waitany, sowie MPI_Testany, MPI_Testall, MPI_Testsome.

Die Varianten any und some unterscheiden sich hauptsächlich dadurch, wie die Schnittstelle Sie über eine oder mehrere abgeschlossene Anfragen informiert.

Bearbeiten: Sie müssen für jede Operation eine separate Anforderungen verwenden, insbesondere die Sende- und Empfangsvorgänge.

+0

Bitte überprüfen Sie meine bearbeitete Frage. –

+2

Ich habe das in der ursprünglichen Frage nicht gesehen (weil ich nicht rechts geblättert habe), müssen Sie separate Anfragen für senden und empfangen verwenden. Wenn es Ihnen immer noch nicht gelingt, geben Sie bitte [mcve] an. – Zulan

+0

Ja, es hat sehr gut funktioniert! –

Verwandte Themen