В настоящее время я использую библиотеку MPI C, но, кодируя c ++, я знаю, что функция MPI_Barrier(MPI_COMM_WORLD)
блокирует вызывающую функцию до тех пор, пока все процессы в коммуникаторе не вызовут ее , как в документации . Вот мой код, работающий на 4 процессах.
int WORLD_SIZE = 0;
int WORLD_RANK = 0;
{
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE);
MPI_Comm_rank(MPI_COMM_WORLD, &WORLD_RANK);
MPI_Barrier(MPI_COMM_WORLD);
}
// everything works up till here
// WORLD_SIZE is 4, WORLD_RANK is the current process rank
{
int j = 1;
while (j <= log2(WORLD_SIZE)) {
printf("rank%d at iteration %d\n", WORLD_RANK, j);
MPI_Barrier(MPI_COMM_WORLD);
j++;
}
}
{
MPI_Finalize();
}
Программа выдаёт мне вывод.
rank0 at iteration 1
rank0 at iteration 2
rank1 at iteration 1
rank1 at iteration 2
rank2 at iteration 1
rank2 at iteration 2
rank3 at iteration 1
rank3 at iteration 2
Где я ожидаю следующего из-за барьера.
rank0 at iteration 1
rank1 at iteration 1
rank2 at iteration 1
rank3 at iteration 1
rank0 at iteration 2
rank1 at iteration 2
rank2 at iteration 2
rank3 at iteration 2
Любая помощь приветствуется. Я могу опубликовать больше кода, если это необходимо.
Действительно ли текущий порядок выполнения программы совпадает с текущим выводом std? Если нет, то как мне определить настоящий порядок исполнения? Если да, то как мне правильно использовать барьер?