Rust中使用Rayon的par_iter并行化向量求和的两个疑问
Rust并行向量元素求和的两个问题解答
原串行代码
let a: Vec<_> = b.iter().zip(c.iter()).map(|(aa, bb)| aa + bb).collect();
你尝试的并行代码
let a: Vec<_> = b.par_iter().zip(c.par_iter()).map(|(aa, bb)| aa + bb).collect();
问题1:是否需要对zip的两个输入都使用par_iter?
是的,必须同时使用par_iter。原因如下:
par_iter()返回Rayon库的ParallelIterator类型,只有当zip的两个迭代器均为ParallelIterator时,整个链式调用才会保留并行特性。- 如果仅给其中一个迭代器用
par_iter(),另一个用普通iter(),zip后会退化为串行迭代器,后续的map和collect都会串行执行,无法实现并行加速。
问题2:能否确保输出向量的顺序与输入一致?
完全可以。Rayon的并行迭代器在向Vec这类有序容器collect时,会严格维持原迭代器的元素顺序:
- 底层实现中,Rayon会为每个并行处理的元素记录原始索引,即便不同线程的任务完成时间有差异,最终也会将计算结果放到输出向量对应的位置上,结果顺序和串行版本完全一致。
内容的提问来源于stack exchange,提问作者PMG
相关产品推荐
相关产品推荐

