2016-07-15 3 views
2

내 소프트웨어를 MPI로 실행하려면 MPI::COMM_WORLD을 반환하는 간단한 메서드를 만들어야합니다. 내 수업 시간에 따라서MPI :: Comm 형식의 개체를 반환하는 함수를 컴파일 할 수 없습니다.

, 우리는이 : 그것은 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() 메소드를 구현해야합니까? 내가 위를 컴파일 할 때, 나는 다음과 같은 오류가 발생합니다 :

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

을 제공합니다 :

이 상황을 처리하는 고전적인 방법은 upcasting와 컴파일러 거래를하지 않고 개체 자체보다, 객체에 대한 참조를 반환하고 수 있도록하는 것입니다 * C++ 바인딩은 MPI-2.2 (2009)부터 사용되지 않습니다. C++ 바인딩은 MPI-3.0에서 제거되었습니다. (2012) *. 어쨌든 나는 실제로 당신이 무엇을 요구하고 있는지 전혀 모른다. 당신은 무엇을하려고하고 정확히 어디에 문제가 있습니까? – Zulan

+0

기본적으로 HDF5 API를 사용하여 파일의 병렬 데이터를 작성하고 있습니다. – Karl

+0

내 코드에는 HDF5 API에서 제공하는 함수를 사용해야합니다. – Karl

답변

2

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 
+0

고마워요! – Karl