Hi
I am trying to scatter some values to workers and then gather them. But I
get strange error in gather step.
Any suggestions?
Below is the code and error file.
//mpicxx test-boost.cpp -o test-boost -I
/home1/mutlu/boost/include/boost-1_37/
/home1/mutlu/boost/lib/libboost_mpi-gcc41-mt-1_37.a
#include
#include
#include
#include
#include <iostream>
#include <vector>
#define MASTER 0
namespace mpi = boost::mpi;
using namespace std;
struct x{
string name;
int age;
};
int arraySize = 23;
void silly_func(int *px, int sz){
for(int i = 0; i < sz; i++)
px[i] = 100;
}
int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
int m_mySize, w_mySize, kk,i;
int *myValues;
vector<int> a;
vector<int> aa;
for(int i = 0; i < arraySize; i++) a.push_back(i);
w_mySize = arraySize / world.size();
if (world.rank() == MASTER){
m_mySize = arraySize / world.size() + arraySize % world.size();
myValues = (int *) malloc(m_mySize);
}
else{
myValues = (int *) malloc(w_mySize);
}
if (world.rank() == MASTER)
scatter(world, a, myValues, w_mySize, 0);
else
scatter(world, a, myValues, w_mySize, 0);
if (world.rank() == MASTER) // append the remaining elements
{
for (i = w_mySize * world.size(), kk = 0; i < arraySize; i++, kk++)
myValues[w_mySize + kk] = a[w_mySize * world.size() + kk];
}
cout << "my rank is " << world.rank() << " and my values are" << endl;
if (world.rank() == MASTER)
for (int i = 0; i < m_mySize; i++)
cout << myValues[i] << endl;
if (world.rank() != MASTER)
for (int i = 0; i < w_mySize; i++)
cout << myValues[i] << endl;
if (world.rank() != MASTER)
silly_func(myValues, w_mySize);
else
silly_func(myValues, m_mySize);
if (world.rank() == MASTER)
gather(world, myValues, m_mySize, aa, 0);
else
gather(world, myValues, w_mySize, aa, 0);
if (world.rank() == MASTER){
cout << "======================="<< endl;
for(int i = 0; i < aa.size(); i++)
cout << aa[i] << endl;
}
}
and error file is
[ceng3:23784] *** Process received signal ***
[ceng3:23784] Signal: Segmentation fault (11)
[ceng3:23784] Signal code: Address not mapped (1)
[ceng3:23784] Failing at address: (nil)
[ceng3:23784] [ 0] /lib64/libpthread.so.0 [0x30e100de80]
[ceng3:23784] [ 1] /lib64/libc.so.6(memcpy+0x37) [0x30e047a107]
[ceng3:23784] [ 2]
/usr/mpi/gcc/openmpi-1.2.8/lib64/libmpi.so.0(ompi_ddt_copy_content_same_ddt+0xe8)
[0x2b180e3b5618]
[ceng3:23784] [ 3]
/usr/mpi/gcc/openmpi-1.2.8/lib64/libmpi.so.0(ompi_ddt_sndrcv+0x3f3)
[0x2b180e3b3ef3]
[ceng3:23784] [ 4]
/usr/mpi/gcc/openmpi-1.2.8/lib64/openmpi/mca_coll_basic.so(mca_coll_basic_gather_intra+0xd2)
[0x2b18142f20a2]
[ceng3:23784] [ 5]
/usr/mpi/gcc/openmpi-1.2.8/lib64/libmpi.so.0(PMPI_Gather+0x19b)
[0x2b180e3c7ccb]
[ceng3:23784] [ 6]
test-boost(_ZN5boost3mpi6detail11gather_implIiEEvRKNS0_12communicatorEPKT_iPS6_iN4mpl_5bool_ILb1EEE+0x6b)
[0x414b29]
[ceng3:23784] [ 7]
test-boost(_ZN5boost3mpi6gatherIiEEvRKNS0_12communicatorEPKT_iPS5_i+0x50)
[0x414c82]
[ceng3:23784] [ 8]
test-boost(_ZN5boost3mpi6gatherIiEEvRKNS0_12communicatorEPKT_iRSt6vectorIS5_SaIS5_EEi+0x42)
[0x414ce8]
[ceng3:23784] [ 9] test-boost(main+0x342) [0x40f62c]
[ceng3:23784] [10] /lib64/libc.so.6(__libc_start_main+0xf4) [0x30e041d8b4]
[ceng3:23784] [11] test-boost(__gxx_personality_v0+0x141) [0x40f199]
[ceng3:23784] *** End of error message ***
mpirun noticed that job rank 0 with PID 23784 on node ceng3-ib exited on
signal 11 (Segmentation fault).