首页 > 解决方案 > 如何禁用可能卡在 MPI 中的进程

问题描述

我的程序只是对某个系统的哈密顿量进行对角化的程序。我正在尝试通过一个计算量非常大的非常大的系统来工作。事实上,如果我将系统大小增加一个单位,它就会超过 LAPACK 可以对角化的最大大小。(注意:不随单位数线性缩放)。

我目前正在尝试获得非常高分辨率的结果,这意味着我需要平均计算大约 10,000 次。如果我要保持代码串行,大约需要 300 小时才能完成,所以我已经并行化了我的程序。

我已将其设置为在 10 个不同的内核上运行 1,000 次计算,并在最后将它们组合起来。我很久以前就这样做了,所以我不相信这是问题所在。

我的问题是,我的代码中似乎有一个错误导致程序“卡住”。不幸的是,它只发生在我的十个 CPU 中的一个上,每个 CPU 进行 1,000 次计算。它可能在 10,000 次运行中只有 1 次(非常具体的场景)。

我知道它卡住了,因为我的程序中有一个 MPI_reduce 调用。此外,我输出以筛选每个过程的进度(每完成 10%)。我可以确定我的主进程无法继续通过 MPI_reduce,因为其他 10 个进程之一失败(但没有停止)。我可以很容易地确定哪个进程失败了。

我没有时间查找和修复错误,所以我正在寻找以下内容:

  1. 对我的主进程进行实际计算是不好的做法吗?还是应该让我的主进程在最后进行通信和计算。

  2. 如何从程序中取消一个进程(以便我的主进程可以继续通过 MPI_reduce)?

问题 2:我的主进程在等待其他进程到达 mpi_reduce 命令时无法读取任何其他行。

我正在使用 OpenMPI 和 mpifort 编译器在 Fortran 中编程。

标签: parallel-processingfortranopenmpi

解决方案


除非您知道它会引入特殊的瓶颈,否则使用 0 级进行计算并没有错。

如果一个等级卡住,目前没有办法在 MPI 中恢复。

在容错方面有一些努力,但这主要是为了避免硬件错误。

无论您是否愿意,您都必须真正修复您的代码。如果你有一个你不理解的错误,那么你所有的结果都是毫无价值的(除非你有一个单独的方法来完全验证结果)。这个错误很少表现为挂起并不重要。将结果用于科学工作是不负责任的,除非你能提出强有力的理由证明它不会影响结果。


推荐阅读