微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么并行化不能提供更大的加速? 编辑:

如何解决为什么并行化不能提供更大的加速? 编辑:

我正在尝试制作可以使用多线程非常快速扩展的 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 举报,一经查实,本站将立刻删除。