【问题标题】:MPI communication stalls when node is only partially reserved当节点仅部分保留时,MPI 通信停止
【发布时间】:2015-02-03 01:15:50
【问题描述】:

这是一个棘手的问题。我会尽量准确地描述它。我继承了一个由几千行 fortran 代码(在一个子例程中)组成的 fortran 程序,该程序使用 mpi 来并行化计算。幸运的是它只使用了很少的 mpi 命令,这里是

call mpi_gather(workdr(ipntr(2)),int(icount/total),mpi_double_precision,&
        & workdr(ipntr(2)),int(icount/total),mpi_double_precision,0,mpi_comm_world,mpierr)

call mpi_gather(workdi(ipntr(2)),int(icount/total),mpi_double_precision,&
        & workdi(ipntr(2)),int(icount/total),mpi_double_precision,0,mpi_comm_world,mpierr)

几十行之后是

call mpi_bcast(workdr(istart),j,mpi_double_precision,total-1,&
                       & mpi_comm_world,mpiierr)
call mpi_bcast(workdi(istart),j,mpi_double_precision,total-1,&
                       & mpi_comm_world,mpiierr)                                                                                                   

call mpi_bcast(workdr(ipntr(2)),icount,mpi_double_precision,0,mpi_comm_world,mpiierr)
call mpi_bcast(workdi(ipntr(2)),icount,mpi_double_precision,0,mpi_comm_world,mpiierr)

例程和周围的代码都包含在 if 语句中,该语句在每个等级上进行评估

 call znaupd ( ido, bmat, n, which, nev, tol, resid, ncv,&
 &                 v, ldv, iparam, ipntr, workd, workl, lworkl,&
 &                 rworkl,info )
 if (ido .eq. -1 .or. ido .eq. 1) then
 [...code here...]
 [...mpi code here...]
 [...couple of dozen lines...]
 [...mpi code here...]
 [...code here...]
 end if

这段代码编译编译并产生合理的结果(这是一个物理模拟)

  • 它在单个节点上运行良好,使用 4 到 64 cpus 进行测试
  • 如果一个使用多个节点,它运行良好,完全保留节点,即
    • node1 使用 24 个 CPU,共 24 个
    • node2 使用 24 个 CPU,共 24 个
  • 但是当一个人只保留部分节点时它会停止
    • node1 使用 24 个 CPU 中的 12 个
    • node2 使用 24 个 CPU 中的 12 个

更准确地说,停止的是 rank=0 节点。上面的代码循环运行,直到 if 语句的计算结果为 false。输出显示代码运行了多次,但随后发生了。几个进程将 if 语句评估为 false 并退出循环。但是 rank 0 节点将其评估为 true 并在调用 mpi_gather 时停止。

因此,您可能认为如果不查看完整代码就无法回答这个问题,一定有什么原因导致 if 语句在 0 级节点上被错误地评估。

但是请考虑,只要一个节点上保留所有处理器,它就可以在单个节点上使用任意数量的处理器和任意数量的节点运行良好。

到目前为止我对此的想法和我的问题:

  1. 上述 mpi 调用是否阻塞?我的理解是上面的 mpi 命令是缓冲的,所以当一些进程可能继续执行时,它们的消息被保存在接收器的缓冲区中。所以消息不会丢失。对吗?

  2. 有没有其他人遇到过类似的问题?如果不是所有处理器都被保留,那么会停止吗?我不得不承认我对此有点迷茫。我真的不知道从哪里开始调试。非常感谢任何提示和指针。

此问题已在具有不同编译器和不同 mpi 实现的不同集群上重现。这似乎确实是代码中的一个问题。

非常感谢您的帮助。任何想法都非常感谢。

编辑:以下是我们系统的更多详细信息:

MPI 环境:mvapich2 v1.6
编译器:intel ifort 13.2
使用的 arpack 库是标准的 arpack,而不是 p_arpack。代码负责并行化(优化内存使用)

【问题讨论】:

  • 这是 p_arpack?在 20 年后出现一个停止显示的错误将是非常奇怪的。它被修改了吗?除此之外,是的,收集和广播是集体阻塞操作,并且没有通信被跳过或乱序的机会。我认为您将不得不将其缩减为minimal example
  • 还要描述您的系统和 MPI 实现。当计算机驻留在不同的子网上时,我遇到过 OpenMPI 1.8.0 的可疑停顿。
  • 感谢两位 cmets,我在问题中添加了要求的详细信息。
  • 你使用 Infiniband 吗?
  • 是的,我们有。我们所有的节点都通过直接 Infiniband 互连进行连接。

标签: parallel-processing fortran mpi


【解决方案1】:

原来问题不在代码中。这是mpi的实现!最初我没有想到这一点,因为我在两个不同的集群上运行程序,使用不同的 mpi 实现(mvapich 和 intel mpi)。然而事实证明,两者都来自同一个 8 年的 mpich 实现。在升级到从更新版本的 mpich 派生的更新版本的 mvapich 后,奇怪的行为停止并且代码按预期运行。

再次感谢所有提供 cmets 的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多