【问题标题】:MPI: Check whether any processes have been terminatedMPI:检查是否有进程被终止
【发布时间】:2020-10-13 18:52:34
【问题描述】:

我正在使用Catch2 为一些使用 MPI 的代码编写单元测试。 Catch2 中的失败测试基本上是带有有用错误消息的失败断言。 现在,在某些情况下,mpirun 似乎无法检测到测试何时仅在一个进程上失败。然后可能会发生死锁。

是否有或多或少优雅的方法来检查代码中的特定点,是否所有进程都还活着?如果不是,所有进程都将终止。

【问题讨论】:

  • 您可以随时要求节点向节点 0 返回与其等级类似的信号。如果其中一些没有响应,那么您就知道出了问题并且应该终止。
  • 嗯.. 你会用什么来做这个?任何集体沟通都会导致再次陷入僵局,因此这是行不通的。你的意思是循环排列并使用类似好的(坏的?)旧的MPI_SendMPI_Recv
  • if (!a) MPI_Abort(1, MPI_COMM_WORLD)替换assert(a)
  • @GillesGouaillardet 这听起来很有希望,谢谢。我将尝试找出如何操纵我的测试库的源代码来做到这一点。希望在包含库之前的#define 可以解决问题。毕竟,它只是标题。

标签: c++ mpi catch2


【解决方案1】:

如果大多数 MPI 启动器发现任何一个等级过早退出而没有调用 MPI_Finalize(),就会终止整个 MPI 作业。如果您的测试失败排名都正常退出并通过调用MPI_Finalize() 清理 MPI 环境,启动器将愉快地继续执行剩余的作业。如果您希望一个失败的等级确定终止整个 MPI 作业,它必须调用MPI_Abort(something, MPI_COMM_WORLD) 调用MPI_Finalize()something 是一个错误代码,根据 MPI 实现,可能成为 MPI 启动器的进程退出代码(在您的情况下为 mpirun)。我不熟悉 Catch2,因此您应该调查如何以及在何处合并对 MPI_Abort 的调用。

如果您希望一个等级的失败测试在所有其他等级的测试中失败,然后允许开始下一个测试,这是一个完全不同的故事。这里的问题是,如果一个或多个 rank 未能通过测试并停止参与通信,而其余的 rank 继续运行,程序可能会进入一种状态,其中存在一些涉及失败的 rank 的通信,这将阻塞,因此导致死锁。 MPI 没有用户可见的超时机制,也没有办法优雅地中断阻塞调用,除非您明确使用非阻塞操作,因此中止整个作业是您的最佳选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多