
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 <boost/asio/ip/host_name.hpp> #include <iostream> #include <vector> #include <string> #include <boost/mpi/environment.hpp> #include <boost/mpi/communicator.hpp> #include <boost/mpi.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #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