paradis:更簡潔的新Rust並行程式設計庫

banq發表於2024-06-06


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(<font>"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 將自動實現資料的並行處理。

 

相關文章