Error handling 程序崩溃时如何处理MPI错误

Error handling 程序崩溃时如何处理MPI错误,error-handling,mpi,Error Handling,Mpi,几乎所有MPI例程都返回一个错误处理程序。但是,通信错误通常会在调用MPI例程的位置使程序崩溃,并使错误处理程序无用。在这种情况下,有没有办法捕捉错误?或者,如何在发生灾难性错误时防止程序崩溃,以便我们能够捕获错误?MPI函数在发生错误时的行为与最新标准略有不同。它过去使用MPI_Errhandler{get | set | create}()函数进行管理(从MPI 2.0开始弃用,从MPI 3.0开始删除)。 它现在通过MPI|Comm|Win | File}{get | set | crea

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

MPI函数在发生错误时的行为与最新标准略有不同。它过去使用
MPI_Errhandler{get | set | create}()
函数进行管理(从MPI 2.0开始弃用,从MPI 3.0开始删除)。
它现在通过
MPI|Comm|Win | File}{get | set | create}errhandler()函数进行管理。这使得该管理中的可能调整级别更高

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

  • MPI\u错误是致命的
    ,每当相关MPI调用中发生错误时,它就会中止整个程序;及
  • MPI\u ERRORS\u RETURN
    ,它只是在出现错误时从关联的MPI调用返回相应的错误代码
默认情况下,除了与输入/输出操作相关联的MPI调用外,所有MPI调用都会在发生错误时触发中止。相反,MPI-IO调用通常会从错误中返回相应的错误代码。事实上,该标准的规定性稍差一些,它说:

默认情况下,通信错误是致命的--
MPI\u错误是致命的
是与MPI\u COMM\u WORLD关联的默认错误处理程序。输入输出 错误的灾难性(例如,“未找到fi le”)通常小于 沟通错误,通常的做法是捕捉这些错误并 继续执行

因此,为了清楚地回答您的问题,如果您想要防止代码在出错时崩溃,捕获它们并实现一些应急过程,您主要有两种解决方案:

  • 特别解决方案:将所需通信器、文件或窗口的错误处理程序设置为
    MPI\u ERRORS\u RETURN
    ,并在完成相关MPI调用后检查错误代码。然后,您必须根据每次返回的确切错误采取行动,记住一旦MPI调用中发生错误,就不保证任何后续MPI调用会成功。事实上,对MPI的任何后续调用都有可能崩溃
  • 更详细:创建一个自定义错误处理程序,它可能会打印您可能希望看到的额外详细信息,或者在返回或中止之前执行进一步有用的操作。您可以创建多个不同的窗口,并有选择地将它们与所需的通讯器、窗口或文件相关联。你甚至可以认为,如果你在C++中编码,创建你自己的异常类并用这种方式来提高它们。

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

    MPI函数在出错时的行为与最新标准略有不同。它过去使用
    MPI_Errhandler{get | set | create}()
    函数进行管理(从MPI 2.0开始弃用,从MPI 3.0开始删除)。
    它现在通过
    MPI|Comm|Win | File}{get | set | create}errhandler()函数进行管理。这使得该管理中的可能调整级别更高

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

    • MPI\u错误是致命的
      ,每当相关MPI调用中发生错误时,它就会中止整个程序;及
    • MPI\u ERRORS\u RETURN
      ,它只是在出现错误时从关联的MPI调用返回相应的错误代码
    默认情况下,除了与输入/输出操作相关联的MPI调用外,所有MPI调用都会在发生错误时触发中止。相反,MPI-IO调用通常会从错误中返回相应的错误代码。事实上,该标准的规定性稍差一些,它说:

    默认情况下,通信错误是致命的--
    MPI\u错误是致命的
    是与MPI\u COMM\u WORLD关联的默认错误处理程序。输入输出 错误的灾难性(例如,“未找到fi le”)通常小于 沟通错误,通常的做法是捕捉这些错误并 继续执行

    因此,为了清楚地回答您的问题,如果您想要防止代码在出错时崩溃,捕获它们并实现一些应急过程,您主要有两种解决方案:

  • 特别解决方案:将所需通信器、文件或窗口的错误处理程序设置为
    MPI\u ERRORS\u RETURN
    ,并在完成相关MPI调用后检查错误代码。然后,您必须根据每次返回的确切错误采取行动,记住一旦MPI调用中发生错误,就不保证任何后续MPI调用会成功。事实上,对MPI的任何后续调用都有可能崩溃
  • 更详细:创建一个自定义错误处理程序,它可能会打印您可能希望看到的额外详细信息,或者在返回或中止之前执行进一步有用的操作。您可以创建多个不同的窗口,并有选择地将它们与所需的通讯器、窗口或文件相关联。你甚至可以认为,如果你在C++中编码,创建你自己的异常类并用这种方式来提高它们。
  • 但是,在库中遇到第一个错误后,没有任何MPI调用保证会成功,这一事实极大地限制了可以执行的操作的范围,因此大多数情况下,默认