0

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

4

0 回答 0