Boost :: Serialization Mpi Отправка массива пользовательских типов - PullRequest
1 голос
/ 03 июня 2010

Я хочу отправить свой класс Array, используя boost Mpi

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 +.

Спасибо в ожидании С уважением Noman

1 Ответ

4 голосов
/ 07 декабря 2011

Почему бы вам не использовать вектор 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;
    }
}

Если нет, вы должны сделать сериализуемый тип данных, содержащий содержимое вашего вектора. Если сериализация этого типа данных не является частью библиотеки расширенной сериализации, вы должны написать свою собственную сериализацию. Например, для вашей сложной структуры сверху что-то вроде этого должно сработать (не проверено):

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

Но, как я уже сказал, комплексный тип STL уже встроен в ускоренную сериализацию.

...