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