Using Boost.MPI with gather , data becomes overwritten after gather operation

Hi,
I am trying to use Boost.MPI to do a very simple program that
1. Processes from different ranks do a gather operation
2. The gather operation will gather the CoProcessInfo ( which is just
a data structure of rank# and hostname) into a vector
3. After the gather operation, Rank 0 will print the CoProcessInfo
one by one in the vector.
------------------------------------------------------------------------------------------------------------------------------------------------------
My testing environment consists of TWO virtual machine ( each of the
machine has two cores ):
Centos 5.5
mpich2
Boost.mpich2
Boost 1.41
mpiexec
------------------------------------------------------------------------------------------------------------------------------------------------------
The expected output of the program should be something like ( just an
example order of ranks ):
Host VM1, Rank 0
Host VM1, Rank 1
Host VM2, Rank 2
Host VM2, Rank 3
----------------------------------------------------------------------------------------------------------------------------------------------------------
However, I got something like: ( just an example order of ranks ), the
hostname is incorrect after gather operation ( three VM2 appears!)
Host VM1, Rank 0
Host VM2, Rank 1
Host VM2, Rank 2
Host VM2, Rank 3
I found that each process CAN correctly found out the hostname and
rank#, however, the data will become a bit like overwritten, after the
gather operation. Thank you very much.
------------------------------------------- Source Code
-------------------------------------------------------------------
#include

Hi, I found that if I move hostname = boost::asio::ip::host_name(); rank = 0; out from the constructor , and adding methods like setHostname(), setRank(), it will work fine. In the investigation, I found that the default constructor of the class is invoked once during the gather operation. Is it related to my problem? and Is it the result of some operations from boost.serialization and boost.MPI ? Thank you :) On 09/01/2010 12:26 AM, hgc-01134@hkedcity.net wong wrote:
Hi, I am trying to use Boost.MPI to do a very simple program that 1. Processes from different ranks do a gather operation 2. The gather operation will gather the CoProcessInfo ( which is just a data structure of rank# and hostname) into a vector 3. After the gather operation, Rank 0 will print the CoProcessInfo one by one in the vector.
------------------------------------------------------------------------------------------------------------------------------------------------------ My testing environment consists of TWO virtual machine ( each of the machine has two cores ): Centos 5.5 mpich2 Boost.mpich2 Boost 1.41 mpiexec ------------------------------------------------------------------------------------------------------------------------------------------------------
The expected output of the program should be something like ( just an example order of ranks ):
Host VM1, Rank 0 Host VM1, Rank 1 Host VM2, Rank 2 Host VM2, Rank 3
---------------------------------------------------------------------------------------------------------------------------------------------------------- However, I got something like: ( just an example order of ranks ), the hostname is incorrect after gather operation ( three VM2 appears!)
Host VM1, Rank 0 Host VM2, Rank 1 Host VM2, Rank 2 Host VM2, Rank 3
I found that each process CAN correctly found out the hostname and rank#, however, the data will become a bit like overwritten, after the gather operation. Thank you very much.
------------------------------------------- Source Code ------------------------------------------------------------------- #include
#include<iostream> #include<vector> #include<string> #include #include #include #include #include #include<sstream> #include<fstream> using namespace std; namespace mpi = boost::mpi;
class CoProcessInfo { private:
string hostname; int rank;
friend class boost::serialization::access; template<class Archive> void serialize(Archive& ar, const unsigned int /* version */) { ar& hostname& rank; }
public: CoProcessInfo() { hostname = boost::asio::ip::host_name(); rank = 0; }
void setRank(int _rank) { rank = _rank; }
string getHostname() const { return hostname; }
int getRank() const { return rank; } };
int main(int argc, char* argv[]) { int myrank;
mpi::environment env(argc, argv); mpi::communicator world; myrank = world.rank();
CoProcessInfo localInfo; localInfo.setRank( myrank );
std::vector<CoProcessInfo> coProcInfo; mpi::gather(world, localInfo, coProcInfo, 0);
if( myrank == 0 ){ for (std::vector<CoProcessInfo>::const_iterator it = coProcInfo.begin(); it !=coProcInfo.end(); ++it) { cout<< endl<< " Host : "<< it->getHostname()<< " , Rank :" << it->getRank()<< endl; } } return 0; } -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Regards, Joseph
participants (2)
-
emeplease
-
hgc-01134@hkedcity.net wong