为什么 std::vector.size() 不能与 MPI 一起使用?
Why doesn't std::vector.size() work with MPI?
当数据通过 MPI 接口 sent/received 时,我在使用 std::vector 的方法 .size() 时遇到了麻烦。我创建了一个名为 point
的自定义类型
template<typename T>
struct point{
T data[ndim];
point() = default;
point(const T& a, const T& b): data{a,b} {} // not correct
point(const T&& a, const T&&b): data{std::move(a),std::move(b)} {}
explicit point(const point& mypoint): data{mypoint.data[0], mypoint.data[1]} {}
};
并且进程 0 应该向进程 1 和 2 发送一个名为 数据集 的某个 std::vector 点。首先我创建了 MPI_Datatype :
MPI_Datatype MPI_point; // custom datatype
MPI_Type_contiguous(2, MPI_FLOAT,&MPI_point);
MPI_Type_commit(&MPI_point);
然后实现消息传递:
#define count 10
MPI_Init ( NULL, NULL );
std::vector<point<float>> receive_buff;
receive_buff.reserve(count)
int rank;
int size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(rank==0){
MPI_Send(dataset.data(), count, MPI_point, 1,1,MPI_COMM_WORLD);
MPI_Send(dataset.data(), count, MPI_point, 2,2,MPI_COMM_WORLD);
}
else{
MPI_Recv(receive_buff.data(),count,MPI_point, 0,rank,MPI_COMM_WORLD, &status);
}
receive_buff 实际上正确接收了进程 0 发送的消息,如果尝试打印它我得到了预期值,我的问题是 receive_buff.size() return 0虽然它显然是非空的,但事实上 receive_buff.end() return 是 receive_buff.begin() 的相同迭代器,但我真的不知道如何解决这个问题。提前致谢。
我也试过 MPI_Type_vector 和 MPI_Type_struct,但都不行
首先,MPI对C++了解不多,你真正使用的是C接口。所以接收不会做 push_back
:你给它一个足够大的缓冲区,它把元素写在那里。 (毕竟,你只传递它 buffer.data()
所以 MPI 甚至不知道缓冲区是 std::vector
。)
仍然可以询问接收调用您收到了多少数据:MPI_Get_count(&status,yourtype,&count)
returns消息中接收到的类型元素有多少。
顺便说一句,有 MPI 的原生 C++ 接口,例如 MPL,但即使它们不 push_back
进入接收缓冲区:它们使用相同的查询状态计数的机制对象。
当数据通过 MPI 接口 sent/received 时,我在使用 std::vector 的方法 .size() 时遇到了麻烦。我创建了一个名为 point
的自定义类型template<typename T>
struct point{
T data[ndim];
point() = default;
point(const T& a, const T& b): data{a,b} {} // not correct
point(const T&& a, const T&&b): data{std::move(a),std::move(b)} {}
explicit point(const point& mypoint): data{mypoint.data[0], mypoint.data[1]} {}
};
并且进程 0 应该向进程 1 和 2 发送一个名为 数据集 的某个 std::vector 点。首先我创建了 MPI_Datatype :
MPI_Datatype MPI_point; // custom datatype
MPI_Type_contiguous(2, MPI_FLOAT,&MPI_point);
MPI_Type_commit(&MPI_point);
然后实现消息传递:
#define count 10
MPI_Init ( NULL, NULL );
std::vector<point<float>> receive_buff;
receive_buff.reserve(count)
int rank;
int size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(rank==0){
MPI_Send(dataset.data(), count, MPI_point, 1,1,MPI_COMM_WORLD);
MPI_Send(dataset.data(), count, MPI_point, 2,2,MPI_COMM_WORLD);
}
else{
MPI_Recv(receive_buff.data(),count,MPI_point, 0,rank,MPI_COMM_WORLD, &status);
}
receive_buff 实际上正确接收了进程 0 发送的消息,如果尝试打印它我得到了预期值,我的问题是 receive_buff.size() return 0虽然它显然是非空的,但事实上 receive_buff.end() return 是 receive_buff.begin() 的相同迭代器,但我真的不知道如何解决这个问题。提前致谢。
我也试过 MPI_Type_vector 和 MPI_Type_struct,但都不行
首先,MPI对C++了解不多,你真正使用的是C接口。所以接收不会做 push_back
:你给它一个足够大的缓冲区,它把元素写在那里。 (毕竟,你只传递它 buffer.data()
所以 MPI 甚至不知道缓冲区是 std::vector
。)
仍然可以询问接收调用您收到了多少数据:MPI_Get_count(&status,yourtype,&count)
returns消息中接收到的类型元素有多少。
顺便说一句,有 MPI 的原生 C++ 接口,例如 MPL,但即使它们不 push_back
进入接收缓冲区:它们使用相同的查询状态计数的机制对象。