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
является гарантированно использовать непрерывное хранилище. Обратите внимание, вы Также необходимо отправить данные в виде массива. Не просто отправьте меньший 10-элементный вектор.
Других решений пока нет …