Boost.MPI 接收到现有向量的切片
Boost.MPI recv into slice of existing vector
vector<int> master(100);
vector<reference_wrapper<int>> sub = master(&master[10], &master[20]);
boost::mpi::irecv(source, tag, sub);
以上是否有效且可用于接收和更新矢量的子集?
如果不是,是否有除 recv 和 copy 之外的等效替代方法?
您的代码无效,因为您的编译器会很乐意告诉您。 std::vector<std::reference_wrapper<int>>
没有这样的构造函数。另外 reference_wrapper
不会以这种方式神奇地工作。
有人可能会认为,在这种情况下使用 boost::iterator_range
是个好主意,但它不支持序列化。因此,除了构建您自己的支持序列化的范围适配器之外,您还必须手动完成。幸运的是,使用数组重载非常简单:
comm.irecv(source, tag, &master[10], 10);
之所以有效,是因为 std::vector
是 guaranteed to use contiguous storage。请注意,您还必须以数组形式发送数据。不要只发送一个较小的 10 元素向量。
vector<int> master(100);
vector<reference_wrapper<int>> sub = master(&master[10], &master[20]);
boost::mpi::irecv(source, tag, sub);
以上是否有效且可用于接收和更新矢量的子集?
如果不是,是否有除 recv 和 copy 之外的等效替代方法?
您的代码无效,因为您的编译器会很乐意告诉您。 std::vector<std::reference_wrapper<int>>
没有这样的构造函数。另外 reference_wrapper
不会以这种方式神奇地工作。
有人可能会认为,在这种情况下使用 boost::iterator_range
是个好主意,但它不支持序列化。因此,除了构建您自己的支持序列化的范围适配器之外,您还必须手动完成。幸运的是,使用数组重载非常简单:
comm.irecv(source, tag, &master[10], 10);
之所以有效,是因为 std::vector
是 guaranteed to use contiguous storage。请注意,您还必须以数组形式发送数据。不要只发送一个较小的 10 元素向量。