目录
MPI调用会返回一个结果,从它可以知道该调用的执行是否正确。当MPI程序发生错误的时候,会调用相应的例程进行处理。本节内容我们介绍一下MPI与错误处理有关的调用。
一、与错误处理有关的调用
1、MPI_ERRHANDLER_CREATE
MPI_ERRHANDLER_CREATE将用户例程function向MPI注册,作为一个MPI异常句柄,而返回的errhandler是指向该注册例程的句柄。
MPI_ERRHANDLER_CREATE(function, errhandler)
IN function 用户定义的错误处理函数
OUT errhandler 返回的MPI错误句柄(句柄)
//c语言的说明
int MPI_Errhandler_create(MPI_Handler_function *function, MPI_Errhandler *errhandler)
//Fortran语言的说明
MPI_ERRHANDLER_CREATE(FUNCTION, ERRHANDLER, IERROR)
EXTERNAL FUNCTION
INTEGER ERRHANDLER, IERROR
用户例程应该是类型为MPI_Handler_function的函数,在C语言中定义为:
typedef void(MPI_Handler_function)(MPI_Comm *, int *, ...)
第一个参数是所用的通信域,第二个是由MPI例程所返回的错误代码,剩下的参数依赖于具体的实现。
2、MPI_ERRHANDLER_SET
MPI_ERRHANDLER_SET将一个指定的错误句柄errhandler与给定的通信域comm相联系。
MPI_ERRHANDLER_SET(comm, errhandler)
IN comm 设置错误句柄的通信域(句柄)
IN errhandler 新的MPI错误句柄(句柄)
//c语言的说明
int MPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler)
//Fortran语言的说明
MPI_ERRHANDLER_SET(COMM, ERRHANDLER, IERROR)
INTEGER COMM, ERRHANDLER, IERROR
3、MPI_ERRHANDLER_GET
MPI_ERRHANDLER_GET返回与通信域comm相联系的错误句柄errhandler。
MPI_ERRHANDLER_GET(comm, errhandler)
IN comm 获取错误句柄的通信域(句柄)
IN errhandler 返回与通信域相连的MPI错误句柄(句柄)
//c语言的说明
int MPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler)
//Fortran语言的说明
MPI_ERRHANDLER_GET(COMM, ERRHANDLER, IERROR)
INTEGER COMM, ERRHANDLER, IERROR
4、MPI_ERRHANDLER_FREE
MPI_ERRHANDLER_FREE不仅释放掉给定的错误句柄errhandler,并且设置errhandler为MPI_ERRHANDLERNULL。但真正的释放操作是在所有与其相连的通信域都释放后才进行的。
MPI_ERRHANDLER_FREE(errhandler)
IN errhandler MPI错误句柄(句柄)
//c语言的说明
int MPI_Errhandler_free(MPI_Errhandler *errhandler)
//Fortran语言的说明
MPI_ERRHANDLER_FREE(ERRHANDLER, IERROR)
INTEGER ERRHANDLER, IERROR
5、MPI_ERROR_STRING
MPI_ERROR_STRING返回与错误代码相联系的错误字符串string。调用前必须首先为参数string申请至少MPI_MAX_ERROR_STRING字符长的存储空间。
MPI_ERROR_STRING(errorcode, string, resultlen)
IN errorcode 由MPI例程返回的错误码
OUT string 相应于errorcode的字符串
OUT resultlen 在string中所返回字符串的长度
//c语言的说明
int MPI_Error_string(int errorcode, char *string, int *resultlen)
//Fortran语言的说明
MPI_ERROR_STRING(ERRORCODE, STRING, RESULTLEN, IERROR)
INTEGER ERRORCODE, RESULTLEN, IERROR
CHARACTER(*) STRING
6、MPI_ERROR_CLASS
MPI_ERROR_CLASS将错误代码进行解释,转换为相应的错误类,有效的错误类包括如下表所示。
MPI_ERROR_CLASS(errorcode, errorclass)
IN errorcode 由MPI例程返回的错误码
OUT errorclass 相应于errorcode的错误类
//c语言的说明
int MPI_Error_class(int errorcode, int *errorclass)
//Fortran语言的说明
MPI_ERROR_CLASS(ERRORCODE, ERRORCLASS, IERROR)
INTEGER ERRORCODE, ERRORCLASS, IERROR
错误类编码 | 错误类含义 |
MPI_SUCCESS | 无错误 |
MPI_ERR_BUFFER | 无效缓冲区指针 |
MPI_ERR_COUNT | 无效计数参数 |
MPI_ERR_TYPE | 无效数据类型参数 |
MPI_ERR_TAG | 无效标识参数 |
MPI_ERR_COMM | 无效通信域 |
MPI_ERR_RANK | 无效标识数 |
MPI_ERR_REQUEST | 无效请求(句柄) |
MPI_ERR_ROOT | 无效根 |
MPI_ERR_GROUP | 无效组 |
MPI_ERR_OP | 无效操作 |
MPI_ERR_TOPOLOGY | 无效拓扑 |
MPI_ERR_DIMS | 无效维参数 |
MPI_ERR_ARG | 其它无效种类参数 |
MPI_ERR_UNKNOWN | 不知道原因的错误 |
MPI_ERR_TRUNCATE | 接受被截断的消息 |
MPI_ERR_OTHER | 其它的错误 |
MPI_ERR_INTERN | 内部MPI错误 |
MPI_ERR_LASTCODE | 最后标准错误码 |
具体的实现可以自由的定义更多的错误类,然而,应在合适的地方使用标准错误类。错误类满足如下关系:
0=MPI_SUCCESS<MPI_ERR_...≤MPI_ERR_LASTCODE
二、小结
当我们编写的MPI程序出现错误时,利用MPI提供的错误处理设施和错误代码,有助于迅速将错误的性质进行定位,不至于无从下手。