gpt4 book ai didi

c++ - 无法编译返回 MPI::Comm 类型对象的函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:32 24 4
gpt4 key购买 nike

要使用 MPI 运行我的软件,我需要创建一个简单的方法来返回 MPI::COMM_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;
}

我应该如何实现 getCommunicator() 方法才能返回 MPI::COMM_WORLD?当我尝试编译上面的代码时,出现以下错误:

invalid abstract return type for member function 'MPI::Comm Parallel ::getCommunicator()

最佳答案

Zulan 是对的,C++ 绑定(bind)已从 MPI 3 中删除,因此确实不应该使用它们编写新代码。

它们被删除的原因是它们没有经过特别深思熟虑或维护得很好,而且它们绝对不是很地道,所以如果你使用它们,你会遇到很多奇怪的情况。 Boost::MPI好多了,但不幸的是只涵盖了 MPI 1。

如果出于维护现有代码的目的,您必须拥有此问题,问题如描述的那样here - 至少在 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;
}

给予

$ mpic++ -o foo foo.cpp
$ mpiexec -np 4 ./foo
1/4
2/4
3/4
0/4

关于c++ - 无法编译返回 MPI::Comm 类型对象的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com