MPI läuft nach Ihren Angaben korrekt - stattdessen sind Ihre Annahmen falsch. In jeder MPI-Implementierung (die ich jedenfalls benutzt habe) wird das gesamte Programm von Anfang bis Ende auf jede Prozess. Die Funktionen MPI_Init und MPI_Finalize sind erforderlich, um MPI-Strukturen für jeden Prozess auf- und abzubauen, aber sie den Beginn und das Ende der parallelen Ausführung nicht angeben . Der Beginn des parallelen Abschnitts ist die erste Anweisung in main, und das Ende ist die endgültige Rückkehr.
Ein gutes "Vorlagen"-Programm für das, was Sie zu wollen scheinen, wäre (auch beantwortet in Wie kann man dieses Problem mit MPI beschleunigen? ):
int main(int argc, char *argv[]) {
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if (myid == 0) { // Do the serial part on a single MPI thread
printf("Performing serial computation on cpu %d\n", myid);
PreParallelWork();
}
ParallelWork(); // Every MPI thread will run the parallel work
if (myid == 0) { // Do the final serial part on a single MPI thread
printf("Performing the final serial computation on cpu %d\n", myid);
PostParallelWork();
}
MPI_Finalize();
return 0;
}