0

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

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

4

1 回答 1

0

如果大多数 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 没有用户可见的超时机制,也没有办法优雅地中断阻塞调用,除非您明确使用非阻塞操作,因此中止整个作业是您的最佳选择。

于 2020-06-24T10:49:25.407 回答