【发布时间】:2020-04-21 12:07:22
【问题描述】:
我有一个非常简单的 MPI 程序:
int my_rank;
int my_new_rank;
int size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (my_rank == 0 || my_rank == 18 || my_rank == 36){
char hostbuffer[256];
gethostname(hostbuffer, sizeof(hostbuffer));
printf("Hostname: %s\n", hostbuffer);
}
MPI_Finalize();
我在有两个节点的集群上运行它。我有一个 make 文件并使用 mpicc 命令生成 cannon.run 可执行文件。我使用以下命令运行它:
time mpirun --mca btl ^openib -n 64 -hostfile ../second_machinefile ./cannon.run
在 second_machinefile 我有这两个节点的名称。奇怪的问题是,当我从一个节点运行此命令时,它可以正常执行,但是当我从另一个节点运行命令时,我收到错误:
Primary job terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x30
在尝试使用 GDB 调整后,我得到了这个回溯:
#0 0x00007ffff646e936 in ?? ()
from /usr/lib/x86_64-linux-gnu/pmix/lib/pmix/mca_gds_ds21.so
#1 0x00007ffff6449733 in pmix_common_dstor_init ()
from /lib/x86_64-linux-gnu/libmca_common_dstore.so.1
#2 0x00007ffff646e5b4 in ?? ()
from /usr/lib/x86_64-linux-gnu/pmix/lib/pmix/mca_gds_ds21.so
#3 0x00007ffff659e46e in pmix_gds_base_select ()
from /lib/x86_64-linux-gnu/libpmix.so.2
#4 0x00007ffff655688d in pmix_rte_init ()
from /lib/x86_64-linux-gnu/libpmix.so.2
#5 0x00007ffff6512d7c in PMIx_Init () from /lib/x86_64-linux-gnu/libpmix.so.2
#6 0x00007ffff660afe4 in ext2x_client_init ()
from /usr/lib/x86_64-linux-gnu/openmpi/lib/openmpi3/mca_pmix_ext2x.so
#7 0x00007ffff72e1656 in ?? ()
from /usr/lib/x86_64-linux-gnu/openmpi/lib/openmpi3/mca_ess_pmi.so
#8 0x00007ffff7a9d11a in orte_init ()
from /lib/x86_64-linux-gnu/libopen-rte.so.40
#9 0x00007ffff7d6de62 in ompi_mpi_init ()
from /lib/x86_64-linux-gnu/libmpi.so.40
#10 0x00007ffff7d9c17e in PMPI_Init () from /lib/x86_64-linux-gnu/libmpi.so.40
#11 0x00005555555551d6 in main ()
说实话,我并不完全理解。
我的主要困惑是程序从 machine_1 正确执行,它连接到 machine_2 没有错误,并且在两台机器上都初始化了进程。但是当我尝试从 machine_2 执行相同的命令时,它无法连接 machine_1。如果我只在 machine_2 上运行该程序也可以正常运行,同时减少进程数量以使其适合一台机器。
我做错了什么吗?或者我可以尝试更好地理解问题的原因?
【问题讨论】:
-
让 gdb 提供任何有用的信息,您必须编译所有内容以进行调试。
-
@prmottajr 啊,是的,我也需要 mpi 的 -g 标志,对吧?
-
stackoverflow.com/questions/329259/… 有一个答案,显示了如何调试。还要检查 mpi 守护程序是否在节点 1 上运行,这可能会阻止与节点的连接。
-
问题标记为
mpich,但痕迹明显是Open MPI。你确定mpirun,并且所有节点上的 MPI 库都来自相同的供应商和版本吗?我假设您在machine_1上调用mpirun。在这种情况下,如果您只是mpirun --host machine_2 --mca btl ^openib -np 1 ./cannon.run怎么办?作为临时解决方法,您可以尝试export PMIX_MCA_gds=^ds21,然后再试一次您的初始mpirun命令行。 -
gds是一个需要一个组件的 PMIX 框架。可用的有ds12、hash和默认的ds21。由于您面临ds21组件的问题,因此解决方法将其列入黑名单。请注意,您可以通过在您对机器的所有 /.../etc/pmix-mca-params.conf. A better option is to use the latest Open MPI (4.0.2) (it can be installed in your $HOME directory and hence do not requireroot` 访问权限中添加gds = ^ds21来在系统范围内进行更改)
标签: c mpi cluster-computing openmpi