1

我正在 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

此问题仅在-np2/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);

基本上我正在寻找关于为什么在2/3/4/5MPI_recv()时可能会挂起的线索。-np如果需要其他信息,请告诉我。谢谢。

4

1 回答 1

2

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

于 2014-12-19T15:18:05.347 回答