C++ MPICH&x27;s MPI_Comm_dup()在复制构造函数中失败
我有一个对象需要为它设计一个复制构造函数。 该对象具有一个MPI_Comm成员,该成员应复制到新对象。 我不想使用浅拷贝,因为正确的方法是复制通信器。C++ MPICH&x27;s MPI_Comm_dup()在复制构造函数中失败,c++,mpi,mpich,C++,Mpi,Mpich,我有一个对象需要为它设计一个复制构造函数。 该对象具有一个MPI_Comm成员,该成员应复制到新对象。 我不想使用浅拷贝,因为正确的方法是复制通信器。 myClass::myCLass(const myClass& in_class) { // .... MPI_Comm_dup(inclass.comm, &myclass.comm); ... } 它可以使用MPICH进行良好编译,但在运行时崩溃,并出现以下错误 (“第101行src/mpi/topo/topoutil.c
myClass::myCLass(const myClass& in_class)
{
//
....
MPI_Comm_dup(inclass.comm, &myclass.comm);
...
}
它可以使用MPICH进行良好编译,但在运行时崩溃,并出现以下错误
(“第101行src/mpi/topo/topoutil.c文件中的断言失败:n==0”)
其他实现(如intel)工作正常 信息如此之少,人们只能猜测。如果是
topoutil.c
中的n
,听起来很像是在复制一个空的(空的?)通信器
在调用之前添加您自己的
assert(inclass.comm!=MPI\u comm\u NULL)
事实并非如此,因为我提到intel和openmpi都可以工作,这意味着它们可以产生正确的结果@Hasbestein它可以在没有此检查或未使用调试标志编译的其他实现中偶然工作。请张贴一个最低限度的工作代码。最后,如果您发布或链接到topoutil.c的版本,甚至是您正在使用的mpich版本,它会有所帮助;这是一个更大的商业代码的一部分,因此我不能发布它。mpich/3.2.1是我正在使用的版本。我复制了一个非空的通信器,事实上,通信器是一个分布式图形通信器。其他实现使用调试和发布标志。@Hasbestein是什么让您认为在构造函数内部会产生错误的。你能在构造函数之外重现这个问题吗?