openmpi: MPI_recv зависает для определенного числа процессов

Я запускаю тест HPC (IOR - http://sourceforge.net/projects/ior-sio/) на блеск. Я скомпилировал исходный код IOR и запустил его с openmpi 1.5.3.

Проблема в том, что зависает при количестве процессов (-np) меньше 6, что странно. Удаляя все остальное, что я делаю, фактическая команда, которую я запускаю, сводится к следующему:

/usr/lib64/openmpi/bin/mpirun --machinefile mpi_hosts --bynode -np 16 /path/to/IOR -F -u -t 1m -b 16g -i 1 -o /my/file/system/out_file

Присоединение процесса к GDB показывает, что процесс зависает в MPI_recv:

#0  0x00007f3ac49e95fe in mlx4_poll_cq () from /usr/lib64/libmlx4-m-rdmav2.so
#1  0x00007f3ac6ce0918 in ?? () from /usr/lib64/openmpi/lib/openmpi/mca_btl_openib.so
#2  0x000000385a6f0d5a in opal_progress () from /usr/lib64/openmpi/lib/libmpi.so.1
#3  0x00007f3ac7511e05 in ?? () from /usr/lib64/openmpi/lib/openmpi/mca_pml_ob1.so
#4  0x000000385a666cac in PMPI_Recv () from /usr/lib64/openmpi/lib/libmpi.so.1
#5  0x0000000000404bd7 in CountTasksPerNode (numTasks=16, comm=0x628a80) at IOR.c:526
#6  0x0000000000407d53 in SetupTests (argc=11, argv=0x7fffe61fa2a8) at IOR.c:1402
#7  0x0000000000402e96 in main (argc=11, argv=0x7fffe61fa2a8) at IOR.c:134

Эта проблема возникает только тогда, когда -np 2/3/4/5. Работает на 1/6/7/8/16 и т. Д.

Я не могу воспроизвести эту проблему, если я использую простые команды, такие как date или же ls, Поэтому я не уверен, является ли это проблемой с моей средой или двоичным файлом IOR, который я скомпилировал (очень маловероятно, потому что то же самое происходит и с более старым / стабильным двоичным файлом IOR).

Также точное поведение наблюдается при использовании openmpi1.4.3 вместо openmpi1.5.3.

Я также пытался с использованием различного количества хостов (--machinefile аргумент) и то же поведение наблюдается для вышеупомянутого -np ценности. Исходная строка, которую он вешает, такова:

MPI_Recv(hostname, MAX_STR, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &status);

В основном я ищу подсказки о том, почему MPI_recv() может зависнуть, когда -np 2/3/4/5. Пожалуйста, дайте мне знать, если нужна другая информация. Благодарю.

1 ответ

Первое, что приходит на ум: MPI_Recv является блокирующим приемом и будет ждать до совпадения MPI_Send называется. Однако если то, что вы отправляете, достаточно мало (т. Е. Оно помещается в буфер, который MPI выделяет для таких задач), то функция фактически не будет ждать и вместо этого продолжит выполнение кода. Для большего количества ядер вы можете отправлять меньше с каждым MPI_Send/MPI_Recv команда, поэтому данные помещаются в буфер, и все продолжается. При меньшем количестве ядер слишком много данных помещается в буфер и MPI_Recv висит как ты не назвал соответствующий MPI_Send чтобы получить информацию. Быстрый и простой способ проверить эту гипотезу: существенно уменьшить размер проблемы; он все еще висит на всех этих основных счетчиках? Если нет, то это еще одно доказательство моей гипотезы, и вам нужно будет предоставить больше кода, чтобы мы могли понять, в чем проблема.

Другие вопросы по тегам