mpi - 如何判断MPI通讯器是否有效?

标签 mpi

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

我一直在研究 MPI 标准,但找不到测试通信器是否有效的函数。我还假设我无法使用 MPI_Comm_set_errhandler 来 try catch 免费异常,因为没有有效的通信器来设置处理程序。如果通信器有效,我可以维护自己的标志值,但我更愿意避免重复这样的状态信息。是否有任何内置方法可以安全地检查通信器是否有效?

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

#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_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

关于mpi - 如何判断MPI通讯器是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52529988/

相关文章:

mpi - 如何确定套接字/节点本地的 MPI 等级/进程号

cuda - 了解 "nvidia-smi topo -m"输出

c++ - 在单个 Raspberry-Pi 上使用 MPI

c++ - 串行代码的并行 MPI 实现

c - mpi_comm_spawn 错误 : MPI Application rank 0 killed before MPI_Finalize() with signal 11

c++ - Linux下如何检测另一个进程并与其通信?

c - MPI_等待: Request pending due to failure

multithreading - 我可以在 parfor (MATLAB) 上在工作人员之间发送和接收数据吗?

linux - 使用 MPI.NET 和 Mono 框架在 super 计算机的 linux 节点上执行分布式计算

c++ - MPI_Scatter 和 MPI_Bcast 之间的区别