gpt4 book ai didi

boost - 在 Boost MPI 中使用骨架/内容机制发送复杂数据

转载 作者:行者123 更新时间:2023-12-02 00:27:59 30 4
gpt4 key购买 nike

似乎通过骨架/内容发送STL复杂数据机制不起作用。

这是显示问题的简单代码:

#include <boost/mpi.hpp>
#include <boost/serialization/complex.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
namespace mpi = boost::mpi;
using namespace std;

int main(int argc, char* argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
int NN=world.size();
int myid=world.rank();

if (myid == 0)
{
int N = 10;
vector <complex<double> > l(N);
for (int p=1; p!=NN; p++)
{
int taskid=1;
world.send(p, 0, taskid);
world.send(p, 1, mpi::skeleton(l));
}
mpi::content c = mpi::get_content(l);
for (int n = 0; n!=l.size() ; n++)
{
l[n]=complex<double>(1.0,1.0);
}
for (int p=1; p!=NN; p++)
{
world.send(p, 1, c);
}
}
else if (myid == 2)
{
vector <complex<double> > l;
mpi::content c;
world.recv(0, 1, mpi::skeleton(l));
c = mpi::get_content(l);
world.recv(0, 1, c);
for (int n=0; n!=l.size(); n++)
{
cout << l[n] << " ";
}
cout << endl;
}
}

输出向量 l 的条目不是 (1.0,1.0) 但它们似乎是未初始化。只有在使用复杂数据类型并且框架/内容机制。

有谁知道,如果这是一个构建有问题,还是我做错了什么?

最佳答案

我最近在我的一个类(class)中遇到了类似的问题,在调试器中逐步完成序列化过程后,我想我明白了是怎么回事。问题是在序列化运算符中使用临时对象。在 boost/serialization/complex.hpp 中,序列化函数如下所示:

template<class Archive, class T>
inline void save(
Archive & ar,
std::complex< T > const & t,
const unsigned int /* file_version */
){
const T re = t.real();
const T im = t.imag();
ar << boost::serialization::make_nvp("real", re);
ar << boost::serialization::make_nvp("imag", im);
}

template<class Archive, class T>
inline void load(
Archive & ar,
std::complex< T >& t,
const unsigned int /* file_version */
){
T re;
T im;
ar >> boost::serialization::make_nvp("real", re);
ar >> boost::serialization::make_nvp("imag", im);
t = std::complex< T >(re,im);
}

请注意,序列化是通过临时对象完成的。 get_content 功能通过构建 MPI 数据类型来工作,它实际上是内存中内容位置的映射。当收到消息时,MPI 将数据直接复制到这些位置,而不调用任何序列化运算符。问题是,当“保存”使用临时数据时,get_content() 不会获取实际数据的位置,而是临时数据,因此接收到的数据没有放在正确的位置。

要使骨架/内容功能起作用,我的印象是保存函数(这是 get_content() 调用的函数)必须直接且仅序列化对象的数据成员。在这种情况下它不能,因为它无权访问 complex 的内部表示。我认为必须将序列化运算符编写为类的成员。

(在 Boost::MPI 文档中似乎根本没有提到这些限制。)

关于boost - 在 Boost MPI 中使用骨架/内容机制发送复杂数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127442/

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