接上例:如果vector中元素是class,要将他们分给不同进程,程序如下:
#include "stdafx.h"
#include <boost/mpi.hpp>
#include <iostream>
#include <vector>
#include "VecAndMatrix.h"
namespace mpi = boost::mpi;
class cPoint
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & x;
ar & y;
ar & z;
ar & m;
}
public:
double x,y,z;
double m;
cPoint(){;};
cPoint(double xt,double yt,double zt,double mt):x(xt),y(yt),z(zt),m(mt){;};
};
int main(int argc, char *argv[]) {
mpi::environment env(argc, argv);
mpi::communicator world;
int tag = 99;
std::vector<cPoint> v;
for(int i=0;i<10;i++)v.push_back(cPoint(i,i,i,5));
if (world.rank() == 0) {
int load = v.size()/world.size();
int start = load+v.size()%world.size();
for (int i = 1; i < world.size(); ++i){
std::vector<cPoint> to_send (v.begin()+start,v.begin()+start+load);
world.send(i,tag,to_send);
start+=load;}
}
else {
std::vector<cPoint> v;
world.recv(0,tag,v);
for(int i=0;i<v.size();i++){
std::cout<<world.rank()<<'\t'<<i<<'\t'<<v[i].x<<'\t'<<v[i].y<<'\t'<<v[i].z<<'\t'<<v[i].m<<std::endl;}
}
}