【问题标题】:How to handle MPI error when program crashes程序崩溃时如何处理 MPI 错误
【发布时间】:2016-09-02 14:47:59
【问题描述】:

几乎所有 MPI 例程都返回错误处理程序。但是,通信错误通常会在调用 MPI 例程的地方使程序崩溃,并使错误处理程序无用。在这种情况下有没有办法捕捉错误?或者,如何防止程序在发生灾难性错误时崩溃,以便我们能够捕捉到错误?

【问题讨论】:

标签: error-handling mpi


【解决方案1】:

MPI 函数在出错时的行为随着最新标准略有改变。它曾经使用MPI_Errhandler_{get|set|create}() 函数进行管理(自 MPI 2.0 起已弃用,自 MPI 3.0 起已删除)。
它现在通过MPI_{Comm|Win|File}_{get|set|create}_errhandler() 函数进行管理。这为管理提供了更大程度的可能调整。

所有 MPI 库都提出了两个预定义的错误处理程序(尽管也可以提出更多):

  • MPI_ERRORS_ARE_FATAL 在关联的 MPI 调用中发生错误时中止整个程序;和
  • MPI_ERRORS_RETURN 简单地从关联的 MPI 调用中返回错误,并带有相应的错误代码。

默认情况下,行为是所有 MPI 调用,但与输入/输出操作关联的调用会在发生错误时触发中止。相反,MPI-IO 调用通常会从错误中返回并带有相应的错误代码。实际上,该标准的规定性稍差,并说:

默认情况下,通信错误是致命的——MPI_ERRORS_ARE_FATAL 是与MPI_COMM_WORLD 关联的默认错误处理程序。输入输出 错误通常不如灾难性(例如,“找不到文件”) 通信错误,通常的做法是捕获这些错误并 继续执行。

因此,为了明确回答您的问题,如果您想防止代码因错误而崩溃,抓住它们并实施一些应急程序,您主要有两种解决方案:

  1. 临时解决方案:将错误处理程序设置为您想要的通信器、文件或窗口的MPI_ERRORS_RETURN,并在完成相关的 MPI 调用后检查错误代码。然后,您必须根据每次返回的确切错误采取措施,记住一旦在 MPI 调用中发生错误,无法保证任何进一步的 MPI 调用都会成功。事实上,任何后续对 MPI 的调用都有可能崩溃。
  2. 更详细:创建一个自定义错误处理程序,它可能会在返回或中止之前打印您可能希望查看或采取进一步有用操作的额外详细信息。您可以创建几个不同的,并有选择地将它们与您想要的通信器、窗口或文件相关联。如果您使用 C++ 编码,您甚至可以考虑创建自己的异常类并以这种方式引发它们。

但同样,在库中遇到第一个错误后不能保证 MPI 调用成功这一事实极大地限制了可以执行的操作范围,因此大多数情况下,默认行为非常适合并且可以保持原样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多