
Hi all, I am trying to separate structure from content and send a vector of strings. Without the separation it works fine, I do receive the data on workers. When I try to separate structure and data it fails to compile. My simple code and the error message are below. Any idea, what am I doing wrong? Compilation mpicxx test.cpp -o test -I /boost/include/boost-1_37/ /boost/lib/libboost_mpi-gcc41-mt-1_37.a /boost/lib/libboost_serialization-gcc41-mt-1_37.a /boost/lib/libboost_date_time-gcc41-mt-1_37.a Code 1 #include "mpi_ver_headers.h" 2 3 using namespace std; 4 namespace mpi = boost::mpi; 5 mpi::communicator world; 6 7 8 int main(int argc, char* argv[]){ 9 vector<std::string> a; 10 int sz; 11 mpi::environment env(argc, argv); 12 if (world.rank() == 0){ 13 broadcast(world, mpi::skeleton(a), 0); 14 mpi::content c = mpi::get_content(a); 15 for(int i =1; i < world.size(); i++){ 16 for(int l = 1; l < 3; l++) 17 a.push_back("A"); 18 sz = a.size(); 19 world.send(i, 3, sz); 20 world.send(i, 1, &a[0], sz); 21 world.recv(i, 2); 22 } 23 } 24 if(world.rank() > 0){ 25 broadcast(world, mpi::skeleton(a), 0); 26 mpi::content c = mpi::get_content(a); 27 world.recv(0, 3 , sz); 28 a.resize(sz); 29 world.recv(0, 1, &a[0], sz); 30 for(int l=0; l < sz; l++) 31 cout << a[l] << "\t"; 32 cout << endl; 33 world.send(0, 2); 34 } 35 } "mpi_ver_headers.h" is ........ 29 #include <boost/mpi.hpp> 30 #include <boost/config.hpp> 31 #include <boost/tokenizer.hpp> 32 #include <boost/mpi/datatype.hpp> 33 #include <boost/mpi/allocator.hpp> 34 #include <boost/archive/tmpdir.hpp> 35 #include <boost/archive/tmpdir.hpp> 36 #include <boost/mpi/environment.hpp> 37 #include <boost/mpi/collectives.hpp> 38 #include <boost/mpi/communicator.hpp> 39 #include <boost/serialization/map.hpp> 40 #include <boost/serialization/export.hpp> 41 #include <boost/serialization/vector.hpp> 42 #include <boost/serialization/access.hpp> 43 #include <boost/serialization/string.hpp> 44 #include <boost/serialization/utility.hpp> 45 #include <boost/archive/text_oarchive.hpp> 46 #include <boost/archive/text_iarchive.hpp> 47 #include <boost/serialization/utility.hpp> 48 #include <boost/serialization/hash_map.hpp> 49 #include <boost/archive/binary_oarchive.hpp> 50 #include <boost/archive/binary_iarchive.hpp> 51 #include <boost/mpi/skeleton_and_content.hpp> 52 #include <boost/serialization/base_object.hpp> 53 #include <boost/serialization/base_object.hpp> 54 #include <boost/progress.hpp> 55 #include <boost/date_time/iso_format.hpp> 56 #include "boost/date_time/gregorian/gregorian.hpp" 57 #include <boost/date_time/posix_time/posix_time.hpp> 58 #include <boost/date_time/posix_time/posix_time_types.hpp> 59 #include <boost/date_time/gregorian/greg_serialize.hpp> 60 #include <boost/date_time/posix_time/time_serialize.hpp> Error /boost/include/boost-1_37/boost/mpi/datatype.hpp: In function âompi_datatype_t* boost::mpi::get_mpi_datatype(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â: /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_primitive.hpp:96: instantiated from âvoid boost::mpi::detail::mpi_datatype_primitive::save(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:95: instantiated from âstatic void boost::archive::save_access::save_primitive(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:212: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::save_primitive::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:294: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:506: instantiated from âvoid boost::archive::save(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/mpi/detail/ignore_skeleton_oarchive.hpp:46: instantiated from âvoid boost::mpi::detail::ignore_skeleton_oarchive<Archive>::save_override(const T&, int) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/archive/detail/interface_oarchive.hpp:64: instantiated from âArchive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const std::basic_string<char, std::char_traits<char>, std::allocator<char>
, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/serialization/nvp.hpp:78: instantiated from âvoid boost::serialization::nvp<T>::save(Archivex&, unsigned int) const [with Archivex = boost::mpi::detail::content_oarchive, T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/serialization/access.hpp:93: instantiated from âstatic void boost::serialization::access::member_save(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = const boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_member.hpp:43: instantiated from âstatic void boost::serialization::detail::member_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_member.hpp:69: instantiated from âvoid boost::serialization::split_member(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/nvp.hpp:88: instantiated from âvoid boost::serialization::nvp<T>::serialize(Archive&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/serialization/access.hpp:109: instantiated from âstatic void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:74: instantiated from âvoid boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:133: instantiated from âvoid boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:220: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::save_only::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:294: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:506: instantiated from âvoid boost::archive::save(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/mpi/detail/ignore_skeleton_oarchive.hpp:46: instantiated from âvoid boost::mpi::detail::ignore_skeleton_oarchive<Archive>::save_override(const T&, int) [with T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/archive/detail/interface_oarchive.hpp:64: instantiated from âArchive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/serialization/collections_save_imp.hpp:60: instantiated from âvoid boost::serialization::stl::save_collection(Archive&, const Container&) [with Archive = boost::mpi::detail::content_oarchive, Container = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:53: instantiated from âvoid boost::serialization::save(Archive&, const std::vector<U, Allocator>&, unsigned int, mpl_::false_) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:119: instantiated from âvoid boost::serialization::save(Archive&, const std::vector<U, Allocator>&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_free.hpp:45: instantiated from âstatic void boost::serialization::free_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/split_free.hpp:74: instantiated from âvoid boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:139: instantiated from âvoid boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:133: instantiated from âvoid boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:144: instantiated from âvoid boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â deneme.cpp:34: instantiated from here /boost/include/boost-1_37/boost/mpi/datatype.hpp:184: error: no matching function for call to âassertion_failed(mpl_::failed************ boost::mpi::is_mpi_datatype<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::************)â /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_cache.hpp: In member function âompi_datatype_t* boost::mpi::detail::mpi_datatype_map::datatype(const T&, typename boost::disable_if<boost::mpi::is_mpi_builtin_datatype<T>, void>::type*) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â: /boost/include/boost-1_37/boost/mpi/datatype.hpp:185: instantiated from âompi_datatype_t* boost::mpi::get_mpi_datatype(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_primitive.hpp:96: instantiated from âvoid boost::mpi::detail::mpi_datatype_primitive::save(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:95: instantiated from âstatic void boost::archive::save_access::save_primitive(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:212: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::save_primitive::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:294: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:506: instantiated from âvoid boost::archive::save(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/mpi/detail/ignore_skeleton_oarchive.hpp:46: instantiated from âvoid boost::mpi::detail::ignore_skeleton_oarchive<Archive>::save_override(const T&, int) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/archive/detail/interface_oarchive.hpp:64: instantiated from âArchive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> , Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/serialization/nvp.hpp:78: instantiated from âvoid boost::serialization::nvp<T>::save(Archivex&, unsigned int) const [with Archivex = boost::mpi::detail::content_oarchive, T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/serialization/access.hpp:93: instantiated from âstatic void boost::serialization::access::member_save(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = const boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_member.hpp:43: instantiated from âstatic void boost::serialization::detail::member_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_member.hpp:69: instantiated from âvoid boost::serialization::split_member(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/nvp.hpp:88: instantiated from âvoid boost::serialization::nvp<T>::serialize(Archive&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/serialization/access.hpp:109: instantiated from âstatic void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:74: instantiated from âvoid boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:133: instantiated from âvoid boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:220: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::save_only::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:294: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:506: instantiated from âvoid boost::archive::save(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/mpi/detail/ignore_skeleton_oarchive.hpp:46: instantiated from âvoid boost::mpi::detail::ignore_skeleton_oarchive<Archive>::save_override(const T&, int) [with T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/archive/detail/interface_oarchive.hpp:64: instantiated from âArchive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/serialization/collections_save_imp.hpp:60: instantiated from âvoid boost::serialization::stl::save_collection(Archive&, const Container&) [with Archive = boost::mpi::detail::content_oarchive, Container = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:53: instantiated from âvoid boost::serialization::save(Archive&, const std::vector<U, Allocator>&, unsigned int, mpl_::false_) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:119: instantiated from âvoid boost::serialization::save(Archive&, const std::vector<U, Allocator>&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_free.hpp:45: instantiated from âstatic void boost::serialization::free_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/split_free.hpp:74: instantiated from âvoid boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:139: instantiated from âvoid boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:133: instantiated from âvoid boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:144: instantiated from âvoid boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â deneme.cpp:34: instantiated from here /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_cache.hpp:68: error: no matching function for call to âassertion_failed(mpl_::failed************ boost::mpi::is_mpi_datatype<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::************)â /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_oarchive.hpp: In constructor âboost::mpi::detail::mpi_datatype_oarchive::mpi_datatype_oarchive(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â: /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_cache.hpp:75: instantiated from âompi_datatype_t* boost::mpi::detail::mpi_datatype_map::datatype(const T&, typename boost::disable_if<boost::mpi::is_mpi_builtin_datatype<T>, void>::type*) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/mpi/datatype.hpp:185: instantiated from âompi_datatype_t* boost::mpi::get_mpi_datatype(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_primitive.hpp:96: instantiated from âvoid boost::mpi::detail::mpi_datatype_primitive::save(const T&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:95: instantiated from âstatic void boost::archive::save_access::save_primitive(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:212: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::save_primitive::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:294: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:506: instantiated from âvoid boost::archive::save(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/mpi/detail/ignore_skeleton_oarchive.hpp:46: instantiated from âvoid boost::mpi::detail::ignore_skeleton_oarchive<Archive>::save_override(const T&, int) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/archive/detail/interface_oarchive.hpp:64: instantiated from âArchive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> , Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/serialization/nvp.hpp:78: instantiated from âvoid boost::serialization::nvp<T>::save(Archivex&, unsigned int) const [with Archivex = boost::mpi::detail::content_oarchive, T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/serialization/access.hpp:93: instantiated from âstatic void boost::serialization::access::member_save(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = const boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_member.hpp:43: instantiated from âstatic void boost::serialization::detail::member_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_member.hpp:69: instantiated from âvoid boost::serialization::split_member(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/nvp.hpp:88: instantiated from âvoid boost::serialization::nvp<T>::serialize(Archive&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >]â /boost/include/boost-1_37/boost/serialization/access.hpp:109: instantiated from âstatic void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:74: instantiated from âvoid boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:133: instantiated from âvoid boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:220: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::save_only::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:294: instantiated from âstatic void boost::archive::detail::save_non_pointer_type<Archive, T>::invoke(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:506: instantiated from âvoid boost::archive::save(Archive&, const T&) [with Archive = boost::mpi::detail::content_oarchive, T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/mpi/detail/ignore_skeleton_oarchive.hpp:46: instantiated from âvoid boost::mpi::detail::ignore_skeleton_oarchive<Archive>::save_override(const T&, int) [with T = boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/archive/detail/interface_oarchive.hpp:64: instantiated from âArchive& boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T = const boost::serialization::nvp<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Archive = boost::mpi::detail::content_oarchive]â /boost/include/boost-1_37/boost/serialization/collections_save_imp.hpp:60: instantiated from âvoid boost::serialization::stl::save_collection(Archive&, const Container&) [with Archive = boost::mpi::detail::content_oarchive, Container = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:53: instantiated from âvoid boost::serialization::save(Archive&, const std::vector<U, Allocator>&, unsigned int, mpl_::false_) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:119: instantiated from âvoid boost::serialization::save(Archive&, const std::vector<U, Allocator>&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/split_free.hpp:45: instantiated from âstatic void boost::serialization::free_saver<Archive, T>::invoke(Archive&, const T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/split_free.hpp:74: instantiated from âvoid boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/serialization/vector.hpp:139: instantiated from âvoid boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, U = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Allocator = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]â /boost/include/boost-1_37/boost/serialization/serialization.hpp:133: instantiated from âvoid boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â /boost/include/boost-1_37/boost/archive/detail/oserializer.hpp:144: instantiated from âvoid boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::mpi::detail::content_oarchive, T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]â deneme.cpp:34: instantiated from here /boost/include/boost-1_37/boost/mpi/detail/mpi_datatype_oarchive.hpp:36: error: no matching function for call to âassertion_failed(mpl_::failed************ boost::mpi::is_mpi_datatype<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::************)â
Separating structure from content

On 12 Jul 2010, at 13:25, alev mutlu wrote:
Hi all,
I am trying to separate structure from content and send a vector of strings. Without the separation it works fine, I do receive the data on workers. When I try to separate structure and data it fails to compile. My simple code and the error message are below.
Any idea, what am I doing wrong?
Compilation mpicxx test.cpp -o test -I /boost/include/boost-1_37/ /boost/lib/libboost_mpi-gcc41-mt-1_37.a /boost/lib/libboost_serialization-gcc41-mt-1_37.a /boost/lib/libboost_date_time-gcc41-mt-1_37.a
Code
1 #include "mpi_ver_headers.h" 2 3 using namespace std; 4 namespace mpi = boost::mpi; 5 mpi::communicator world; 6 7 8 int main(int argc, char* argv[]){ 9 vector<std::string> a; 10 int sz; 11 mpi::environment env(argc, argv); 12 if (world.rank() == 0){ 13 broadcast(world, mpi::skeleton(a), 0); 14 mpi::content c = mpi::get_content(a); 15 for(int i =1; i < world.size(); i++){ 16 for(int l = 1; l < 3; l++) 17 a.push_back("A"); 18 sz = a.size(); 19 world.send(i, 3, sz); 20 world.send(i, 1, &a[0], sz); 21 world.recv(i, 2); 22 } 23 } 24 if(world.rank() > 0){ 25 broadcast(world, mpi::skeleton(a), 0); 26 mpi::content c = mpi::get_content(a); 27 world.recv(0, 3 , sz); 28 a.resize(sz); 29 world.recv(0, 1, &a[0], sz); 30 for(int l=0; l < sz; l++) 31 cout << a[l] << "\t"; 32 cout << endl; 33 world.send(0, 2); 34 } 35 }
Hi, the origin of this problem is the fact that Boost.Serialization treats std::string as a primitive type, but one cannot create an MPI datatype for it. This should not be a problem though since in your example you actually cannot separate structure from content. Look at this code fragment:
13 broadcast(world, mpi::skeleton(a), 0); 14 mpi::content c = mpi::get_content(a); 15 for(int i =1; i < world.size(); i++){ 16 for(int l = 1; l < 3; l++) 17 a.push_back("A");
You change the size of the string and thus the structure after broadcasting the structure. This would crash at runtime. Are your strings of variable length or fixed length? If they are of fixed length but varying content you could try to use std::vector<char> instead of std::string. We could implement a workaround in Boost.MPI if you really have fixed size srings and want to separate structure from contents for them. Matthias
participants (2)
-
alev mutlu
-
Matthias Troyer