C++ 将boost序列化与C-MPI函数一起使用

C++ 将boost序列化与C-MPI函数一起使用,c++,serialization,boost,mpi,C++,Serialization,Boost,Mpi,有谁能给我举个例子,说明boost序列化与C MPI函数的混合 我想我需要使用boost::mpi::oarchive。但是我应该如何初始化缓冲区参数,以及在初始化之后我应该传递什么到MPI\u Send 更具体地说,我正在尝试做如下事情: mpi::environment env; mpi::communicator world; typedef vector <int> ParticleList_t; #define MSG_LEN 100000 ParticleList_t s

有谁能给我举个例子,说明boost序列化与C MPI函数的混合

我想我需要使用
boost::mpi::oarchive
。但是我应该如何初始化缓冲区参数,以及在初始化之后我应该传递什么到
MPI\u 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);
mpi::环境env;
mpi::通信器世界;
typedef向量粒子列表;
#定义MSG_LEN 100000
分词列表发送buf(MSG_LEN,1),recvbuf(MSG_LEN);
mpi::packed_oarchive::buffer_类型buffer(sizeof(sendbuf[0])*sendbuf.size());
mpi::packed_oarchive oa(世界、缓冲区、boost::归档::无头文件);
oa&sendbuf;
if(world.rank()==0)
MPI_发送(oa、1、MPI_打包、1、0、MPI_通信世界);
我是否必须确保缓冲区足够大,或者
oarchive
将自动处理内存?如果是前者,保存向量的正确内存大小是多少?我想它不仅应该包含
vec.data()
,还应该包含
vec.size()

最后,
oa
似乎不是传递给
MPI\u Send
的正确变量。那么,在创建归档文件之后,我应该传递什么到
MPI\u Send


我这样问是因为在我们的服务器上安装boostmpi似乎对消息大小有限制

在boost.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;
}
使用名称空间std;
#包括
#包括
#包括
名称空间mpi=boost::mpi;
int main(int argc,字符**argv)
{
环境环境;
mpi::通信器世界;
#定义MSG_LEN 100000
向量sendbuf(MSG_LEN,1),recvbuf(MSG_LEN);
MPI_Comm Comm=世界;
if(world.rank()==0)
{
mpi:包装的香葱oa(通信);

oa这个例子有用吗?@JonathanDursi:是的,这是一个很好的线索!但是,我从下面发布的boost.mpi邮件列表中得到了更好的答案。