我的程序仅仅是对角线某个系统的哈密顿量的过程。我正在尝试通过一个很大的系统,这个系统的计算量很大。实际上,如果我将系统大小增加一个单位,则它超过了LAPACK可以对角线化的最大大小。 (注意:不随单位数量线性缩放)。
我目前正在尝试获得非常高分辨率的结果,这意味着我需要对计算进行平均约10,000次。如果我要保留代码的串行性,大约需要300个小时才能完成,所以我已经并行化了程序。
我已经进行了设置,以使我可以在10个不同的内核上运行1,000个计算,最后将它们组合在一起。我很早以前就这样做了,所以我不认为这是问题所在。
我的问题是,我的代码中似乎有一个错误,导致程序被“卡住”。不幸的是,它仅发生在我的十个CPU中的一个上,每个CPU进行1,000次计算。它可能非常罕见,每10,000个运行中就有1个运行(非常具体的情况)。
我知道它会卡住,因为我的程序中有一个MPI_reduce调用。另外,我输出以筛选每个过程的进度(每完成10%)。我可以确定我的主进程无法通过MPI_reduce继续,因为其他10个进程之一已失败(但未停止)。我可以轻松确定哪个进程失败了。
我没有时间查找和修复错误,因此我正在寻找以下内容:
在Master过程中进行实际计算是否是错误的做法?还是应该让我的主流程在最后进行交流和计算。
如何从程序内部取消一个进程(以便我的主进程可以继续经过MPI_reduce)?
问题2:我的主进程在等待其他进程到达mpi_reduce命令时无法读取任何其他行。
我正在使用OpenMPI和mpifort编译器在Fortran中进行编程。
答案 0 :(得分:1)
使用等级0进行计算并没有错,除非您知道等级0会带来特殊的瓶颈。
如果一个级别卡住,目前无法恢复MPI。
在容错方面已经付出了一些努力,但这主要是为了克服硬件错误。
无论您是否想要,都必须真正修复您的代码。如果您有一个不了解的错误,则所有结果都是毫无价值的(除非您有单独的方法来完全验证结果)。不管这个错误显示为挂起的情况很少。将结果用于科学工作将是不负责任的,除非您有充分的理由证明它不会影响结果。