这是一个棘手的问题。我会尽力准确地描述它。我继承了一个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的
为了更精确脓
因此,您可能认为如果没有看到完整的代码就无法回答这个问题,因为肯定会有某些事情导致if语句在0级节点上错误地评估。
然而,考虑到只要预留节点上的所有处理器,它就可以在单个节点和任意数量的节点上运行任意数量的处理器。
我对这个问题的看法到目前为止,我的问题:
是上述MPI调用拦截?我的理解是,上述mpi命令被缓冲,因此虽然某些进程可能会继续执行,但它们的消息会保存在接收器的缓冲区中。所以消息不会丢失。那是对的吗?
有没有人遇到类似这样的问题?如果不是所有的处理器都被保留,是否失速?我不得不承认我有点失落。我真的不知道从哪里开始调试。任何提示和指针非常感谢。
此问题已在具有不同编译器和不同mpi实现的不同群集上重现。这似乎是代码中的一个问题。
非常感谢您的帮助。任何想法,不胜感激。
编辑:这里是我们的系统的更多细节:
MPI Environenment:MVAPICH2 V1.6
编译器:英特尔ifort 13.2
使用的ARPACK库是标准ARPACK,不p_arpack。该代码负责并行化(优化内存使用)
这是p_arpack?在20年之后出现的一个显示停止错误将是非常奇怪的。它被修改了吗?除此之外,是的,收集和广播是集体阻止操作,并且不存在通信被跳过或不按顺序的机会。我认为你将不得不把它缩小到一个[最小的例子](http://stackoverflow.com/help/mcve)。 – 2014-12-05 01:50:58
还描述您的系统和MPI实施。当计算机驻留在不同的子网上时,我遇到了OpenMPI 1.8.0的怀疑停顿。 – 2014-12-05 08:20:41
感谢您的意见,我在问题中添加了所需的详细信息。 – ftiaronsem 2014-12-05 14:40:30