openmpi:MPI_recv挂起特定数量的进程

时间:2014-12-19 15:10:43

标签: mpi openmpi lustre

我正在运行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等。

如果我使用datels等简单命令,则无法重现此问题。所以我不确定这是我编译的环境或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 个答案:

答案 0 :(得分:2)

首先想到的是:MPI_Recv是一个阻止接收,并将等到匹配的MPI_Send被调用。但是,如果您发送的内容足够小(即,它适合MPI为此类任务预留的缓冲区),则该函数实际上不会等待,而是继续执行代码。对于更高的核心数,您可能会使用每个MPI_Send / MPI_Recv命令发送更少的数据,因此数据适合缓冲区,一切都在继续。由于核心数量较少,缓冲区中的数据太多而MPI_Recv挂起,因为您没有调用适当的MPI_Send来获取信息。一种快速简便的方法来测试这个假设:大大减少问题的大小;是否仍然坚持所有这些核心数量?如果没有,那么这是我的假设的进一步证据,你需要提供更多的代码,以便我们可以看到问题所在。

相关问题