c++ - MPI:检查是否有进程被终止
问题描述
我正在Catch2
为一些使用 MPI 的代码编写单元测试。失败的测试Catch2
基本上是带有有用错误消息的失败断言。现在,在某些情况下,mpirun
似乎无法检测到测试何时仅在一个进程上失败。然后可能会发生死锁。
是否有任何或多或少优雅的方法来检查代码中的特定点,是否所有进程都还活着?如果不是,则所有进程都将终止。
解决方案
如果大多数 MPI 启动器发现任何一个等级过早退出而没有调用MPI_Finalize()
. 如果您的测试失败排名全部正常退出并通过调用清理 MPI 环境MPI_Finalize()
,启动器将愉快地继续执行剩余的作业。如果您希望一个失败的等级确定终止整个 MPI 作业,它必须在调用MPI_Abort(something, MPI_COMM_WORLD)
之前调用MPI_Finalize()
。something
是一个错误代码,根据 MPI 实现,它可能成为 MPI 启动器的进程退出代码(mpirun
在您的情况下)。我不熟悉 Catch2,因此您应该调查如何以及在何处合并对MPI_Abort
.
如果您希望一个等级的失败测试在所有其他等级的测试中失败,然后允许下一个测试开始,这是一个完全不同的故事。这里的问题是,如果一个或多个 rank 未能通过测试并停止参与通信,而其余的 rank 继续运行,程序可能会进入一种状态,其中存在一些涉及失败的 rank 的通信,这将阻塞,因此导致死锁。MPI 没有用户可见的超时机制,也没有办法优雅地中断阻塞调用,除非您明确使用非阻塞操作,因此中止整个作业是您的最佳选择。
推荐阅读
- mysql - 为什么我的数据库没有更新?(使用netbeans xampp mysql)
- scala - 如何在 Spark(使用 Scala)中用逗号替换空格?
- python - django-admin:在 HostGator 共享主机中找不到用于启动 django 项目的命令
- r - 编写一个函数以将另一个函数包含在回归模型中
- tensorflow - 将多 GPU 与 keras.utils.multi_gpu_model 一起使用时,SageMaker 失败
- r - R Lubridate 默认按字母顺序排列月份和工作日
- shell - 使用 shell 脚本删除一些文本?
- javascript - 映射数组中的对象
- ios - VC之间的数据传递:Objective C
- c++ - C ++ Builder中的未知类型名称“Shape1”