7.2 错误处理 |
一个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)
IN function 用户定义的错误处理过程
OUT errhandler MPI错误句柄(句柄)
int MPI_Errhandler_create (MPI_Handler_function *function, MPI_Errhandler *errhandler)
MPI_ERRHANDLER_CREATE ( FUNCTION, ERRHANDLER, IERROR)
EXTERNAL FUNCTION
INTEGER ERRHANDLER, IERROR
被注册的用户例程function,作为一个MPI异常句柄,在errhandler中将一个句柄返回到被注册的异常进程。
建议实现者:返回的句柄可以包含错误处理例程的地址。这个调用在C中是多余的,它存在引用操作符,但在Fortran中是不必要的。(建议实现者结束)
用户例程应该是类型为MPI_Handler_function的C函数,定义如下:
typedef void (MPI_Handler_function) (MPI_Comm *, int *, …)
第一个参数是所用的通信子。第二个是由MPI例程所返回的错误代码。剩下的参数是数字和意义依赖于机器的“stdargs”参数。具体实现应该清晰的将这些参数写在文档中。使用地址,使得可以在Fortran中写句柄。
理由:变量列表被提供,因为它提供一个ANSI标准的钩子,以向错误句柄提供附加信息;没有这个钩子,ANSI C禁止附加参数。(理由结束)
MPI_ERRHANDLER_SET ( comm, errhandler)
IN comm 设置错误句柄的通信子(句柄)
IN errhandler 对于通信子的新的MPI错误句柄(句柄)
int MPI_Errhandler_set (MPI_Comm comm, MPI_ERrhandler errhandler)
MPI_ERRHANDLER_SET ( COMM, ERRHANDLER, IERROR)
INTEGER COMM, ERRHANDLER, IERROR
在调用进程中将新的错误句柄errorhandler与通信子comm相联系。注意错误句柄总是同通信子相联系。
MPI_ERRHANDLER_GET(comm, errhandler)
IN comm 获取错误句柄的通信子(句柄)
OUT errhandler 当前与通信子相连的MPI错误句柄(句柄)
int MPI_Errhandler_get (MPI_Comm comm, MPI_ERrhandler errhandler)
MPI_ERRHANDLER_GET ( COMM, ERRHANDLER, IERROR)
INTEGER COMM, ERRHANDLER, IERROR
在errhandler中返回当前与通信子comm相连的错误句柄。
例:一个库函数可以在它的入口点注册为对于通信子的当前错误句柄,为这个通信子设置它自己私有的错误句柄,并且在退出前面的错误句柄之前恢复。
MPI_ERRHANDLER_FREE ( errhandler)
IN errhandler MPI错误句柄(句柄)
int MPI_Errhandler_free (MPI_Errhandler *errhandler)
MPI_ERRHANDLER_FREE ( ERRHANDLER, IERROR)
INTEGER ERRHANDLER, IERROR
标记与errhandler相联系的错误句柄,以将errhandler释放或设置成MPI_ERRHANDLERNULL。错误句柄将在所有与其相连的通信子释放后被释放。
MPI_ERROR_STRING (errorcode, string, resultlen)
IN errorcode 由MPI例程返回的错误码
OUT string 相应于errorcode的文字
OUT resultlen 在string中所返回结果的长度
int MPI_Error_string (int errorcode, char *string, int *resultlen)
MPI_ERROR_STRING (ERRORCODE, STRING, RESULTLEN, IERROR)
INTEGER ERRORCODE, RESULTLEN, IERROR
CHARACTER *(*) STRING
返回与一错误码相联系的错误串。参数string必须代表至少MPI_MAX_ERROR_STRING字符长的存储空间。
实际上所写的字符数在输出参数resulten中返回。
理由:这个函数形式的选择,使得Fortran和C约束相似。返回一个指向字符串的指针版本,存在两个困难。第一,返回字符串必须静态分配且对于每一错误消息都不同。(允许连续调用MPI_ERROR_STRING所返回的指针,以指向正确的消息)第二,在Fortran中,声明为返回CHARACTER*(*)的函数不能被引用,例如,PRINT语句。(理由结束)
Copyright: NPACT |