MPI работает правильно, как вы сказали - вместо этого ваши предположения неверны. В каждой реализации MPI (которую я использовал в любом случае) вся программа запускается от начала до конца на каждом процессе. Функции MPI_Init и MPI_Finalize необходимы для настройки и демонтажа структур MPI для каждого процесса, но они не указывают начало и конец параллельного выполнения . Начало параллельного раздела - это первая инструкция в main, а конец - окончательный результат.
Хорошей «шаблонной» программой для того, что, как вам кажется, нужно (также ответили в Как решить эту проблему с помощью MPI ):
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;
}