【问题标题】:using boost serialization with C MPI functions使用带有 C MPI 函数的 boost 序列化
【发布时间】:2015-11-19 15:14:24
【问题描述】:

谁能给我一个混合 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 安装似乎对消息大小有限制。

【问题讨论】:

  • 这个例子有帮助吗? stackoverflow.com/questions/31014044/…
  • @JonathanDursi:是的,这是一个很好的话题!但是,我从下面发布的 boost.mpi 邮件列表中得到了更好的答案。

标签: c++ serialization boost mpi


【解决方案1】:

在 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;
}

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 2014-06-07
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多