-----Original Message----- From: "Matthias Troyer" [troyer@phys.ethz.ch] Date: 13/12/2010 09:57 PM To: "Hicham Mouline" CC: boost-users@lists.boost.org Subject: Re: [Boost-users] mpi/serialization: broadcast function and the value argument
mpi::broadcast() appears to be incapable of sending the argument "value" in a polymorphic way, ie:
sender------------------- Base* base; If I call boost::mpi::broadcast(..., base, ...)
receiver----------------- Base* base; boost::mpi::broadcast(..., base, ...) This does not construct the most derived type of base on the heap and make base point there, as serialization would do.
Did you register the most derived type? Yes I have all types.
Did you test whether pointer deserialization works with other serialization archives? Matthias
I will test. However, this code from boost\mpi\collectives\broadcast.hpp (see where I put the comment marker) // We're sending a type that does not have an associated MPI // datatype, so we'll need to serialize it. Unfortunately, this // means that we cannot use MPI_Bcast, so we'll just send from the // root to everyone else. template<typename T> void broadcast_impl(const communicator& comm, T* values, int n, int root, mpl::false_) { if (comm.rank() == root) { packed_oarchive oa(comm); for (int i = 0; i < n; ++i) oa << values[i]; broadcast(comm, oa, root); } else { packed_iarchive ia(comm); broadcast(comm, ia, root); for (int i = 0; i < n; ++i) ia >> values[i]; /////////////////////////////////////////////////////////////////// } } template<typename T> void broadcast(const communicator& comm, T& value, int root) { detail::broadcast_impl(comm, &value, 1, root, is_mpi_datatype<T>()); } template<typename T> void broadcast(const communicator& comm, T* values, int n, int root) { detail::broadcast_impl(comm, values, n, root, is_mpi_datatype<T>()); } If at the receiver process, I pass a non initialized Base*, it crashes as far as I could see. PS: I've cc'ed the email in the comments for that file as well. regards,