MPI はあなたが言ったことによって正しく実行されています。代わりに、あなたの仮定は正しくありません。すべての MPI 実装 (私がとにかく使用したもの) では、プログラム全体がすべてのプロセスで最初から最後まで実行されます。MPI_Init 関数と MPI_Finalize 関数は、各プロセスの MPI 構造をセットアップおよび破棄するために必要ですが、並列実行の開始と終了を指定しません。並列セクションの先頭はメインの最初の命令であり、最後は最後のリターンです。
あなたが望むように見えるもののための良い「テンプレート」プログラムは次のようになります( 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;
}