Boost logo

Boost :

Subject: Re: [boost] Boost mpi, serialization and shared_ptr
From: Max Moorkamp (mm489_at_[hidden])
Date: 2012-06-11 10:27:25


Hi,

I guess this got drowned in the discussion about the beta release and
the review of the multi-precision library. If anybody could tell me what
I am doing wrong, any help is greatly appreciated.

> ________________________________________
> From: boost-bounces_at_[hidden] [boost-bounces_at_[hidden]] On Behalf Of Robert Ramey [ramey_at_[hidden]]
> Sent: 02 June 2012 03:30
> To: boost_at_[hidden]
> Subject: Re: [boost] Boost mpi, serialization and shared_ptr
>
> Max Moorkamp wrote:
>> Hi,
>>
>> I have started to parallelize one of my applications using MPI and I
>> am running into trouble with serializing classes that contain
>> shared_ptr member to be send through MPI. Below is a minimal case
>> that demonstrates my problem.
>
> before we get too carried away, please double check the documentation.
>
> the macro BOOST_SERIALIZATION_EXPORT has
> been upgraded to the more precise versions
>
> BOOST_SERIALIZATION_EXPORT_IMPLEMENT
> and
> BOOST_SERIALIZATION_EXPORT_KEY
>
> Make these tweaks and see if this helps.
>
> Robert Ramey

I tried what you suggested. Now I have
Derived.h
#ifndef DERIVED_H_
#define DERIVED_H_

#include "Base.h"
#include <boost/serialization/serialization.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/export.hpp>

class Derived: public Base
{
private:
        double b;
        boost::shared_ptr<Base> MemberPointer;
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
                ar & boost::serialization::base_object<Base>(*this);
                ar & MemberPointer;
                ar & b;
        }
public:
        Derived();
        virtual ~Derived();
};

BOOST_CLASS_EXPORT_KEY(Derived)

#endif /* DERIVED_H_ */

and

Derived.cpp

#include "Derived.h"
#include <boost/mpi.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/export.hpp>

Derived::Derived()
{
}

Derived::~Derived()
{
}

BOOST_CLASS_EXPORT_IMPLEMENT(Derived)

but now I get

In file included from Derived.h:14,
                  from Derived.cpp:8:
/usr/local/include/boost/serialization/shared_ptr.hpp: In function ‘void
boost::serialization::load(Archive&, boost::shared_ptr<U>&, unsigned
int) [with Archive = boost::mpi::packed_skeleton_iarchive, T = Base]’:
/usr/local/include/boost/serialization/split_free.hpp:58: instantiated
from ‘static void boost::serialization::free_loader<Archive,
T>::invoke(Archive&, T&, unsigned int) [with Archive =
boost::mpi::packed_skeleton_iarchive, T = boost::shared_ptr<Base>]’
/usr/local/include/boost/serialization/split_free.hpp:74: instantiated
from ‘void boost::serialization::split_free(Archive&, T&, unsigned int)
[with Archive = boost::mpi::packed_skeleton_iarchive, T =
boost::shared_ptr<Base>]’
/usr/local/include/boost/serialization/shared_ptr.hpp:171:
instantiated from ‘void boost::serialization::serialize(Archive&,
boost::shared_ptr<U>&, unsigned int) [with Archive =
boost::mpi::packed_skeleton_iarchive, T = Base]’
/usr/local/include/boost/serialization/serialization.hpp:128:
instantiated from ‘void boost::serialization::serialize_adl(Archive&,
T&, unsigned int) [with Archive = boost::mpi::packed_skeleton_iarchive,
T = boost::shared_ptr<Base>]’
/usr/local/include/boost/archive/detail/iserializer.hpp:188:
instantiated from ‘void boost::archive::detail::iserializer<Archive,
T>::load_object_data(boost::archive::detail::basic_iarchive&, void*,
unsigned int) const [with Archive =
boost::mpi::packed_skeleton_iarchive, T = boost::shared_ptr<Base>]’
Derived.cpp:25: instantiated from here
/usr/local/include/boost/serialization/shared_ptr.hpp:155: error: ‘class
boost::mpi::packed_skeleton_iarchive’ has no member named ‘reset’

If I omit the #include <boost/mpi.hpp> from Derived.cpp everything
compiles, but as expected I get a runtime error
terminate called after throwing an instance of
'boost::archive::archive_exception'
   what(): unregistered class - derived class not registered or exported

Any ideas?

Regards

Max


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk