MPI_Barrier — только некоторые процессы проходят через барьер

Я столкнулся с ситуацией, когда только некоторые процессы обходят функцию MPI_Barrier.

Проблема появляется в этом фрагменте кода:

printf("[%d] Before barrier\n", mpi_rank);
fflush(stdout);
MPI_Barrier(MPI_COMM_WORLD);
printf("[%d] After barrier\n", mpi_rank);
fflush(stdout);
sleep(1);

После запуска с 4 процессами у меня есть следующий вывод:

[3] Before barrier
[2] Before barrier
[0] Before barrier
[1] Before barrier
[1] After barrier

И приложение зависает.

Я ожидал, что все процессы смогут напечатать сообщение [id] After barrier, но только процесс 1 напечатал его.

Почему не все процессы проходят барьер?

Я ожидал вывода вроде:

[3] Before barrier
[2] Before barrier
[0] Before barrier
[1] Before barrier
[1] After barrier
[0] After barrier
[2] After barrier
[3] After barrier

Я использую openmpi с Centos внутри докера. Приложение запускает несколько потоков, но показанный фрагмент не входит ни в один из них.


person dv_    schedule 07.06.2016    source источник
comment
Пожалуйста, объясните, почему вы думаете, что проблема как-то связана с барьером. Мне кажется, что все четыре процесса достигли барьера, после чего процесс 1 смог продолжиться. То, что происходит после этого, не имеет ничего общего с барьером.   -  person user3386109    schedule 08.06.2016
comment
Ok. Вопрос отредактирован, объясняя ожидаемый результат. Спасибо.   -  person dv_    schedule 08.06.2016
comment
Пока что невозможно что-то сказать, потому что вы не приводите минимальный рабочий пример, воспроизводящий проблему. В самом фрагменте кода нет ничего плохого. Таким образом, первое подозрение заключается в том, что такое поведение связано с какой-то другой частью кода (например, вы могли заранее вызвать неблокирующий барьер для других процессов, который теперь соответствует этому вызову MPI_Barrier для процесса 1). Работает ли он с разным количеством процессов? Может дело в окружении, на других системах работает? Что вы имеете в виду под несколькими потоками?   -  person haraldkl    schedule 08.06.2016
comment
@haraldkl, В отличие от двухточечных операций, неблокирующие коллективные операции не совпадают с блокирующими коллективными операциями - прямо из стандарта MPI.   -  person Hristo Iliev    schedule 08.06.2016
comment
Вам обязательно нужно предоставить минимальный воспроизводимый пример.   -  person Zulan    schedule 08.06.2016
comment
@HristoIliev да, хорошо, извини, не перепроверил. Ну, по крайней мере, так быть не должно ;)   -  person haraldkl    schedule 08.06.2016
comment
@HristoIliev Допустим, я размещаю неблокирующий барьер на подмножестве рангов коммуникатора. Затем я ставлю блокирующий барьер на этом коммуникаторе. Это была бы неправильная программа MPI, верно? Теперь неопределенное поведение может включать то, что предложил haraldkl, или?   -  person Zulan    schedule 08.06.2016
comment
@Zulan, порядок коллективных вызовов (блокирующий или не блокирующий) на данном коммуникаторе должен быть одинаковым во всех рангах, поэтому такой сценарий, как описанный вами, действительно является ошибочным по стандарту. Если OP на самом деле не делает что-то беспорядочное, я бы больше поддержал гипотезу о том, что это еще один случай неправильно настроенных сетевых интерфейсов (Open MPI очень подвержен этому).   -  person Hristo Iliev    schedule 08.06.2016


Ответы (1)


У меня были похожие проблемы, начал искать в Интернете. Я обнаружил, насколько я понимаю, что реализация MPI_Barrier в OpenMPI может содержать ошибки, в зависимости от конкретной версии.

https://github.com/open-mpi/ompi/issues/3042

MPI_Barrier работает неправильно

person Stefan Jaumann    schedule 08.07.2017