Segfault when trying to deserialize std::lists in a multi_array

Hello, I'm working on a parallel physical simulation involving particles in a 3D grid. In addition to Boost libraries, I use the Eigen3 template library for holding numerical data in small 3-vectors. I'm trying to send a 3D boost::multi_array containing std::list of pointers to particle structs via boost::mpi and keep getting a segfault on receive. Sending and receiving boost::multi_array of V3D Eigen3 vectors works fine. Serialization functions for multi_array are from http://tinyurl.com/3koafmr (edited for 3 dimensions, seems to work) Serializing Eigen Vector3d type (seems to work): friend class boost::serialization::access; template<class Archive> inline void serialize(Archive & ar, const unsigned int file_version) { ar & m_coeffs.x(); ar & m_coeffs.y(); ar & m_coeffs.z(); } typedef Vector3d V3D; //Convenience typedef for Eigen3 vector struct Particle { V3D r, u; double m, q; unsigned number; friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & r; ar & u; ar & m; ar & q; ar & number; } }; Sending point: typedef boost::multi_array<std::list<Particle*>, 3> ParticleArray; ParticleArray part_array(boost::extents[x][y][z]); ...fill the array with particles, some cells might be empty... world->isend(recnum, pack_type, part_array); Receiving point: ParticleArray part_array(boost::extents[slice->shape()[0]][slice->shape()[1]][slice->shape()[2]]); world->recv(sendnum, pack_type, part_array); When I get here, it segfaults: terminate called after throwing an instance of 'boost::archive::archive_exception' what(): class version # 0 0 Program received signal SIGABRT, Aborted. 0x00007ffff5a29a25 in raise () from /lib64/libc.so.6 (gdb) bt #0 0x00007ffff5a29a25 in raise () from /lib64/libc.so.6 #1 0x00007ffff5a2b0af in abort () from /lib64/libc.so.6 #2 0x00007ffff64fb695 in __gnu_cxx::__verbose_terminate_handler () at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/vterminate.cc:93 #3 0x00007ffff64f9ac6 in __cxxabiv1::__terminate (handler=0x70d) at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/eh_terminate.cc:38 #4 0x00007ffff64f9af3 in std::terminate () at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/eh_terminate.cc:48 #5 0x00007ffff64f9bee in __cxxabiv1::__cxa_throw (obj=<value optimized out>, tinfo=<value optimized out>, dest=<value optimized out>) at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/eh_throw.cc:83 #6 0x000000000044f7d5 in boost::archive::detail::iserializer<boost::mpi::packed_iarchive, Particle>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const () #7 0x00007ffff794173b in load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:367 #8 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:547 #9 0x000000000044f662 in boost::archive::detail::pointer_iserializer<boost::mpi::packed_iarchive, Particle>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const () #10 0x00007ffff7941c50 in load_pointer (this=0x7fffffffcae0, t=@0x7fffffffc880, bpis_ptr=0x668060, finder=<value optimized out>) at libs/serialization/src/basic_iarchive.cpp:494 #11 boost::archive::detail::basic_iarchive::load_pointer (this=0x7fffffffcae0, t=@0x7fffffffc880, bpis_ptr=0x668060, finder=<value optimized out>) at libs/serialization/src/basic_iarchive.cpp:560 #12 0x000000000044ed6f in boost::archive::detail::iserializer<boost::mpi::packed_iarchive, std::list<Particle*, std::allocator<Particle*> >
::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const () #13 0x00007ffff79416fa in load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:399 #14 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:547 #15 0x000000000044ffb4 in boost::archive::detail::iserializer<boost::mpi::packed_iarchive, boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > > ::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const () #16 0x00007ffff79416fa in load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:399 #17 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:547 #18 0x00000000004516f9 in boost::mpi::status boost::mpi::communicator::recv_impl<boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > > >(int, int, boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > &, mpl_::bool_<false>) const () #19 0x000000000044982d in recv<ParticleArray> (this=0x66b150, slice=0x8779e0, pack_type=<value optimized out>, sendnum=1) at /usr/include/boost/mpi/communicator.hpp:1201 #20 Communicator::receive (this=0x66b150, slice=0x8779e0, pack_type=<value optimized out>, sendnum=1) at /home/strazce/prog/opice/opice/src/communicator.cpp:62 #21 0x000000000043d512 in Experiment::run (this=0x66b0c0) at /home/strazce/prog/opice/opice/src/experiment.cpp:96 #22 0x000000000042c13c in main (argc=1, argv=0x7fffffffd158) at /home/strazce/prog/opice/opice/src/opice.cpp:29 (gdb)
Again, this error only shows when receiving the multi_array of std::list<Particle*>. multi_array of V3D is received fine. Thanks for any help, Jiri Vyskocil

