【问题标题】:Cannot compile function that returns object of type MPI::Comm无法编译返回 MPI::Comm 类型对象的函数
【发布时间】:2016-07-15 09:40:14
【问题描述】:

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

【问题讨论】:

  • 自 MPI-2.2 (2009) 起,C++ 绑定已被弃用。 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。所以,我在上面写了一个简单的代码来测试我的方法是否有效:最后,当我编译代码时出现错误消息

标签: c++ mpi communicator


【解决方案1】:

Zulan 是对的,C++ 绑定已从 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 2023-01-27
    • 2018-08-22
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多