【问题标题】:How to determine if an MPI communicator is valid?如何确定 MPI 通信器是否有效?
【发布时间】:2018-09-27 17:14:44
【问题描述】:

在我的程序中,我将一些 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;
}

【问题讨论】:

    标签: mpi


    【解决方案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

    【讨论】:

    • 谢谢,这很有道理!
    猜你喜欢
    • 2020-03-23
    • 2016-04-16
    • 2012-06-08
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2012-07-08
    • 2012-11-27
    相关资源
    最近更新 更多