2016-09-20 1 views
3

Ich bin neu in MPI und dieses Programm wurde in C-Sprache geschrieben. Im folgenden Programm frage ich andere Prozessoren, Nachrichten zu drucken. Aber ich möchte die "END" Nachricht bei Prozess/Rang 0 drucken, nachdem alle diese anderen Prozesse abgeschlossen wurden. Um dieses Programm auszuführen, verwende ich 4 Prozessoren und folgende Befehle mpicc file.c -o objfile und mpirun -np 4 objfile
Bitte zeigen Sie mir mit einem Beispiel, wenn möglich.In MPI, wie das folgende Programm zu machen warte, bis alle Berechnungen abgeschlossen sind

#include <mpi.h> 
#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char** argv) 
{ 
    MPI_Init(&argc, &argv); 
    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 

    int i; 
    double centroid[3];/*ignore this array*/ 

    if (world_rank == 0) 
    { 
     int destination; 
     for (i=0; i<3; i++) 
     { 
      /*Ignore centroid buffer been sent for now*/ 

      destination = i+1;/*destination rank or process*/ 
      MPI_Send(&centroid, 3, MPI_DOUBLE, destination, 0, MPI_COMM_WORLD); 
     } 

     printf("\nEND: This need to print after all MPI_Send/MPI_Recv has been completed\n\n"); 
    } 
    else 
    { 
     MPI_Recv(&centroid, 3, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);   
     sleep(1); /*This represent many calculations that will happen here later, instead of sleep*/ 
     printf("Printing at Rank/Process number: %d\n", world_rank); 
    } 


    MPI_Finalize(); 
    return 0; 
} 

Ergebnis:

END: This need to print after all MPI_Send/MPI_Recv has been completed Printing at Rank/Process number: 2 Printing at Rank/Process number: 3 Printing at Rank/Process number: 1

Bitte diesen Code ändern oder zu mir zeigen, mit einem Beispiel dafür, wie bis all diesen anderen Prozessoren zu warten sind

Antwort

2

Gut gemacht, Du warst fast da. Alles fehlt ein Aufruf an MPI_Barrier() für alle Prozesse. Dies kann auf diese Weise geschehen:

#include <mpi.h> 
#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char** argv) 
{ 
    MPI_Init(&argc, &argv); 
    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 

    int i; 
    double centroid[3];/*ignore this array*/ 

    if (world_rank == 0) 
    { 
     int destination; 
     for (i=0; i<3; i++) 
     { 
      /*Ignore centroid buffer been sent for now*/ 

      destination = i+1;/*destination rank or process*/ 
      MPI_Send(&centroid, 3, MPI_DOUBLE, destination, 0, MPI_COMM_WORLD); 
     } 
     MPI_Barrier(MPI_COMM_WORLD); 
     printf("\nEND: This need to print after all MPI_Send/MPI_Recv has been completed\n\n"); 
    } 
    else 
    { 
     MPI_Recv(&centroid, 3, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);   
     sleep(1); /*This represent many calculations that will happen here later, instead of sleep*/ 
     printf("Printing at Rank/Process number: %d\n", world_rank); 
     MPI_Barrier(MPI_COMM_WORLD); 
    } 


    MPI_Finalize(); 
    return 0; 
} 

Mit dieser Barriere hinzugefügt, gibt den Code auf meinem Laptop:

~/tmp$ mpirun -n 4 ./a.out 
Printing at Rank/Process number: 1 
Printing at Rank/Process number: 2 
Printing at Rank/Process number: 3 

END: This need to print after all MPI_Send/MPI_Recv has been completed 

NB: in diesem Fall wird der Druck der Ränge 1 bis 3 in Ordnung war, aber das ist nur zufällig, da dies in beliebiger Reihenfolge passieren kann. Tatsächlich garantiert der obige Code die Reihenfolge der Aufrufe von printf() zwischen dem Prozess # 0 und den anderen Prozessen, aber es garantiert nicht die Reihenfolge des Drucks auf dem Bildschirm, da Pufferung und dergleichen passieren und Dinge durcheinander bringen können.
Fairerweise sollte es in den meisten Umgebungen (die meiste Zeit) funktionieren. Genau genommen ist dies jedoch nicht garantiert.

+0

Vielen Dank für die klare Nachricht und zeigen mit einem Beispiel. Ich habe eine ähnliche Frage in der folgenden Verbindung, wenn Sie antworten können: http://stackoverflow.com/questions/39967886/how-to-send-receive-in-mpi-using-all-processors –

Verwandte Themen