MPI барьер не работает в петлях - PullRequest
0 голосов
/ 14 мая 2018

В настоящее время я использую библиотеку 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? Если нет, то как мне определить настоящий порядок исполнения? Если да, то как мне правильно использовать барьер?

1 Ответ

0 голосов
/ 17 мая 2018

MPI не упорядочивает ваши выходы правильно по умолчанию. Оператор Barrier, вероятно, работает правильно, отпечатки просто упорядочены для каждого процесса, но не для всех процессов.

...