2016-06-30 16 views
0

hatte ich so etwas wieMPI Besetzt Warten auf Antwort

while(j<nOSlaves) 
     { 
      //Iterate through all the slaves. 
      for(int i=1;i<nOSlaves && j<nOSlaves;i++) 
      { 
       //Create a taskMessage which contains length and distance. 
       MPI_Status st; 
       MPI_Recv(&buffer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &st); 

       if (buffer > 0) 
       { //Handle the message.... } 
      } 
     } 

Das Problem ist jetzt, dass ich alle warten, bis die Nachricht eintrifft, ich es schneller wollte und versuchte, es async.

MPI_Irecv(&buffer, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &rq); 

      int flag = 0; 
      MPI_Test(&rq, &flag, &st); 

      //If the asynchronous message has been received advance, else try again later. 
      if (flag) 
      { //Handle the message.... } 

Aber nach jeder Iteration der für werde ich die Anfrage verlieren. Gibt es eine Möglichkeit, alle "Slaves" zu durchlaufen und zu schauen, ob einige bereits beantwortet haben?

+0

Was versuchen Sie eigentlich hier, was ist das größere Kommunikationsmuster? Sieht so aus, als könnten Sie eine Art Kollektiv benutzen, aber die Frage ist nicht klar genug, um richtig zu antworten. – Zulan

Antwort

0

Mit diesem Fehler haben Sie einen Block. Ihre Sende- und Empfangsvorgänge finden nicht gleichzeitig statt.

Also MPI_Irecv ist die nicht blockierende Empfangsfunktion, während MPI_Recv eine Blockierfunktion ist. Da Sie Ihre sendenden Funktionen nicht einschließen, ist es schwierig zu sagen, was die Blockierung hier verursacht (aber angesichts dieser Fehlermeldung ist dies wahrscheinlich der Fall). Ich schlage vor, Hristo Ilieve 's zu betrachten (er scheint hier aktiv zu sein) tutorials. Eines der schwierigsten Dinge in MPI ist das Blockieren. Eine Möglichkeit, um sicherzustellen, dass alles in Ordnung ist, ist die Verwendung von MPI_Barrier, obwohl ich es meistens zum Debuggen verwende. Wenn Sie sich mit der Geschwindigkeit befassen, ist das Übergeben einer einzelnen Ganzzahl keine gute Idee, es sei denn, Sie verwenden sie zur Indexierung. Sie können auch MPI_Scatterv verwenden, wenn Sie ungleiche Chunks aussenden möchten. Wenn Sie den gleichen Abschnitt von buffer senden, der aussieht, als ob Sie es wären, könnten Sie versuchen, MPI_Bcast.

Ich finde, dass es hilft, einige Teile des Codes aufzuschreiben, um sicherzustellen, dass sie sich nicht gegenseitig blockieren.