Rust 如何使用人造丝对并行向量进行累积求和?

Rust 如何使用人造丝对并行向量进行累积求和?,rust,rayon,Rust,Rayon,我的意图是创建一个向量,它是由原始向量的累积和以并行方式形成的。例如,vec![1,2,3,4]变成vec![1,3,6,10] 尽管尝试了几个小时,但我不知道如何使用人造丝来实现这一点 以下是我当前累积变量的尝试: use rayon::prelude::*; fn parallel(list: &Vec<u64>) -> Vec<u64> { let mut a: u64 = 0; let b = list .par_i

我的意图是创建一个向量,它是由原始向量的累积和以并行方式形成的。例如,
vec![1,2,3,4]
变成
vec![1,3,6,10]

尽管尝试了几个小时,但我不知道如何使用人造丝来实现这一点

以下是我当前累积变量的尝试:

use rayon::prelude::*;

fn parallel(list: &Vec<u64>) -> Vec<u64> {
    let mut a: u64 = 0;
    let b = list
        .par_iter()
        .cloned()
        .map(|e| {
            a += e;
            a
        })
        .collect();
    b
}

这不是一个令人尴尬的数据并行问题,您需要知道sum_i才能计算sum_i+1。您试图编写的内容,即使配备了适当的同步,也会导致随机缩减顺序。这一操作称为并行前缀扫描,并且很容易理解。请参阅相对最先进的算法。Wikipedia也有一点关于这一点:我忘了补充,我链接的算法当然最适合GPU,尽管我可以想象许多核心系统也很适合它。如果你只是想学习并行算法,维基百科上的低效算法应该是一个好的开始。这不是一个令人尴尬的数据并行问题,你需要知道sum_i才能计算sum_i+1。您试图编写的内容,即使配备了适当的同步,也会导致随机缩减顺序。这一操作称为并行前缀扫描,并且很容易理解。请参阅相对最先进的算法。Wikipedia也有一点关于这一点:我忘了补充,我链接的算法当然最适合GPU,尽管我可以想象许多核心系统也很适合它。如果你只是想学习并行算法,那么维基百科上描述的效率低下的算法应该是一个好的开始。