Boost.MPI传递用户自定义类型

BoostMPI传递用户自定义类型

 

typedef Eigen::Matrix vec3d;
typedef Eigen::Matrix vec3i;
class Node
{
public:
    vec3d coord,disp,vel,acc;
    int global_id,local_id;
public:
    Node(){}
    ~Node(){}
    Node(int globalid,int localid)
    {
        coord[0]=coord[1]=coord[2]=0;
        disp=vel=acc=coord;
        global_id=globalid;local_id=localid;
    }
};

这里定义了一个变量,主要是工程计算中的节点概念,每个节点会有自己的id,然后节点会有坐标、位移、速度、加速度等信息,这里都用了Eigen库中的向量来封装。

所以这个还是结构还是比较复杂的。

Node node1(0,0);

这里实例化了一个node1,这个node1通信的时候,如果用mpi的话,因为里面封装了Eigen的数据类型,虽然底层跟double[3]可能没什么区别,虽然在物理内存上是连续的,但是用mpi自带的自定义contiguous datatype已经有点困难了。

现在再加大难度,几个Node是一个整体,放到一个vector里面

std::vector send;
for(int i=0;i<10;i++)
{
    send.push_back(Node(i,i));
}

我把这个Node用vector再封装一次,这时候如果还想用标准MPI去整体通信的话基本上是不可能了,只能一个double一个double的通讯,这样就比较麻烦了。

这个功能可以利用Boost.MPI来实现。

整体代码如下,记住一定要修改Eigen的文件,也在最底层的数据结构中加上serialize()接口,否则boostmpi只能用来传递boost serialziation库中的数据类型。

#include 
#include "Eigen/Dense"
#include 
#include 
#include 

namespace mpi=boost::mpi;
typedef Eigen::Matrix vec3d;
typedef Eigen::Matrix vec3i;
class Node
{
public:
    vec3d coord,disp,vel,acc;
    int global_id,local_id;
public:
    Node(){}
    ~Node(){}
    Node(int globalid,int localid)
    {
        coord[0]=coord[1]=coord[2]=0;
        disp=vel=acc=coord;
        global_id=globalid;local_id=localid;
    }
    template
    void serialize(Archive &ar,const unsigned int version)
    {
        ar &coord;
        ar &disp;
        ar &vel;
        ar &acc;
        ar &global_id;
        ar &local_id;
    }
};
int main(int argc,char **argv)
{
    mpi::environment env;
    mpi::communicator world;
    if(0==world.rank())
    {
        std::vector send;
        for(int i=0;i<10;i++)
        {
            send.push_back(Node(i,i));
        }
        world.send(1,0,send);
    }
    else {
        std::vector recv;
        std::cout<

编译后用两个cpu运行,最后输出结构 0 10,就说明成功接受了这个用vector封装的node数据

你可能感兴趣的:(MPI,Boost)