Самое простое, что нужно сделать, это вообще избежать необходимости в индексе. В этом примере мы можем просто заархивировать итераторы:
use rayon::prelude::*; // 1.3.0
fn main() {
let input = vec![4, 7, 2, 3, 5, 8];
let mut output = vec![0; input.len() * 4];
// Can also use `.zip(&input)` if you don't want to give up ownership
output.par_chunks_mut(4).zip(input).for_each(|(o, i)| {
for o in o {
*o = i
}
});
println!("{:?}", output)
}
Для традиционных итераторов этот стиль реализации полезен, поскольку позволяет избежать ненужных проверок границ, которые в противном случае были бы обработаны итератором. Я не уверен, что Rayon извлекает выгоду из точно такой же вещи, но я также не вижу причин, по которым это не так.