无法使用 MPI_Send 和 MPI_Recv 发送 std::vector
cannot send std::vector using MPI_Send and MPI_Recv
我正在尝试使用 MPI 发送和 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 );
我正在考虑在主节点上将矢量转换为int[],然后在工作节点中将其转换回矢量,但这会产生不必要的开销。
有谁知道如何解决它?
如果没有更完整的示例,我不知道发生了什么,但似乎您的发送和接收不匹配(或者您没有正确初始化接收向量)。
像下面这样的东西就足够了:
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);
}
考虑 Boost::MPI,它明确支持例如 std::vector
通过 Boost::Serialization
3.0 的所有版本,而是 MPI 1.3(也许是 MPI 2.2 的一个子集,但绝对不是 RMA),因此它不是一个完美的解决方案。 但是,如果您仅使用 MPI-1 中引入的 MPI 的常见功能,那么它应该没问题。
相关文章:
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- 如何通过 mpi c++ 发送布尔数据类型?
- MPI 发送出现分段错误
- C++ MPI 发送接收问题
- MPI发送/recv的向量
- 什么是通过MPI发送OpenCV垫的最佳方法
- 使用MPI发送2D阵列
- 如何通过Boost::MPI发送2d C风格的数组
- MPI发送RECV输入参数
- MPI发送和接收的通信成本
- 如何使用 MPI 发送和接收字符串
- MPI 发送结构,C++中具有矢量属性
- MPI 发送矩阵列 (C++)
- 如何使用 MPI 发送 GMP 或 MPFR 类型
- Boost::mpi发送数组
- 通过MPI发送Lambda闭包
- 用c++ MPI发送字符串
- MPI发送/接收错误
- 使用使用 std::async 创建的线程发送的 MPI 发送的线程安全性