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