C++ 无法编译返回MPI::Comm类型对象的函数
要使用MPI运行我的软件,我需要创建一个简单的方法,该方法将返回C++ 无法编译返回MPI::Comm类型对象的函数,c++,mpi,communicator,C++,Mpi,Communicator,要使用MPI运行我的软件,我需要创建一个简单的方法,该方法将返回MPI::COMM\u WORLD 在我的课堂上,我们有: #include <mpi.h> class Parallel{ public: MPI::Comm getCommunicator(){ return MPI::COMM_WORLD; } protected: int iproc; }; int main(int
MPI::COMM\u WORLD
在我的课堂上,我们有:
#include <mpi.h>
class Parallel{
public:
MPI::Comm getCommunicator(){
return MPI::COMM_WORLD;
}
protected:
int iproc;
};
int main(int argc, char *argv[]){
Parallel* parallel;
MPI::Init(argc, argv);
int my_rank;
my_rank = parallel->getCommunicator().Get_rank();
MPI::Finalize();
return 0;
}
Zuln是正确的,C++绑定从MPI 3中删除,所以新代码不应该使用它们编写。p> 它们被删除的原因是它们没有经过特别的考虑或维护,而且它们肯定不是很习惯用法,因此如果您使用它们,会遇到很多奇怪的情况。更好,但不幸的是,仅涵盖MPI 1
如果出于维护现有代码的目的,您必须具有此功能,那么问题正如所述-至少在OpenMPI中,MPI::Comm被定义为纯虚拟类,因此您无法返回该类型的对象,因为无法创建对象;只能返回子类型。(我认为这样做是为了让内部和内部通讯器成为子类型) 处理这种情况的经典方法是返回对对象的引用,而不是对象本身,并让编译器处理向上转换:#include <mpi.h>
#include <iostream>
class Parallel{
public:
MPI::Comm &getCommunicator(){
return MPI::COMM_WORLD;
}
protected:
int iproc;
};
int main(int argc, char *argv[]){
Parallel* parallel;
MPI::Init(argc, argv);
int my_rank, size;
my_rank = parallel->getCommunicator().Get_rank();
size = parallel->getCommunicator().Get_size();
std::cout << my_rank << "/" << size << std::endl;
MPI::Finalize();
return 0;
}
将C++绑定表示为MPI-2.2(2009)。在MPI-3.0中删除C++绑定。(2012). 无论如何,我不知道你到底在问什么。你想做什么?你的问题到底出在哪里?基本上,我正在使用HDF5 API在文件中写入并行数据。在我的代码中,我必须使用HDF5 API提供的一个函数:这个函数是:H5Pset_fapl_mpio(plist_id,MPI_COMM_WORLD,MPI_INFO_NULL);在我编写代码的软件中,我不能直接调用MPI_COMM_WORLD,因为MPI函数是封装的。因此,我想在一个类中编写一个返回通信器的方法,特别是MPI_COMM_WORLD。因此,我在上面编写了一个简单的代码来测试我的方法是否有效:最后,我在编译代码时会收到错误消息
#include <mpi.h>
#include <iostream>
class Parallel{
public:
MPI::Comm &getCommunicator(){
return MPI::COMM_WORLD;
}
protected:
int iproc;
};
int main(int argc, char *argv[]){
Parallel* parallel;
MPI::Init(argc, argv);
int my_rank, size;
my_rank = parallel->getCommunicator().Get_rank();
size = parallel->getCommunicator().Get_size();
std::cout << my_rank << "/" << size << std::endl;
MPI::Finalize();
return 0;
}
$ mpic++ -o foo foo.cpp
$ mpiexec -np 4 ./foo
1/4
2/4
3/4
0/4