Signal code: Address not mapped (1) eroor

Hi, I am getting the following run time errors for the code below. Any suggestions? _alev [ceng34:00724] *** Process received signal *** [ceng34:00724] Signal: Segmentation fault (11) [ceng34:00724] Signal code: Address not mapped (1) [ceng34:00724] Failing at address: 0xfffffffffffffff8 [ceng34:00724] [ 0] /lib64/libpthread.so.0 [0x315880de80] [ceng34:00724] [ 1] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx18__exchange_and_addEPVii+0x2) [0x385dab7672] [ceng34:00724] [ 2] /usr/lib64/libstdc++.so.6(_ZNSs6assignERKSs+0x9b) [0x385da9ca4b] [ceng34:00724] [ 3] test-boost(_ZN5fieldaSERKS_+0x47) [0x42197f] [ceng34:00724] [ 4] test-boost(_ZNSt6__copyILb0ESt26random_access_iterator_tagE4copyIPK5fieldPS3_EET0_T_S8_S7_+0x3c) [0x4221be] [ceng34:00724] [ 5] test-boost(_ZSt10__copy_auxIPK5fieldPS0_ET0_T_S5_S4_+0x29) [0x422203] [ceng34:00724] [ 6] test-boost(_ZNSt13__copy_normalILb0ELb0EE6copy_nIPK5fieldPS2_EET0_T_S7_S6_+0x25) [0x42222b] [ceng34:00724] [ 7] test-boost(_ZSt4copyIPK5fieldPS0_ET0_T_S5_S4_+0x2d) [0x42225b] [ceng34:00724] [ 8] test-boost(_ZN5boost3mpi6detail12scatter_implI5fieldEEvRKNS0_12communicatorEPKT_PS7_iiN4mpl_5bool_ILb0EEE+0x90) [0x42a630] [ceng34:00724] [ 9] test-boost(_ZN5boost3mpi7scatterI5fieldEEvRKNS0_12communicatorEPKT_PS6_ii+0x50) [0x42b162] [ceng34:00724] [10] test-boost(_ZN5boost3mpi7scatterI5fieldEEvRKNS0_12communicatorERKSt6vectorIT_SaIS7_EEPS7_ii+0x55) [0x42b1db] [ceng34:00724] [11] test-boost(main+0x20e) [0x420880] [ceng34:00724] [12] /lib64/libc.so.6(__libc_start_main+0xf4) [0x3157c1d8b4] [ceng34:00724] [13] test-boost(__gxx_personality_v0+0x169) [0x420489] [ceng34:00724] *** End of error message *** mpirun noticed that job rank 0 with PID 724 on node ceng34-ib exited on signal 11 (Segmentation fault). #include <boost/mpi/environment.hpp> #include <boost/mpi/communicator.hpp> #include <boost/mpi/collectives.hpp> #include <boost/thread/barrier.hpp> #include <boost/thread/mutex.hpp> #include <boost/config.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/access.hpp> #include <boost/serialization/string.hpp> #include <boost/mpi/skeleton_and_content.hpp> #include <boost/mpi/datatype.hpp> #include <boost/mpi/allocator.hpp> #include <boost/archive/tmpdir.hpp> #include <boost/serialization/utility.hpp> #include <boost/serialization/base_object.hpp> #include <boost/mpi.hpp> #include <boost/tokenizer.hpp> #include <boost/archive/tmpdir.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/serialization/export.hpp> #include <boost/serialization/base_object.hpp> #include <boost/serialization/utility.hpp> #include <boost/serialization/hash_map.hpp> #include <boost/serialization/map.hpp> #include <string> #include <iostream> #include <vector> #include <fstream> #define MASTER 0 int arraySize = 7; using namespace std; namespace mpi = boost::mpi; struct field { string field_name; string field_type; string field_ref; string field_colType; }; namespace boost { namespace serialization{ template<class Archive> void serialize(Archive & ar, struct field & f, unsigned int version){ ar & f.field_name; ar & f.field_type; ar & f.field_ref; ar & f.field_colType; } } } int main(int argc, char* argv[]) { mpi::environment env(argc, argv); mpi::communicator world; int m_mySize, w_mySize, kk,i; struct field *relAllValues; struct field *relMyValues; vector<struct field> C; struct field c; w_mySize = arraySize / world.size(); cout << "w_mySize = " << w_mySize << endl; if (world.rank() == MASTER){ for(int i = 0; i < arraySize; i++){ c.field_name = "field_name=" ; c.field_type = "field_type="; c.field_ref = "field_ref="; c.field_colType = "field_colType="; C.push_back(c); } m_mySize = arraySize / world.size() + arraySize % world.size(); relMyValues = (struct field *) malloc(sizeof(struct field) * w_mySize); relAllValues = (struct field *) malloc(sizeof(struct field) * arraySize); } else{ relMyValues = (struct field *) malloc(sizeof(struct field) * w_mySize); } if (world.rank() == MASTER){ scatter(world, C, relMyValues, w_mySize, 0); } else{ scatter(world, C, relMyValues, w_mySize, 0); } if (world.rank() == 1){ cout << "MY RANK IS " << world.rank() << endl; } }

AMDG alev mutlu wrote:
int arraySize = 7; <snip> int main(int argc, char* argv[]) { <snip>
if (world.rank() == MASTER){ scatter(world, C, relMyValues, w_mySize, 0); } else{ scatter(world, C, relMyValues, w_mySize, 0); } }
I don't know much about MPI, so this may be totally off, but the implementation seems to assume that you're going to send an equal number of elements to each process. If arraySize is not evenly divisible by world.size(), this could cause MPI_Scatter to read uninitialized memory, which would explain your problem. In Christ, Steven Watanabe
participants (2)
-
alev mutlu
-
Steven Watanabe