几乎所有MPI例程都返回错误处理程序。但是,通信错误通常会在调用MPI例程的位置崩溃程序并使错误处理程序无效。有没有办法在这种情况下捕获错误?或者,如何防止程序在发生灾难性错误时崩溃,以便我们能够捕获错误?
答案 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 错误通常不是灾难性的(例如,“找不到文件”) 沟通错误,通常的做法是捕捉这些错误和 继续执行。
因此,要明确回答您的问题,如果您想防止代码在出错时崩溃,抓住它们并实施一些应急程序,那么您主要有两个解决方案:
MPI_ERRORS_RETURN
,并在完成相关的MPI调用后检查错误代码。然后,您必须根据每次返回的确切错误采取措施,请记住,一旦MPI调用内发生错误,无保证任何进一步的MPI调用将成功。事实上,任何随后的MPI调用都有可能崩溃。但同样,在库中遇到第一个错误后没有保证MPI调用成功的事实极大地限制了可以做的事情的范围,因此大多数时候,默认行为非常适合并且可以是保持不变。