4

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;
}
4

2 に答える 2

3

オブジェクト自体をメッセージで送信しないvectorでください。受信者はその内容のみを必要とし、vectorとにかく受信した後に内部状態がすべて台無しになる可能性があるためです (送信側で有効だったメモリアドレスはおそらく送信されません)。受信側で有効)。

代わりに、次のことを行う必要があります。

  1. 4 つの double と単純な char 配列を含む別の構造体を定義します。
  2. 送信する必要があるときはいつでも、この新しい構造体の一時変数を作成し、送信する内容を char 配列に入力vectorします。
  3. この特定の構造体オブジェクトのサイズに一致する一時的な MPI データ型を定義します。
  4. この一時データ型のインスタンスとして一時構造体を送信します。
  5. 適切な大きさの受信バッファーで受信します (または事前にサイズを送信します)。
  6. char 配列の内容に基づいて ABC 構造体を再構築します。

少なくとも、それはバニラ C++ と MPI で行う必要があることです。私はブーストに慣れていないので、これらの手順が簡単になるかどうかはわかりません。

于 2010-04-21T18:23:05.647 に答える
0

BOOST_IS_MPI_DATATYPEは、固定長データ専用です。配列は固定長ではないため、失敗します。

于 2010-04-30T18:54:14.157 に答える