1

我想使用 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
};

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

感谢期待 问候诺曼

4

1 回答 1

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 序列化中。

于 2011-12-07T16:32:44.027 回答