我正在尝试使用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
我尝试了多种组合
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 );
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 );
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 );
我正在考虑在主节点上将vector转换为int [],然后将其转换回工作节点中的vector,但这会产生不必要的开销。
有谁知道如何解决它?
答案 0 :(得分:8)
如果没有更完整的示例,我不知道发生了什么,但似乎您发送和接收不匹配(或者您没有正确初始化接收向量)。
以下内容就足够了:
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);
}
答案 1 :(得分:3)
考虑Boost::MPI,它解释了支持,例如std::vector
通过Boost :: Serialization。
当然,Boost :: MPI不支持所有MPI 3.0,而是支持MPI 1.3(可能是MPI 2.2的一个子集,但绝对不是RMA),因此它不是一个完美的解决方案。但是,如果你只使用MPI-1中引入的MPI的常用功能,那么应该没问题。