我想用boost :: mpi :: send()调用发送名为ABC的用户定义结构。如何通过使用boost mpi的用户定义结构
给定的结构体包含一个向量“data”,其大小在运行时确定。结构体ABC的对象由主机发送给从机。 但是从设备需要知道向量“数据”的大小,以便从设备上有足够的缓冲区来接收这些数据。 我可以通过先发送大小并在接收从结构体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;
}
感谢suszterpatt的回复。 Boost仅增加了启用向量的好处。 我目前正在使用类似于你推荐的东西。 但这并未优化。 我很想知道我是否可以使用boost序列化和MPI库以任何方式对其进行优化 – lava 2010-04-21 22:34:52
“未优化”是什么意思?你想优化哪个部分,以什么方式? – suszterpatt 2010-04-23 11:09:38
可以发送的数据量受限于接收缓冲区的大小。为了避免它,我必须发送我发送的数据的大小,以便缓冲区可以分配给相同的。 我很想知道是否有办法摆脱这两个限制。 – lava 2010-04-23 19:35:05