mpi - 如何确定 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;
}
解决方案
MPI_COMM_NULL
是用于无效通信器的常量。但是,您无法确定 MPI 通信器是否已初始化。在 C 中,无法确定变量是否已初始化。非静态变量以不确定的值开头,读取它会导致未定义的行为。
您必须自己初始化通信器MPI_COMM_NULL
。这只有在初始化期间不可能创建实际的通信器时才有意义。
注意:MPI_Comm_free
也设置comm
为MPI_COMM_NULL
.
推荐阅读
- isabelle - Isabelle/HOL中如何实现声明类型和常量?
- angular - 如何使用 Angular 中的添加按钮添加输入字段?
- pandas - Python pandas数据框,如何获取设置的数字
- jmeter - Jmeter 不会在 CSV 上写入
- android - Android OS 导航和状态栏在全屏 PWA 上切换进出
- c - 为什么 setjmp() 在 windows 上取 2 个 args 而在 linux 上只取 1 个 args?
- python - Python - 命令/函数停止运行当前代码而不退出 python
- ios - 如何为非日期/时间值创建 iOS 的内联选择器
- spring-boot - 微服务无法连接到作为 docker 镜像运行的 AXON 服务器
- kubernetes - 错误:elasticsearch 没有部署的版本错误:插件“2to3”退出并出现错误