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

独自の Array クラスの代わりに STL ベクトルを使用してみませんか。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 複合型は既にブースト シリアライゼーションに組み込まれています。

于 2011-12-07T16:32:44.027 に答える