Boost.MPI recv в кусочек существующего вектора

vector<int> master(100);
vector<reference_wrapper<int>> sub = master(&master[10], &master[20]);
boost::mpi::irecv(source, tag, sub);

Является ли указанное выше действительным и функциональным для получения и обновления подмножества вектора?

Если нет, есть ли эквивалентная альтернатива, кроме recv и copy?

0

Решение

Ваш код недействительный, как с радостью расскажет ваш компилятор. Там нет такого конструктора для std::vector<std::reference_wrapper<int>>, Также reference_wrapper магическим образом не работает таким образом.

Можно подумать, что boost::iterator_range было бы неплохо использовать в этом случае, но он не поддерживает сериализацию. Таким образом, помимо создания собственного адаптера диапазона, поддерживающего сериализацию, вы должны сделать это вручную. К счастью, это очень просто с помощью перегрузки массива:

comm.irecv(source, tag, &master[10], 10);

Это работает, потому что std::vector является гарантированно использовать непрерывное хранилище. Обратите внимание, вы Также необходимо отправить данные в виде массива. Не просто отправьте меньший 10-элементный вектор.

2

Другие решения

Других решений пока нет …