parallel-processing - 如何禁用可能卡在 MPI 中的进程
问题描述
我的程序只是对某个系统的哈密顿量进行对角化的程序。我正在尝试通过一个计算量非常大的非常大的系统来工作。事实上,如果我将系统大小增加一个单位,它就会超过 LAPACK 可以对角化的最大大小。(注意:不随单位数线性缩放)。
我目前正在尝试获得非常高分辨率的结果,这意味着我需要平均计算大约 10,000 次。如果我要保持代码串行,大约需要 300 小时才能完成,所以我已经并行化了我的程序。
我已将其设置为在 10 个不同的内核上运行 1,000 次计算,并在最后将它们组合起来。我很久以前就这样做了,所以我不相信这是问题所在。
我的问题是,我的代码中似乎有一个错误导致程序“卡住”。不幸的是,它只发生在我的十个 CPU 中的一个上,每个 CPU 进行 1,000 次计算。它可能在 10,000 次运行中只有 1 次(非常具体的场景)。
我知道它卡住了,因为我的程序中有一个 MPI_reduce 调用。此外,我输出以筛选每个过程的进度(每完成 10%)。我可以确定我的主进程无法继续通过 MPI_reduce,因为其他 10 个进程之一失败(但没有停止)。我可以很容易地确定哪个进程失败了。
我没有时间查找和修复错误,所以我正在寻找以下内容:
对我的主进程进行实际计算是不好的做法吗?还是应该让我的主进程在最后进行通信和计算。
如何从程序中取消一个进程(以便我的主进程可以继续通过 MPI_reduce)?
问题 2:我的主进程在等待其他进程到达 mpi_reduce 命令时无法读取任何其他行。
我正在使用 OpenMPI 和 mpifort 编译器在 Fortran 中编程。
解决方案
除非您知道它会引入特殊的瓶颈,否则使用 0 级进行计算并没有错。
如果一个等级卡住,目前没有办法在 MPI 中恢复。
在容错方面有一些努力,但这主要是为了避免硬件错误。
无论您是否愿意,您都必须真正修复您的代码。如果你有一个你不理解的错误,那么你所有的结果都是毫无价值的(除非你有一个单独的方法来完全验证结果)。这个错误很少表现为挂起并不重要。将结果用于科学工作是不负责任的,除非你能提出强有力的理由证明它不会影响结果。
推荐阅读
- amazon-web-services - Elastic BeanStalk 无法加载 url
- javascript - 在 JavaScript 中是否有一种(接近)线性的方式来按天对数组中的日期进行分组?
- python - pandas/numpy/pure python - 向量加法性能
- python - 如何在捕获 TCP 数据包时在 Python 中使用混杂套接字?
- symfony - Symfony 5 Twig 3 Webpack Encore fulllCalendar 未呈现
- java - 在球衣中发布 +200MB 文件时出错
- c - 如何将结构成员作为引用传递给函数?
- python - Python 文件在 IDLE 中运行,但不是作为 EXE
- powershell - 使用 Power Shell 脚本的 Office 365 电子邮件活动用户报告
- javascript - 从 Angular 的表单组中删除特定的验证器