gpt4 book ai didi

boost - 如何使用 boost mpi 传递用户定义的结构

转载 作者:行者123 更新时间:2023-12-01 02:56:52 24 4
gpt4 key购买 nike

我正在尝试使用 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;
}

最佳答案

您不应该发送 vector消息中的对象本身,因为接收者只需要它的内容,以及 vector 的内部状态无论如何接收后可能会全部搞砸(在发送端有效的内存地址可能在接收端无效)。

相反,您需要执行以下操作:

  • 用四个 double 数和一个简单的字符数组定义一个单独的结构。
  • 每当需要发送时,创建这个新结构的临时变量,并用 vector 的内容填充 char 数组。你想发送。
  • 定义与此特定结构对象的大小匹配的临时 MPI 数据类型。
  • 将临时结构作为此临时数据类型的实例发送。
  • 在适当大的接收缓冲区中接收它(或提前发送大小)
  • 根据 char 数组的内容重建 ABC 结构体。

  • 至少,这就是你需要用普通 C++ 和 MPI 做的事情。我不熟悉 boost,所以我不知道它是否使这些步骤中的任何一个更容易。

    关于boost - 如何使用 boost mpi 传递用户定义的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2685195/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com