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

时间:2016-09-02 03:59:57

标签: error-handling mpi

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

1 个答案:

答案 0 :(得分:3)

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关联的默认错误处理程序。 I / O   错误通常不是灾难性的(例如,“找不到文件”)   沟通错误,通常的做法是捕捉这些错误和   继续执行。

因此,要明确回答您的问题,如果您想防止代码在出错时崩溃,抓住它们并实施一些应急程序,那么您主要有两个解决方案:

  1. Ad-hoc解决方案:为所需的通信器,文件或窗口设置错误处理程序为MPI_ERRORS_RETURN,并在完成相关的MPI调用后检查错误代码。然后,您必须根据每次返回的确切错误采取措施,请记住,一旦MPI调用内发生错误,无保证任何进一步的MPI调用将成功。事实上,任何随后的MPI调用都有可能崩溃。
  2. 更详细说明:创建一个自定义错误处理程序,可能会在返回或中止之前打印您可能想要查看的额外详细信息或采取进一步的有用操作。您可以创建几个不同的这些并将它们选择性地关联到您想要的通信器,窗口或文件。如果您使用C ++进行编码,您甚至可以考虑创建自己的异常类并以这种方式进行编译。
  3. 但同样,在库中遇到第一个错误后没有保证MPI调用成功的事实极大地限制了可以做的事情的范围,因此大多数时候,默认行为非常适合并且可以是保持不变。