无法使用MPI_Send和MPI_Recv发送std :: vector

use*_*266 6 c++ parallel-processing hpc vector mpi

我正在尝试使用MPI send和recv函数发送std:vector但我没有到达哪里.我得到的错误就像

Fatal error in MPI_Recv: Invalid buffer pointer, error stack:
MPI_Recv(186): MPI_Recv(buf=(nil), count=2, MPI_INT, src=0, tag=0, MPI_COMM_WORLD, status=0x7fff9e5e0c80) failed
MPI_Recv(124): Null buffer pointer
Run Code Online (Sandbox Code Playgroud)

我尝试了多种组合

A)像用于发送数组的那些..

 std::vector<uint32_t> m_image_data2; // definition of  m_image_data2
     m_image_data2.push_back(1);
     m_image_data2.push_back(2);
     m_image_data2.push_back(3);
     m_image_data2.push_back(4);
     m_image_data2.push_back(5);

MPI_Send( &m_image_data2[0], 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Send( &m_image_data2[2], 2, MPI_INT, 1, 0, MPI_COMM_WORLD);

MPI_Recv( &m_image_data2[0], 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
Run Code Online (Sandbox Code Playgroud)

B)没有[]

MPI_Send( &m_image_data2, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Send( &m_image_data2 + 2, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);

MPI_Recv( &m_image_data2, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
Run Code Online (Sandbox Code Playgroud)

C)使用像at()的矢量方法.

MPI_Send( &m_image_data2.at(0), 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Send( &m_image_data2.at(2), 2, MPI_INT, 1, 0, MPI_COMM_WORLD);

MPI_Recv( &m_image_data2.at(0), 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
Run Code Online (Sandbox Code Playgroud)

我正在考虑在主节点上将vector转换为int []然后将其转换回工作节点中的向量,但这将是不必要的开销.

有谁知道如何解决它?

ipa*_*dop 10

如果没有更完整的示例,我不知道发生了什么,但似乎您发送和接收不匹配(或者您没有正确初始化接收向量).

像下面这样的东西就足够了:

std::vector<uint32_t> m_image_data2;

if (rank==0) {
  m_image_data2.push_back(1);
  m_image_data2.push_back(2);
  m_image_data2.push_back(3);
  m_image_data2.push_back(4);
  m_image_data2.push_back(5);
  // send 5 ints at once
  MPI_Send( &m_image_data2[0], 5, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
else {
  // make space for 5 ints
  m_image_data2.resize(5);
  // receive 5 ints
  MPI_Recv(&m_image_data2[0], 5, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
}
Run Code Online (Sandbox Code Playgroud)

  • 你不需要使用`&m_image_data2 [0]`来从`std :: vector`获取数据,有一个`.data()`函数就是这样做的; 即`&m_image_data2 [0] == m_image_data2.data()` (3认同)
  • @ wolfPack88`std :: vector.data()`是一个C++ 11特性,它可能不适用于OP,但是这是一种不那么冗长的方式. (2认同)