使用C MPI函数的boost序列化
using boost serialization with C MPI functions
有人能给我举一个将boost序列化与C MPI函数混合的例子吗?
我想我需要使用boost::mpi::oarchive
。但是,我应该如何初始化缓冲区参数,之后我应该向MPI_Send
传递什么?
更具体地说,我正在尝试做以下事情:
mpi::environment env;
mpi::communicator world;
typedef vector <int> ParticleList_t;
#define MSG_LEN 100000
ParticleList_t sendbuf(MSG_LEN, 1), recvbuf(MSG_LEN);
mpi::packed_oarchive::buffer_type buffer(sizeof(sendbuf[0])*sendbuf.size());
mpi::packed_oarchive oa(world, buffer, boost::archive::no_header);
oa & sendbuf;
if(world.rank()==0)
MPI_Send(oa, 1, MPI_PACKED, 1, 0, MPI_COMM_WORLD);
我是否必须确保缓冲区足够大,或者oarchive
将自动处理内存?如果是前者,保存向量的正确内存大小是多少?我想它应该不仅包含vec.data()
,还包含vec.size()
。
最后,oa
似乎不是传递给MPI_Send
的正确变量。那么在创建归档之后,我应该向MPI_Send
传递什么?
我之所以这么问,是因为我们服务器上的boost mpi安装似乎对消息大小有限制。
在助推的帮助下。MPI邮件列表,我将以下示例放在一起:
using namespace std;
#include <iostream>
#include <string>
#include <boost/mpi.hpp>
namespace mpi = boost::mpi;
int main(int argc, char **argv)
{
mpi::environment env;
mpi::communicator world;
#define MSG_LEN 100000
vector <int> sendbuf(MSG_LEN, 1), recvbuf(MSG_LEN);
MPI_Comm comm=world;
if(world.rank()==0)
{
mpi::packed_oarchive oa(comm);
oa << sendbuf;
auto sendptr = const_cast<void*>(oa.address());
// cast to int because MPI uses ints for sizes like it's still 1990
int sendsize = static_cast<int>(oa.size());
MPI_Send(&sendsize, 1, MPI_INT, 1, 0, comm);
MPI_Send(sendptr, sendsize, MPI_PACKED, 1, 0, comm);
}
else if (world.rank()==1)
{
mpi::packed_iarchive ia(comm);
int recvsize;
MPI_Recv(&recvsize, 1, MPI_INT, 0, 0, comm, MPI_STATUS_IGNORE);
ia.resize(recvsize);
auto recvptr = ia.address();
MPI_Recv(recvptr, recvsize, MPI_PACKED, 0, 0, comm, MPI_STATUS_IGNORE);
ia >> recvbuf;
cout<<"Data received: "<<recvbuf[0]<<","<<recvbuf[1]<<"...n";
}
return 0;
}
相关文章:
- C++boost序列化多态性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何使用 Boost 序列化mersenne_twister_engine?
- boost::序列化中的派生类偏移量计算.有效吗?
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- 序列化模式类似于boost::序列化
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- 使用 boost::序列化序列化 std::vector of unique_ptr 在 Linux 上失败
- 使用 boost::序列化将派生类指针序列化为向量时出现问题
- 跳过层次结构中的中间类,并使用boost ::序列化
- 使用Boost序列化std ::乘坐
- Boost::序列化存储结构时的堆栈溢出错误
- 2D 矢量未正确保存并加载 boost::序列化库
- 使用Boost序列化保存和检索多个对象
- 使用boost::序列化递归图结构时,如何防止堆栈溢出
- 特征矩阵+Boost::序列化/C++17
- C++Boost序列化:输入流错误
- 将Boost序列化文本存档转换为结构化格式
- Microsoft Guid guid serialization使用Boost序列化
- Boost::序列化 - 如何序列化需要数据分配但没有默认构造函数的数据结构