2014-12-04 55 views
0

这是一个棘手的问题。我会尽力准确地描述它。我继承了一个Fortran程序,它包含几千行Fortran代码(在一个子例程中),它使用mpi来并行化计算。幸运的是只使用很少的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个CPU与任何测试的细
  • 如果一个人使用多个节点,完全预留节点,即
    • 使用节点1 24的24个CPU它运行细
    • 24 24使用的CPU节点2
  • 但是,当一个被保留的节点仅部分
    • 节点1使用24℃的12档它使用12 24的CPU的

为了更精确脓

  • 节点2,它是被拖延秩= 0的节点。上面的代码在循环中运行,直到if语句的计算结果为false。输出显示代码已经运行好几次了,但之后就发生了。有几个进程正在评估if语句为false并退出循环。但是0级节点评估它为真,并在它调用mpi_gather时停止。

    因此,您可能认为如果没有看到完整的代码就无法回答这个问题,因为肯定会有某些事情导致if语句在0级节点上错误地评估。

    然而,考虑到只要预留节点上的所有处理器,它就可以在单个节点和任意数量的节点上运行任意数量的处理器。

    我对这个问题的看法到目前为止,我的问题:

    1. 是上述MPI调用拦截?我的理解是,上述mpi命令被缓冲,因此虽然某些进程可能会继续执行,但它们的消息会保存在接收器的缓冲区中。所以消息不会丢失。那是对的吗?

    2. 有没有人遇到类似这样的问题?如果不是所有的处理器都被保留,是否失速?我不得不承认我有点失落。我真的不知道从哪里开始调试。任何提示和指针非常感谢。

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

    非常感谢您的帮助。任何想法,不胜感激。

    编辑:这里是我们的系统的更多细节:

    MPI Environenment:MVAPICH2 V1.6
    编译器:英特尔ifort 13.2
    使用的ARPACK库是标准ARPACK,不p_arpack。该代码负责并行化(优化内存使用)

  • +1

    这是p_arpack?在20年之后出现的一个显示停止错误将是非常奇怪的。它被修改了吗?除此之外,是的,收集和广播是集体阻止操作,并且不存在通信被跳过或不按顺序的机会。我认为你将不得不把它缩小到一个[最小的例子](http://stackoverflow.com/help/mcve)。 – 2014-12-05 01:50:58

    +0

    还描述您的系统和MPI实施。当计算机驻留在不同的子网上时,我遇到了OpenMPI 1.8.0的怀疑停顿。 – 2014-12-05 08:20:41

    +0

    感谢您的意见,我在问题中添加了所需的详细信息。 – ftiaronsem 2014-12-05 14:40:30

    回答

    0

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

    再次感谢所有提供意见的人。