I'm trying to send a 3D boost::multi_array containing std::list of pointers to particle structs via boost::mpi and keep getting a segfault on receive.
typedef Vector3d V3D; //Convenience typedef for Eigen3 vector
struct Particle { V3D r, u; ...
};
Looks like you may be missing EIGEN_MAKE_ALIGNED_OPERATOR_NEW. See http://eigen.tuxfamily.org/dox/TopicStructHavingEigenMembers.html. No idea if that's ultimately the cause, but it looks quite suspect and should be fixed regardless, Rhys

Sorry, I accidentaly edited that part out when posting. The whole struct look like this: #include "common.h" #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> struct Particle { EIGEN_MAKE_ALIGNED_OPERATOR_NEW V3D r, u; double m, q, igamma; double qm; // = q/m unsigned number; friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & r; ar & u; ar & m; ar & q; ar & igamma; ar & qm; ar & number; } };

I'm trying to send a 3D boost::multi_array containing std::list of pointers to particle structs via boost::mpi and keep getting a segfault on receive.
Sorry, I accidentaly edited that part out when posting. The whole struct look like this:
struct Particle { EIGEN_MAKE_ALIGNED_OPERATOR_NEW V3D r, u; double m, q, igamma; double qm; // = q/m unsigned number;
friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & r; ar & u; ar & m; ar & q; ar & igamma; ar & qm; ar & number; } };
Again, I doubt it is the culprit, but have you tried using &r.x(), &r.y(), &r.z() within your serialize method instead of expecting ar to "know" about Eigen types? - Rhys

I tried that, but the error stays the same. Besides, receiving a multi_array of Eigen vectors works fine. The difference here is the struct and std::lists containing pointers. Any ideas how to debug this - for example how to take a look into the message being sent? On Mon, 2011-07-25 at 18:16 -0500, Rhys Ulerich wrote:
Again, I doubt it is the culprit, but have you tried using &r.x(), &r.y(), &r.z() within your serialize method instead of expecting ar to "know" about Eigen types?
- Rhys

