Boost :: Serialization Mpi发送用户定义类型的数组

时间:2010-06-03 13:23:18

标签: c++ serialization boost-mpi

我想使用boost Mpi发送我的Array类

template<class T>
class Array
{
 private:
  int size;
  T* data;
 public:
  // constructors + other stuff
};

此处T可以是任何内置类型或用户定义类型。假设我有一个类复杂的

struct complex
{
 std::vector<double> real_imag; // contain two elements
};

所以问题是如何使用Boost :: Mpi +序列化发送Array<complex>

感谢您的期待 问候 诺曼

1 个答案:

答案 0 :(得分:4)

为什么不使用STL向量而不是自己的Array类。 STL向量的序列化已经在boost / serialization / vector.hpp中构建。如果你想发送一系列复数,你可以这样:

#include <vector>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/complex.hpp>
#include <boost/serialization/vector.hpp>

using namespace std;
namespace mpi=boost::mpi;

int main (int argc, char *argv[])
{
    mpi::environment env(argc, argv);
    mpi::communicator world;
    int myid=world.rank();
    int NN=world.size();
    int N=10;

    vector< complex<double> >A(N);

    if (myid==0)
    {
            for (int i=0; i!=N; i++)
            {
                    A[i]=complex<double>(i, i);
            }
            world.send(1, 0, A);
    }
    if (myid==1)
    {
            world.recv(0, 0, A);

            cout << "###" << endl;
            for (int i=0; i!=N; i++)
            {
                    cout << A[i] << "\t" ;
            }
            cout << endl;
            cout << "###" << endl;
    }
}

如果没有,则必须使作为向量内容的数据类型可序列化。如果该数据类型的序列化不是boost序列化库的一部分,则必须编写自己的序列化。例如,对于你上面的复杂结构,像这样的一些想法应该做的伎俩(未经测试):

namespace boost
{
    namespace serialization
    {
            template<class Archive>
            void serialize(Archive & ar, complex & c, const unsigned int version)
            {
                    ar & c.real_imag;
            }
    }
}

但正如我所说,STL复杂类型已经在boost序列化中构建。