如何确定MPI通信器是否有效?

时间:2018-09-27 05:29:57

标签: mpi

在我的程序中,我将一些MPI通信器包装到一个数据结构中。不幸的是,有时这种类型的对象的析构函数可能在初始化之前就被调用了。在我的析构函数中,我当然叫MPI_Comm_Free。但是,如果在无效的通信器上调用此代码,则代码将崩溃。

我一直在查看MPI标准,但是找不到用于测试通信器是否有效的函数。我还假设我无法使用MPI_Comm_set_errhandler来尝试捕获免费异常,因为没有有效的通信程序来设置其处理程序。如果通信器有效,我可以保留自己的标志值,但我希望避免重复这样的状态信息。我可以安全地检查通讯器是否有效?

这是一个演示我的问题的基本程序:

#include <mpi.h>
typedef struct {
  MPI_Comm comm;
} mystruct;


void cleanup(mystruct* a) {
  MPI_Comm_free(&(a->comm));
}

int main(int argc, char* argv[]) {
  MPI_Init(&argc, &argv);
  mystruct a;

  /* Some early exit condition triggers cleanup without
     initialization */
  cleanup(&a);
  MPI_Finalize();
  return 0;
}

1 个答案:

答案 0 :(得分:1)

MPI_COMM_NULL是用于无效通信器的常数。但是,您无法确定MPI通信器是否已初始化。在C中,it is impossible to determine if a variable has been initializedNon-static variables start with an indeterminate value, reading it causes undefined behavior

必须MPI_COMM_NULL自己初始化通信器。只有在初始化期间无法创建实际的通信器时,这才有意义。

注意:MPI_Comm_free还将comm设置为MPI_COMM_NULL