boost :: mpi :: send()呼び出しを使用して、ABCという名前のユーザー定義構造を送信しようとしています。
指定された構造体には、実行時にサイズが決定されるベクトル「データ」が含まれています。構造体ABCのオブジェクトは、マスターからスレーブに送信されます。ただし、スレーブは、このデータを受信するのに十分なバッファがスレーブで使用できるように、ベクトル「データ」のサイズを知る必要があります。struct ABCのオブジェクトを受信する前に、最初にサイズを送信し、スレーブで十分なバッファーを初期化することで、この問題を回避できます。しかし、それはSTLコンテナを使用するという目的全体を無効にします。
誰かがこれを処理するためのより良い方法を知っていますか?どんな提案でも大歓迎です。
これが私のプログラムの意図を説明するサンプルコードです。このコードは、上記の理由により実行時に失敗します。
struct ABC
{
 double cur_stock_price;
 double strike_price;
 double risk_free_rate;
 double option_price;
 std::vector <char> data;
};
namespace boost
{
 namespace serialization
 {
   template<class Archive>
   void serialize (Archive &ar,
                   struct ABC &abc,
                   unsigned int version)
   {
     ar & abc.cur_stock_price;
     ar & abc.strike_price;
     ar & abc.risk_free_rate;
     ar & abc.option_price;
     ar & bopr.data;
   }
 }
}
BOOST_IS_MPI_DATATYPE (ABC);
int main(int argc, char* argv[])
{
 mpi::environment env (argc, argv);
 mpi::communicator world;
 if (world.rank () == 0)
 {
   ABC abc_obj;
  abc.cur_stock_price = 1.0;
  abc.strike_price = 5.0;
  abc.risk_free_rate = 2.5;
  abc.option_price = 3.0;
  abc_obj.data.push_back ('a');
  abc_obj.data.push_back ('b');
   world.send ( 1, ANY_TAG, abc_obj;);
   std::cout << "Rank 0 OK!" << std::endl;
 }
else if (world.rank () == 1)
{
   ABC abc_obj;
  // Fails here because abc_obj is not big enough
   world.recv (0,ANY_TAG, abc_obj;);
   std::cout << "Rank 1 OK!" << std::endl;
   for (int i = 0; i < abc_obj;.data.size(); i++)
     std::cout << i << "=" << abc_obj.data[i] << std::endl;
 }
 MPI_Finalize();
 return 0;
}