如何解决为什么并行化不能提供更大的加速? 编辑:
我正在尝试制作可以使用多线程非常快速扩展的 HashMap 的变体。我正在使用余数对数据进行分区。它正在工作,但与我的顺序版本相比,速度提升幅度小得惊人。这是我的代码:
use rustc_hash::FxHashMap;
use rayon::prelude::*;
use std::time::Instant;
fn main() {
const NUM_SUBMAPS: usize = 1_000;
// initialize data for serial version
let mut data_vecs = vec![Vec::new(); NUM_SUBMAPS];
for i in 0..100_000_000 {
data_vecs[i % NUM_SUBMAPS].push((i,i));
}
let mut maps = vec![FxHashMap::default(); NUM_SUBMAPS];
// initialize clones for parallel version
let (data_vecs_clone,mut maps_clone) = (data_vecs.clone(),maps.clone());
// time sequential version
let t = Instant::Now();
maps.iter_mut().zip(data_vecs).for_each(|(submap,vec)| {
submap.extend(vec);
});
println!("time in sequential version: {}",t.elapsed().as_secs_f64());
drop(maps);
// time parallel version
let t = Instant::Now();
maps_clone.par_iter_mut().zip(data_vecs_clone).for_each(|(submap,vec)| {
submap.extend(vec);
});
println!("time in parallel version: {}",t.elapsed().as_secs_f64());
}
这是我机器上的输出:
time in sequential version: 1.9712106999999999
time in parallel version: 0.7583539
并行版本更快,但加速比我通常使用 Rayon 获得的要低得多。我使用的是 16 核 Ryzen 5950x,所以我通常使用 Rayon 获得超过 10 倍的加速。为什么在这种情况下加速比小得多?有没有办法改进并行版本以有效地使用所有 cpu 的内核?
编辑:
我使用的是 Windows,以防万一。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。