2016-07-15 4 views
2

ソフトウェアをMPIで実行するには、MPI::COMM_WORLDを返す単純なメソッドを作成する必要があります。MPI :: Comm型のオブジェクトを返す関数をコンパイルできません

だから私のクラスでは、我々は持っている:

#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; 
} 

どのように私はそれがMPI::COMM_WORLDを返すためにgetCommunicator()メソッドを実装する必要がありますか?私は上記をコンパイルしようとすると、私は次のエラーを取得する:

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

を与えます* C++バインディングは、MPI-2.2(2009)の時点で廃止されました。 C++バインディングはMPI-3.0で削除されています。 (2012)*。いずれにしても、あなたは実際に何を求めているのですか?あなたは何をしようとしていますか、あなたの問題はどこですか? – Zulan

+0

基本的には、HDF5 APIを使用してファイル内にパラレルデータを書き込む作業をしています。 – Karl

+0

私のコードでは、HDF5 APIによって提供される関数を含めて使用する必要があります。 – Karl

答えて

2

Zulanは右である、C++バインディングはMPI 3から削除されているので、新しいコードでは、実際にそれらを使用して書かれるべきではありません。

削除された理由は、特によく考えられたり維持されたりしていないことであり、間違いなく慣用的ではないため、使用すると奇妙なケースがたくさんあります。あなたがこれを持っている必要があり、既存のコードを維持する目的のために、問題がhere説明されているようならばBoost::MPIは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; 
} 

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

okありがとうございました! – Karl

関連する問題