#并行 #性能 #连接 #线程

rayon-scan

针对 ParallelIterator 的并行前缀扫描函数

2 个版本

0.1.1 2024 年 2 月 2 日
0.1.0 2024 年 1 月 21 日

#189 in 并发

Download history 337/week @ 2024-03-14 209/week @ 2024-03-21 151/week @ 2024-03-28 123/week @ 2024-04-04 491/week @ 2024-04-11 562/week @ 2024-04-18 619/week @ 2024-04-25 609/week @ 2024-05-02 1007/week @ 2024-05-09 969/week @ 2024-05-16 1163/week @ 2024-05-23 1526/week @ 2024-05-30 1284/week @ 2024-06-06 2157/week @ 2024-06-13 1665/week @ 2024-06-20 1472/week @ 2024-06-27

每月下载量 6,845
9 个 Crates 中使用 (通过 sp1-core)

MIT/Apache

13KB
219 代码行

rayon-scan

Current Version Documentation License: MIT/Apache-2.0

本 crate 为 Rayon 的 ParallelIterator 提供了 Iterator scan 方法的并行版本。

Scan 是一个高阶函数,类似于 fold,但在每一步都累积中间结果。具体来说,scan 迭代器的第 n 个元素是使用给定操作对输入的前 n 个元素进行归约的结果。

并行扫描的主要区别是操作必须是结合的。在顺序扫描中,操作按从左到右的顺序应用于输入,但在并行扫描中,顺序是不确定的。

使用方法

// Iterate over a sequence of numbers `x0, ..., xN`
// and use scan to compute the partial sums
use rayon::prelude::*;
use rayon_scan::ScanParallelIterator;

let partial_sums = [1, 2, 3, 4, 5]
                    .into_par_iter()       // iterating over i32
                    .scan(|a, b| *a + *b,  // add (&i32, &i32) -> i32
                          0)               // identity
                    .collect::<Vec<i32>>();
assert_eq!(partial_sums, vec![1, 3, 6, 10, 15]);

性能

对于常规的整数前缀和或乘积,并行开销太大,无法看到并行版本有任何改进。然而,足够复杂的操作,如大矩阵乘法,可以观察到很大的性能提升。

为了最大限度地提高性能,限制拆分的数量是一个好主意,例如通过使用 .with_min_len()。并行扫描有一个顺序部分,它在拆分的数量上呈线性时间。

有关实现和性能的更多详细信息,请参阅 https://github.com/rayon-rs/rayon/pull/1036/

测试和基准测试

运行测试

cargo test

运行基准测试

cargo +nightly test --features "bench"

许可

根据 Apache 2.0MIT 许可。

[!NOTE] https://github.com/rayon-rs/rayon/pull/1036/ 已开放合并此功能到 Rayon,如果合并,则此 crate 应该变得过时。

依赖关系

~1.5MB
~25K SLoC