为什么 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 进入接收缓冲区:它们使用相同的查询状态计数的机制对象。