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

时间:2016-07-15 09:40:14

标签: c++ mpi communicator

要使用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()

1 个答案:

答案 0 :(得分:2)

Zulan是对的,C ++绑定从MPI 3中删除,所以新代码真的不应该用它们编写。

他们被删除的原因是他们没有特别深思熟虑或维护,他们肯定不是非常惯用,所以如果你遇到很多奇怪的案例使用它们。 Boost::MPI要好得多,但不幸的是只涵盖了MPI 1。

如果出于维护现有代码的目的,您必须具有此问题,问题如描述here - 至少在OpenMPI中,MPI :: Comm被定义为纯虚拟类,因此您可以&# 39;返回那种类型的对象,因为没有办法创建一个;你只能返回一个子类型。 (我假设它是以这种方式完成的,因此你可以让内部和内部传播者成为子类型)。

处理这种情况的一种经典方法是返回对象的引用,而不是对象本身,并让编译器处理upcasting:

#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