我正在尝试制作可以使用多线程快速扩展的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 上,以防万一。