2 个版本
0.1.1 | 2024 年 2 月 2 日 |
---|---|
0.1.0 | 2024 年 1 月 21 日 |
#189 in 并发
每月下载量 6,845
在 9 个 Crates 中使用 (通过 sp1-core)
13KB
219 代码行
rayon-scan
本 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.0 和 MIT 许可。
[!NOTE] https://github.com/rayon-rs/rayon/pull/1036/ 已开放合并此功能到 Rayon,如果合并,则此 crate 应该变得过时。
依赖关系
~1.5MB
~25K SLoC