@ suszterpatt правильно, заявив, что «процессы MPI работают параллельно полностью». Когда вы запускаете параллельную программу, используя, например, mpirun
или mpiexec
, запускается количество запрошенных вами процессов (с флагом -n
), и каждый процесс начинает выполнение в начале main
. Так в вашем примере код
int main (int argc, char *argv[])
{
//some serial code goes here
parallel_function(arg1, arg2);
//some more serial code goes here
}
каждый процесс будет выполнять части //some serial code goes here
и //some more serial code goes here
(и, конечно, все они будут вызывать parallel_function
). Нет ни одного главного процесса, который вызывает parallel_function
, а затем запускает другие процессы при вызове MPI_Init
.
Как правило, лучше избегать того, что вы делаете: MPI_Init
должен быть одним из первых вызовов функций в вашей программе (в идеале, это должен быть первый). В частности, обратите внимание на следующее (из здесь ):
Стандарт MPI не говорит о том, что может сделать программа до MPI_INIT или после MPI_FINALIZE. В реализации MPICH вы должны делать как можно меньше. В частности, избегайте всего, что изменяет внешнее состояние программы, например открытия файлов, чтения стандартного ввода или записи в стандартный вывод.
Несоблюдение этого требования может привести к неприятным ошибкам.
Лучше переписать ваш код примерно так:
int main (int argc, char *argv[])
{
// Initialise MPI
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
// Serial part: executed only by process with rank 0
if (my_rank==0)
{
// Some serial code goes here
}
// Parallel part: executed by all processes.
// Serial part: executed only by process with rank 0
if (my_rank==0)
{
// Some more serial code goes here
}
// Finalize MPI
MPI_Finalize();
return 0;
}
Примечание : Я не программист на C, поэтому используйте приведенный выше код с осторожностью. Кроме того, main
не должен всегда возвращать что-либо, особенно если определено как int main()
?