MPI 标准文档第 9.3.5 节指出:
:标记与 errhandler 关联的错误处理程序以进行释放,并将 errhandler 设置为 MPI_ERRHANDLER_NULL。错误处理程序将在与其关联的所有对象(通信器、窗口或文件)被释放后被释放。int MPI_Errhandler_free(MPI_Errhandler *errhandler)
根据那句话,以下模式的正确用法是(C++):
MPI_Errhandler errhandler;
MPI_Comm_create_errhandler(custom_error_handler_func, &errhandler);
MPI_Comm_set_errhandler(comm, errhandler);
MPI_Errhandler_free(&errhandler);
// errhandler goes out of scope here..
}
// A lot of code follows here.. then in another function, an MPI command is called on
// the comm (communicator handle), e.g. MPI_Send():
MPI_Send(
&variable,
/*count=*/1,
/*datatype=*/MPI_DOUBLE,
/*dest_rank=*/0,
/*tag=*/SomeTag,
comm
);
也就是说:即使之前调用了
MPI_Send()
,自定义错误处理程序对于上面的最后一个 MPI_Errhandler_free()
是否会处于活动状态?只是想确认我对文档的解释:只要通信器仍然存在并保留引用,释放错误处理程序是安全的。
所有不透明 MPI 句柄都是这样定义的:
当您不想在 MPI 函数中直接引用它们时,可以立即释放它们。实现需要处理必要的引用计数。
对于错误处理程序,甚至不需要引用计数,因为实现只需将回调函数指针存储在通信器描述符中,之后甚至不需要错误处理程序对象。由于调用约定不同,实现可能还需要存储回调是 C 还是 Fortran。