paradis:更简洁的新Rust并行编程库


paradis 是一个新的 Rust 并行编程库,在大幅简化并行代码的编写,它提供了一种新的底层抽象,作为 Rust 并行编程的补充。

  • 简化目前在 Rust 中难以优雅表达的并行数据结构访问模式。
  • 简化了在处理具有非顺序索引集的数据结构时的并行编程方式。

背景
Rust 是一种非常适合解决具有相对简单并行访问模式的数据并行问题的语言:

  • 当数据可以拆分成连续的块时,它尤其出色。
  • 另一方面,对于不连续或结构化程度较低的并行访问模式,事情可能会变得混乱。

paradis抽象
paradis 提供了一种基础抽象,用于组合并行访问和索引,从而解决了目前在 Rust 中正确表达这种并行访问模式的困难。

它通过在更高级别上提供抽象来实现这一点:

  1. 用于对集合中的独立记录进行不同步访问的低级、不安全的抽象 。
  2. 在不安全基础层之上构建的更高级别的抽象,允许用安全代码或最少的不安全代码来表达许多并行访问模式。

下面的示例展示了如何paradis安全地并行迭代位于切片中任意索引处的可变元素。

use paradis::index::{IndexList, narrow_access};
use paradis::rayon::create_par_iter;
use rayon::iter::ParallelIterator;

let mut data = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let indices = vec![4, 7, 1].check_unique().expect("Indices are unique");
let access = narrow_access(data.as_mut_slice(), &indices)
    .expect(
"Indices are in bounds of the data structure");
create_par_iter(access).for_each(|x_i| *x_i = 0);

assert_eq!(data, vec![0, 0, 2, 3, 0, 5, 6, 0, 8, 9]);

paradis 主要特点:

  • paradis 专注于组合访问和索引,只需少量代码即可支持 rayon 并行迭代器。
  • 允许您使用安全代码或最少量的不安全代码访问非顺序数据结构。
  • paradis 的诞生源于希望能够使用安全代码并行组装有限元方法的稀疏矩阵。

paradis 主要提供了零成本抽象,如果将你的数据能变得可并行性,那么paradis 将自动实现数据的并行处理。