程序崩溃时如何处理 MPI 错误
How to handle MPI error when program crashes
几乎所有 MPI 例程return 一个错误处理程序。但是,通信错误通常会在调用 MPI 例程的位置使程序崩溃,并使错误处理程序无用。在这种情况下有没有办法捕获错误?或者,如何在发生灾难性错误时防止程序崩溃,以便我们能够捕获错误?
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
只是 return 来自关联的 MPI 错误调用,以及相应的错误代码。
默认情况下,行为是所有 MPI 调用,但与 Input/Output 操作关联的调用会在出错时触发中止。相反,MPI-IO 调用通常会 return 从错误中获得相应的错误代码。实际上,该标准的规定性较低,并表示:
By default, communication errors are fatal -- MPI_ERRORS_ARE_FATAL
is the default error handler associated with MPI_COMM_WORLD
. I/O
errors are usually less catastrophic (e.g., "file not found") than
communication errors, and common practice is to catch these errors and
continue executing.
所以要明确回答你的问题,如果你想防止代码因错误而崩溃,捕获它们并实施一些应急程序,你主要有两个解决方案:
- 临时解决方案:将错误处理程序设置为
MPI_ERRORS_RETURN
用于您想要的通信器、文件或 window,并在完成关联的 MPI 调用后检查错误代码。然后,您将必须根据每次 returned 的确切错误采取措施,请记住,一旦 MPI 调用中发生错误,无法保证任何进一步的 MPI 调用都会成功。事实上,所有对 MPI 的后续调用都有可能崩溃。
- 更详细:创建一个自定义错误处理程序,它可能会在 return 或中止之前打印您可能希望查看的额外详细信息或采取进一步有用的操作。您可以创建几个不同的这些,并有选择地将它们与通信器、windows 或您想要的文件相关联。如果您使用 C++ 编写代码,您甚至可以考虑创建自己的异常 类 并以这种方式引发它们。
但是,在库中遇到第一个错误后,没有任何 MPI 调用可以保证成功,这一事实极大地限制了可以做的事情的范围,所以大多数时候,默认行为非常适合并且可以保持原状。
几乎所有 MPI 例程return 一个错误处理程序。但是,通信错误通常会在调用 MPI 例程的位置使程序崩溃,并使错误处理程序无用。在这种情况下有没有办法捕获错误?或者,如何在发生灾难性错误时防止程序崩溃,以便我们能够捕获错误?
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
只是 return 来自关联的 MPI 错误调用,以及相应的错误代码。
默认情况下,行为是所有 MPI 调用,但与 Input/Output 操作关联的调用会在出错时触发中止。相反,MPI-IO 调用通常会 return 从错误中获得相应的错误代码。实际上,该标准的规定性较低,并表示:
By default, communication errors are fatal --
MPI_ERRORS_ARE_FATAL
is the default error handler associated withMPI_COMM_WORLD
. I/O errors are usually less catastrophic (e.g., "file not found") than communication errors, and common practice is to catch these errors and continue executing.
所以要明确回答你的问题,如果你想防止代码因错误而崩溃,捕获它们并实施一些应急程序,你主要有两个解决方案:
- 临时解决方案:将错误处理程序设置为
MPI_ERRORS_RETURN
用于您想要的通信器、文件或 window,并在完成关联的 MPI 调用后检查错误代码。然后,您将必须根据每次 returned 的确切错误采取措施,请记住,一旦 MPI 调用中发生错误,无法保证任何进一步的 MPI 调用都会成功。事实上,所有对 MPI 的后续调用都有可能崩溃。 - 更详细:创建一个自定义错误处理程序,它可能会在 return 或中止之前打印您可能希望查看的额外详细信息或采取进一步有用的操作。您可以创建几个不同的这些,并有选择地将它们与通信器、windows 或您想要的文件相关联。如果您使用 C++ 编写代码,您甚至可以考虑创建自己的异常 类 并以这种方式引发它们。
但是,在库中遇到第一个错误后,没有任何 MPI 调用可以保证成功,这一事实极大地限制了可以做的事情的范围,所以大多数时候,默认行为非常适合并且可以保持原状。