7.2 错误处理

BACKWARD FORWARD


一个MPI实现不能或可以不选择处理一些MPI调用过程中的错误。这些包括产生异常或自陷的错误,例如浮点溢出或访问异常。由MPI处理的错误集是依赖于实现的。每一这样的错误产生一个MPI异常。

用户可以将错误句柄同通信子相联系。被说明的错误处理进程将用于任何MPI异常,此异常是在调用MPI以同这个通信子通讯期间发生的。将任何通信子不相关的MPI调用考虑成与通信子MPI_COMM_WORLD相联系。将错误句柄与通信子相联系是纯局部的:不同的进程可以将不同的句柄联系到同一通信子上。

一个新创建的通信子继承了与其“父亲”通信子相联系的错误句柄。尤其是,用户可以通过初始化后,立即将句柄与MPI_COMM_WORLD相连,来说明用于所有通信子的“全局”句柄。

在MPI中可以得到几个预定义的错误句柄:

MPI_ERRORS_ARE_FATAL 当调用时,此句柄引起程序退出所有的执行进程。如果嵌入到句柄中的进程调用MPI_ABORT,将产生同样的效果。

MPI_ERRORS_RETURN 该句柄没有作用

具体实现可以提供附加的预定义错误句柄,并且程序员可对自己的错误句柄编程。

错误句柄MPI_ERRORS_ARE_FATAL在初始化后,缺省与MPI_COMM_WORLD相连。所以,如果用户不选择控制错误句柄,那么由MPI处理的每一错误句柄都认为是致命的。由于所有的MPI调用都返回错误码,用户可以通过测试MPI调用的返回码,以及在调用不成功时执行以适当的恢复代码,来选择在主代码中处理错误。在这种情况,将使用错误句柄MPI_ERRORS_RETURN。通常在每一MPI调用后,不测试错误是更方便和有效的,并且由一个非繁琐的MPI错误句柄来处理这种错误。

在检测到一个错误后,MPI状态没定义。 即,通过使用用户定义的错误句柄,或用MPI_ERRORS_RETURN,在检测到一个错误时,没有必要允许用户继续使用MPI。这些错误句柄意在允许一个用户发布用户定义的错误消息,以及在程序退出前采取与MPI不相关的动作(例如刷新I/O缓冲区)。一个MPI实现可以在错误后自由的允许MPI继续,但不要求这么做。

MPI错误句柄是一个不透明目标,可以被一个句柄访问。MPI用来创建新的错误句柄,将错误句柄同通信子相联系,以及测试哪一个错误句柄与通信子相联系。

MPI_ERRHANDLER_CREATE ( function, errhandler)

int MPI_Errhandler_create (MPI_Handler_function *function, MPI_Errhandler *errhandler)

MPI_ERRHANDLER_CREATE ( FUNCTION, ERRHANDLER, IERROR)

被注册的用户例程function,作为一个MPI异常句柄,在errhandler中将一个句柄返回到被注册的异常进程。

用户例程应该是类型为MPI_Handler_function的C函数,定义如下:

typedef void (MPI_Handler_function) (MPI_Comm *, int *, …)

第一个参数是所用的通信子。第二个是由MPI例程所返回的错误代码。剩下的参数是数字和意义依赖于机器的“stdargs”参数。具体实现应该清晰的将这些参数写在文档中。使用地址,使得可以在Fortran中写句柄。

MPI_ERRHANDLER_SET ( comm, errhandler)

int MPI_Errhandler_set (MPI_Comm comm, MPI_ERrhandler errhandler)

MPI_ERRHANDLER_SET ( COMM, ERRHANDLER, IERROR)

在调用进程中将新的错误句柄errorhandler与通信子comm相联系。注意错误句柄总是同通信子相联系。

MPI_ERRHANDLER_GET(comm, errhandler)

int MPI_Errhandler_get (MPI_Comm comm, MPI_ERrhandler errhandler)

MPI_ERRHANDLER_GET ( COMM, ERRHANDLER, IERROR)

在errhandler中返回当前与通信子comm相连的错误句柄。

例:一个库函数可以在它的入口点注册为对于通信子的当前错误句柄,为这个通信子设置它自己私有的错误句柄,并且在退出前面的错误句柄之前恢复。

MPI_ERRHANDLER_FREE ( errhandler)

int MPI_Errhandler_free (MPI_Errhandler *errhandler)

MPI_ERRHANDLER_FREE ( ERRHANDLER, IERROR)

标记与errhandler相联系的错误句柄,以将errhandler释放或设置成MPI_ERRHANDLERNULL。错误句柄将在所有与其相连的通信子释放后被释放。

MPI_ERROR_STRING (errorcode, string, resultlen)

int MPI_Error_string (int errorcode, char *string, int *resultlen)

MPI_ERROR_STRING (ERRORCODE, STRING, RESULTLEN, IERROR)

返回与一错误码相联系的错误串。参数string必须代表至少MPI_MAX_ERROR_STRING字符长的存储空间。

实际上所写的字符数在输出参数resulten中返回。


Copyright: NPACT BACKWARD FORWARD