MPI_Errhandler_free()的用法

问题描述 投票:0回答:1

MPI 标准文档第 9.3.5 节指出:

int MPI_Errhandler_free(MPI_Errhandler *errhandler)
:标记与 errhandler 关联的错误处理程序以进行释放,并将 errhandler 设置为 MPI_ERRHANDLER_NULL。错误处理程序将在与其关联的所有对象(通信器、窗口或文件)被释放后被释放。

根据那句话,以下模式的正确用法是(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()
是否会处于活动状态?只是想确认我对文档的解释:只要通信器仍然存在并保留引用,释放错误处理程序是安全的。

c++ mpi
1个回答
0
投票

所有不透明 MPI 句柄都是这样定义的:

当您不想在 MPI 函数中直接引用它们时,可以立即释放它们。实现需要处理必要的引用计数。

对于错误处理程序,甚至不需要引用计数,因为实现只需将回调函数指针存储在通信器描述符中,之后甚至不需要错误处理程序对象。由于调用约定不同,实现可能还需要存储回调是 C 还是 Fortran。

© www.soinside.com 2019 - 2024. All rights reserved.