2013-08-14 5 views
3

boost :: mpi :: broadcast를 사용하여 기본 클래스 포인터를 통해 모든 노드에 파생 클래스를 보내려고합니다. 이렇게하려면 boost :: serialization 라이브러리를 사용하여 클래스를 serialize합니다. 그러나 내 코드는 컴파일되지 않으며 "class boost :: mpi :: packed_skeleton_iarchive '클래스에는'append '라는 멤버가 없으며 class boost :: mpi :: packed_skeleton_iarchive 클래스에는'reset '이라는 멤버가 없습니다. "Boost :: serialization과 boost :: mpi가 기본 클래스 포인터를 통해 파생 클래스를 브로드 캐스트합니다.

// Base.hpp 
#include <boost/serialization/serialization.hpp> 

class Base 
{ 
    public: 
     Base() {} 
     virtual ~Base() {} 

     virtual void foo() = 0; 
    private: 
     friend class boost::serialization::access; 

     template<class Archive> 
     void serialize(Archive& /*ar*/, const unsigned int /*version*/) {} 
} 

// Derived.hpp 
#include <boost/serialization/serialization.hpp> 
#include <boost/serialization/shared_ptr.hpp> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/export.hpp> 
#include <boost/shared_ptr.hpp> 
#include <vector> 

#include "Base.hpp" 

class Derived : public Base 
{ 
    public: 
     Derived(int param); 
     virtual ~Derived(); 

     void foo(); 
    private: 
     int param_; 
     std::vector<boost::shared_ptr> bar_; 

     friend class boost::serialization::access; 

     template<class Archive> 
     void serialize(Archive& ar, const unsigned int /*version*/) 
     { 
      ar & param_; 
      ar & bar_; 

      ar & boost::serialization::base_object<Base>(*this); 
     } 
} 

namespace boost 
{ 
    namespace serialization 
    { 
     template<class Archive> 
     void load_construct_data(Archive& /*ar*/, Derived* d, 
      const unsigned int /*v*/) 
     { 
      ::new(d) Derived(0); 
     } 
    } 
} 

BOOST_CLASS_EXPORT_KEY(Derived) 

// Derived.cpp 
#include "Derived.hpp" 

Derived::Derived(int param) : param_(param) {} 
Derived::~Derived(){} 

Derived::foo() 
{ 
    // some stuff 
} 

BOOST_CLASS_EXPORT_IMPLEMENT(Derived) 

// Main.cpp 
#include <boost/mpi.hpp> 
#include <boost/serialization/serialization.hpp> 
#include <boost/shared_ptr.hpp> 

#include "Derived.hpp" 

int main(int argc, char* argv[]) 
{ 
    boost::shared_ptr<Base> sp; 

    if (world.rank() == 0) 
    { 
     sp = boost::shared_ptr<Base>(new Derived(5)); 

     boost::mpi::broadcast(world, sp, 0); 

     // produce some stuff 
    } else 
    { 
     while (1) 
     { 
      // consume some stuff 
     } 
    } 

    return 0; 
} 

BOOST_SERIALIZATION_ASSUME_ABSTRACT(Base) 

나는이 문제에 있지만 해결책 지금까지 https://groups.google.com/forum/#!msg/boost-developers-archive/Ee9_ilEDO7s/cJTy-8v5lEcJ에 대한 하나의 Google 그룹 토론을 발견

다음은 프로그램의 대략적인 소스 코드입니다. 컴파일하려면 어떻게해야합니까? openmpi 1.2.8-17.4, gcc 4.5.1 및 1.54를 사용하고 있습니다.

답변

1

고맙게도 제 자신의 질문에 대답 할 수있었습니다. 부스트는 boost :: mpi :: packed_skeleton_iarchive와 결합 할 때베이스 포인터를 통한 직렬화를 제대로 처리하지 못합니다. 해결책은 다음과 같은 다른 종류의 아카이브를 사용하는 것입니다. 대신 text_iarchive/text_oarchive를 사용하십시오.

std::ostringstream oss; 
boost::archive::text_oarchive oa(oss); 
oa << value; 
std::string s = oss.str(); 
boost::mpi::broadcast(comm, s, root); 

받을 :

예를 들어, 방송

std::string s; 
boost::mpi::broadcast(comm, s, root); 
std::istringstream iss(s); 
boost::archive::text_iarchive ia(iss); 
ia >> value;