OK. I tried to make a simple test case using the same structures as in the code. It constructs a multi_array chose cells contain std::list, which contains pointers to particles. Receiving worked flawlessly in this minimal case. I noticed, that the error occurs only once in a while. My simulation program runs several timesteps and the particle sending does not necessarily occur at every timestep, so I assumed, tthat when the error occured, it was at the first call to the sending function, which (as I realized just now) is actually not the case. This means, that the error only occcurs when some specific data is being sent. I will try to somehow determine what factors make the deserialization in receive fail. (It would be nice if I knew a way to look into the offending message). Meanwhile, I got a longer backtrace from a program compiled with fewer optimizations. It fails at the same point on two different systems, so the problem is likely in my code (but no other part of the code has any problems with those particle structures - inserting, deleting, moving and accessing particles - everything works as expected) Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7935823 in boost::archive::detail::basic_iarchive_impl::load_preamble(boost::archive::detail::basic_iarchive&, boost::archive::detail::basic_iarchive_impl::cobject_id&) () from /usr/lib/libboost_serialization.so.1.42.0 (gdb) bt #0 0x00007ffff7935823 in boost::archive::detail::basic_iarchive_impl::load_preamble(boost::archive::detail::basic_iarchive&, boost::archive::detail::basic_iarchive_impl::cobject_id&) () from /usr/lib/libboost_serialization.so.1.42.0 #1 0x00007ffff79368db in boost::archive::detail::basic_iarchive_impl::load_pointer(boost::archive::detail::basic_iarchive&, void*&, boost::archive::detail::basic_pointer_iserializer const*, boost::archive::detail::basic_pointer_iserializer const* (*)(boost::serialization::extended_type_info const&)) () from /usr/lib/libboost_serialization.so.1.42.0 #2 0x0000000000456f4c in invoke<Particle*> (ar=..., s=...) at /usr/include/boost/archive/detail/iserializer.hpp:512 #3 load<boost::mpi::packed_iarchive, Particle*> (ar=..., s=...) at /usr/include/boost/archive/detail/iserializer.hpp:580 #4 load_override<Particle*> (ar=..., s=...) at /usr/include/boost/archive/detail/common_iarchive.hpp:68 #5 load_override<Particle*> (ar=..., s=...) at /usr/include/boost/archive/basic_binary_iarchive.hpp:67 #6 load_override<Particle*> (ar=..., s=...) at /usr/include/boost/mpi/packed_iarchive.hpp:98 #7 load_override<Particle*> (ar=..., s=...) at /usr/include/boost/mpi/packed_iarchive.hpp:115 #8 operator>><Particle*> (ar=..., s=...) at /usr/include/boost/archive/detail/interface_iarchive.hpp:61 #9 load<boost::mpi::packed_iarchive> (ar=..., s=...) at /usr/include/boost/serialization/nvp.hpp:87 #10 member_load<boost::mpi::packed_iarchive, boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/serialization/access.hpp:101 #11 invoke (ar=..., s=...) at /usr/include/boost/serialization/split_member.hpp:54 #12 split_member<boost::mpi::packed_iarchive, boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/serialization/split_member.hpp:69 #13 serialize<boost::mpi::packed_iarchive> (ar=..., s=...) at /usr/include/boost/serialization/nvp.hpp:89 #14 serialize<boost::mpi::packed_iarchive, boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/serialization/access.hpp:118 #15 serialize<boost::mpi::packed_iarchive, boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/serialization/serialization.hpp:74 #16 serialize_adl<boost::mpi::packed_iarchive, boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/serialization/serialization.hpp:133 #17 invoke<boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/archive/detail/iserializer.hpp:367 #18 invoke<boost::serialization::nvp<Particle*> const> (ar=..., s=...) at /usr/include/boost/archive/detail/iserializer.hpp:433 #19 load<boost::mpi::packed_iarchive, boost::serialization::nvp<Particle*> const> (ar=..., s=...) at /usr/include/boost/archive/detail/iserializer.hpp:580 #20 load_override<boost::serialization::nvp<Particle*> const> (ar=..., s=...) at /usr/include/boost/archive/detail/common_iarchive.hpp:68 #21 load_override<boost::serialization::nvp<Particle*> const> (ar=..., s=...) at /usr/include/boost/archive/basic_binary_iarchive.hpp:67 #22 load_override<boost::serialization::nvp<Particle*> const> (ar=..., s=...) at /usr/include/boost/mpi/packed_iarchive.hpp:98 #23 load_override<boost::serialization::nvp<Particle*> const> (ar=..., s=...) at /usr/include/boost/mpi/packed_iarchive.hpp:115 #24 operator>><const boost::serialization::nvp<Particle*> > (ar=..., s=...) at /usr/include/boost/archive/detail/interface_iarchive.hpp:61 #25 operator() (ar=..., s=...) at /usr/include/boost/serialization/collections_load_imp.hpp:63 #26 boost::serialization::stl::load_collection<boost::mpi::packed_iarchive, std::list<Particle*>, boost::serialization::stl::archive_input_seq<boost::mpi::packed_iarchive, std::list<Particle*> >, boost::serialization::stl::no_reserve_imp<std::list<Particle*> > > (ar=..., s=...) at /usr/include/boost/serialization/collections_load_imp.hpp:155 #27 0x000000000045717e in load<boost::mpi::packed_iarchive, Particle*, std::allocator<Particle*> > (this=0x67af00, ar=..., x=0x9c8100, file_version=0) at /usr/include/boost/serialization/list.hpp:48 #28 invoke (this=0x67af00, ar=..., x=0x9c8100, file_version=0) at /usr/include/boost/serialization/split_free.hpp:58 #29 split_free<boost::mpi::packed_iarchive, std::list<Particle*> > (this=0x67af00, ar=..., x=0x9c8100, file_version=0) at /usr/include/boost/serialization/split_free.hpp:74 #30 serialize<boost::mpi::packed_iarchive, Particle*, std::allocator<Particle*> > (this=0x67af00, ar=..., x=0x9c8100, file_version=0) at /usr/include/boost/serialization/list.hpp:67 #31 serialize_adl<boost::mpi::packed_iarchive, std::list<Particle*> > (this=0x67af00, ar=..., x=0x9c8100, file_version=0) at /usr/include/boost/serialization/serialization.hpp:133 #32 boost::archive::detail::iserializer<boost::mpi::packed_iarchive, std::list<Particle*, std::allocator<Particle*> > >::load_object_data (this=0x67af00, ar=..., x=0x9c8100, file_version=0) at /usr/include/boost/archive/detail/iserializer.hpp:182 #33 0x00007ffff7935d6d in boost::archive::detail::basic_iarchive::load_object(void*, boost::archive::detail::basic_iserializer const&) () from /usr/lib/libboost_serialization.so.1.42.0 #34 0x0000000000454230 in invoke<std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/iserializer.hpp:381 #35 invoke<std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/iserializer.hpp:433 #36 load<boost::mpi::packed_iarchive, std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/iserializer.hpp:580 #37 load_override<std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/common_iarchive.hpp:68 #38 load_override<std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/basic_binary_iarchive.hpp:67 #39 load_override<std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/mpi/packed_iarchive.hpp:98 #40 load_override<std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/mpi/packed_iarchive.hpp:115 #41 operator>><std::list<Particle*> > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/interface_iarchive.hpp:61 #42 load<boost::mpi::packed_iarchive> (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/nvp.hpp:87 #43 member_load<boost::mpi::packed_iarchive, boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/access.hpp:101 #44 invoke (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/split_member.hpp:54 #45 split_member<boost::mpi::packed_iarchive, boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/split_member.hpp:69 #46 serialize<boost::mpi::packed_iarchive> (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/nvp.hpp:89 #47 serialize<boost::mpi::packed_iarchive, boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/access.hpp:118 #48 serialize<boost::mpi::packed_iarchive, boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/serialization.hpp:74 #49 serialize_adl<boost::mpi::packed_iarchive, boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/serialization.hpp:133 #50 invoke<boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/iserializer.hpp:367 #51 invoke<boost::serialization::nvp<std::list<Particle*> > const> (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/iserializer.hpp:433 #52 load<boost::mpi::packed_iarchive, boost::serialization::nvp<std::list<Particle*> > const> (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/iserializer.hpp:580 #53 load_override<boost::serialization::nvp<std::list<Particle*> > const> (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/common_iarchive.hpp:68 #54 load_override<boost::serialization::nvp<std::list<Particle*> > const> (this=<value optimized out>, ar=...) at /usr/include/boost/archive/basic_binary_iarchive.hpp:67 #55 load_override<boost::serialization::nvp<std::list<Particle*> > const> (this=<value optimized out>, ar=...) at /usr/include/boost/mpi/packed_iarchive.hpp:98 #56 load_override<boost::serialization::nvp<std::list<Particle*> > const> (this=<value optimized out>, ar=...) at /usr/include/boost/mpi/packed_iarchive.hpp:115 #57 operator>><const boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/interface_iarchive.hpp:61 #58 operator&<const boost::serialization::nvp<std::list<Particle*> > > (this=<value optimized out>, ar=...) at /usr/include/boost/archive/detail/interface_iarchive.hpp:68 #59 boost::serialization::array<std::list<Particle*, std::allocator<Particle*> >
::serialize_optimized<boost::mpi::packed_iarchive> (this=<value optimized out>, ar=...) at /usr/include/boost/serialization/array.hpp:72 #60 0x0000000000455499 in serialize<boost::mpi::packed_iarchive> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/serialization/array.hpp:104 #61 serialize<boost::mpi::packed_iarchive, boost::serialization::array<std::list<Particle*> > > (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/serialization/access.hpp:118 #62 serialize<boost::mpi::packed_iarchive, boost::serialization::array<std::list<Particle*> > > (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/serialization/serialization.hpp:74 #63 serialize_adl<boost::mpi::packed_iarchive, boost::serialization::array<std::list<Particle*> > > (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/serialization/serialization.hpp:133 #64 invoke<boost::serialization::array<std::list<Particle*> > > (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/archive/detail/iserializer.hpp:367 #65 invoke<boost::serialization::array<std::list<Particle*> > const> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/archive/detail/iserializer.hpp:433 #66 load<boost::mpi::packed_iarchive, boost::serialization::array<std::list<Particle*> > const> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/archive/detail/iserializer.hpp:580 #67 load_override<boost::serialization::array<std::list<Particle*> > const> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/archive/detail/common_iarchive.hpp:68 #68 load_override<boost::serialization::array<std::list<Particle*> > const> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/archive/basic_binary_iarchive.hpp:67 #69 load_override<boost::serialization::array<std::list<Particle*> > const> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/mpi/packed_iarchive.hpp:98 #70 load_override<boost::serialization::array<std::list<Particle*> > const> (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/mpi/packed_iarchive.hpp:115 #71 operator>><const boost::serialization::array<std::list<Particle*> > (ar=..., t=..., file_version=<value optimized out>) at /usr/include/boost/archive/detail/interface_iarchive.hpp:61 #72 boost::serialization::load<boost::mpi::packed_iarchive, std::list<Particle*> > (ar=..., t=..., file_version=<value optimized out>) at ~/opice/src/include/multi_array_serialize.h:35 #73 0x000000000045555e in invoke (this=0x67b1b0, ar=..., x=0x7fffffffd970, file_version=0) at /usr/include/boost/serialization/split_free.hpp:58 #74 split_free<boost::mpi::packed_iarchive, boost::multi_array<std::list<Particle*>, 3ul> > (this=0x67b1b0, ar=..., x=0x7fffffffd970, file_version=0) at /usr/include/boost/serialization/split_free.hpp:74 #75 serialize<boost::mpi::packed_iarchive, std::list<Particle*> > (this=0x67b1b0, ar=..., x=0x7fffffffd970, file_version=0) at ~/opice/src/include/multi_array_serialize.h:56 #76 serialize_adl<boost::mpi::packed_iarchive, boost::multi_array<std::list<Particle*>, 3ul> > (this=0x67b1b0, ar=..., x=0x7fffffffd970, file_version=0) at /usr/include/boost/serialization/serialization.hpp:133 #77 boost::archive::detail::iserializer<boost::mpi::packed_iarchive, boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > > ::load_object_data (this=0x67b1b0, ar=..., x=0x7fffffffd970, file_version=0) at /usr/include/boost/archive/detail/iserializer.hpp:182 #78 0x00007ffff7935d6d in boost::archive::detail::basic_iarchive::load_object(void*, boost::archive::detail::basic_iserializer const&) () from /usr/lib/libboost_serialization.so.1.42.0 #79 0x0000000000452121 in invoke<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/archive/detail/iserializer.hpp:381 #80 invoke<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/archive/detail/iserializer.hpp:433 #81 load<boost::mpi::packed_iarchive, boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/archive/detail/iserializer.hpp:580 #82 load_override<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/archive/detail/common_iarchive.hpp:68 #83 load_override<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/archive/basic_binary_iarchive.hpp:67 #84 load_override<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/mpi/packed_iarchive.hpp:98 #85 load_override<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/mpi/packed_iarchive.hpp:115 #86 operator>><boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/archive/detail/interface_iarchive.hpp:61 #87 boost::mpi::communicator::recv_impl<boost::multi_array<std::list<Particle*>, 3ul> > (this=0x705f60, source=1, tag=3, value=...) at /usr/include/boost/mpi/communicator.hpp:1191 #88 0x000000000045220c in boost::mpi::communicator::recv<boost::multi_array<std::list<Particle*>, 3ul> > (this=<value optimized out>, source=<value optimized out>, tag=<value optimized out>, value=<value optimized out>) at /usr/include/boost/mpi/communicator.hpp:1201 #89 0x000000000044ecda in Communicator::receive (this=0x67e150, slice=0x893cb0, pack_type=TYPE_PART, sendnum=1) at ~/opice/src/communicator.cpp:62 #90 0x0000000000457d8a in BorderComm::receive_particles (this=<value optimized out>) at ~/opice/src/border_comm.cpp:73 #91 0x000000000043844a in Boundary::particles (this=0x893970) at ~/opice/src/boundary.cpp:253 #92 0x000000000044bf56 in LeapFrog::move (this=0x67e170) at ~/opice/src/particle_leap_frog.cpp:128 #93 0x0000000000440029 in Experiment::run (this=0x67e0c0) at ~/opice/src/experiment.cpp:96 #94 0x000000000042f940 in main (argc=1, argv=0x7fffffffdf28) at ~/opice/src/opice.cpp:29 (gdb)
On Mon, 2011-07-25 at 01:44 +0200, Jiří Vyskočil wrote:
Hello, I'm working on a parallel physical simulation involving particles in a 3D grid.
In addition to Boost libraries, I use the Eigen3 template library for holding numerical data in small 3-vectors.
I'm trying to send a 3D boost::multi_array containing std::list of pointers to particle structs via boost::mpi and keep getting a segfault on receive.
Sending and receiving boost::multi_array of V3D Eigen3 vectors works fine.
Serialization functions for multi_array are from http://tinyurl.com/3koafmr (edited for 3 dimensions, seems to work) Serializing Eigen Vector3d type (seems to work):
friend class boost::serialization::access; template<class Archive> inline void serialize(Archive & ar, const unsigned int file_version) { ar & m_coeffs.x(); ar & m_coeffs.y(); ar & m_coeffs.z(); }
typedef Vector3d V3D; //Convenience typedef for Eigen3 vector
struct Particle { V3D r, u; double m, q; unsigned number;
friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & r; ar & u; ar & m; ar & q; ar & number; } };
Sending point:
typedef boost::multi_array<std::list<Particle*>, 3> ParticleArray;
ParticleArray part_array(boost::extents[x][y][z]); ...fill the array with particles, some cells might be empty... world->isend(recnum, pack_type, part_array);
Receiving point:
ParticleArray part_array(boost::extents[slice->shape()[0]][slice->shape()[1]][slice->shape()[2]]); world->recv(sendnum, pack_type, part_array);
When I get here, it segfaults:
terminate called after throwing an instance of 'boost::archive::archive_exception' what(): class version # 0 0 Program received signal SIGABRT, Aborted. 0x00007ffff5a29a25 in raise () from /lib64/libc.so.6 (gdb) bt #0 0x00007ffff5a29a25 in raise () from /lib64/libc.so.6 #1 0x00007ffff5a2b0af in abort () from /lib64/libc.so.6 #2 0x00007ffff64fb695 in __gnu_cxx::__verbose_terminate_handler () at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/vterminate.cc:93 #3 0x00007ffff64f9ac6 in __cxxabiv1::__terminate (handler=0x70d) at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/eh_terminate.cc:38 #4 0x00007ffff64f9af3 in std::terminate () at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/eh_terminate.cc:48 #5 0x00007ffff64f9bee in __cxxabiv1::__cxa_throw (obj=<value optimized out>, tinfo=<value optimized out>, dest=<value optimized out>) at /var/tmp/portage/sys-devel/gcc-4.4.5/work/gcc-4.4.5/libstdc++-v3/libsupc++/eh_throw.cc:83 #6 0x000000000044f7d5 in boost::archive::detail::iserializer<boost::mpi::packed_iarchive, Particle>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const () #7 0x00007ffff794173b in load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:367 #8 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:547 #9 0x000000000044f662 in boost::archive::detail::pointer_iserializer<boost::mpi::packed_iarchive, Particle>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const () #10 0x00007ffff7941c50 in load_pointer (this=0x7fffffffcae0, t=@0x7fffffffc880, bpis_ptr=0x668060, finder=<value optimized out>) at libs/serialization/src/basic_iarchive.cpp:494 #11 boost::archive::detail::basic_iarchive::load_pointer (this=0x7fffffffcae0, t=@0x7fffffffc880, bpis_ptr=0x668060, finder=<value optimized out>) at libs/serialization/src/basic_iarchive.cpp:560 #12 0x000000000044ed6f in boost::archive::detail::iserializer<boost::mpi::packed_iarchive, std::list<Particle*, std::allocator<Particle*> >
::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const () #13 0x00007ffff79416fa in load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:399 #14 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:547 #15 0x000000000044ffb4 in boost::archive::detail::iserializer<boost::mpi::packed_iarchive, boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > > ::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const () #16 0x00007ffff79416fa in load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:399 #17 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffcae0, t=<value optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:547 #18 0x00000000004516f9 in boost::mpi::status boost::mpi::communicator::recv_impl<boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > > >(int, int, boost::multi_array<std::list<Particle*, std::allocator<Particle*> >, 3ul, std::allocator<std::list<Particle*, std::allocator<Particle*> > > &, mpl_::bool_<false>) const () #19 0x000000000044982d in recv<ParticleArray> (this=0x66b150, slice=0x8779e0, pack_type=<value optimized out>, sendnum=1) at /usr/include/boost/mpi/communicator.hpp:1201 #20 Communicator::receive (this=0x66b150, slice=0x8779e0, pack_type=<value optimized out>, sendnum=1) at /home/strazce/prog/opice/opice/src/communicator.cpp:62 #21 0x000000000043d512 in Experiment::run (this=0x66b0c0) at /home/strazce/prog/opice/opice/src/experiment.cpp:96 #22 0x000000000042c13c in main (argc=1, argv=0x7fffffffd158) at /home/strazce/prog/opice/opice/src/opice.cpp:29 (gdb)
Again, this error only shows when receiving the multi_array of std::list<Particle*>. multi_array of V3D is received fine.
Thanks for any help, Jiri Vyskocil
participants (3)
-
Jiri Vyskocil
-
Jiří Vyskočil
-
Rhys Ulerich