Rust: Rayon - A data parallelism library for Rust
rayon là thư viện data-parallelism cho Rust, gọn nhẹ và dễ dàng convert từ
code tính toán tuần tự sang song song mà vẫn đảm bảo không lỗi data-race.
File: Cargo.toml
[dependencies]
rayon = "1.5"
Ví dụ:
use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32 {
input.par_iter() // <-- chỉ cần sử dụng `par_iter()` thay vì `iter()`!
.map(|&i| i * i)
.sum()
}
Parallel iterators
sẽ phụ trách việc chia data thành nhiều tasks nhỏ như thế nào và sẽ
đáp ứng linh hoạt để đạt maximum performance.
Ngoài ra, Rayon cũng cung cấp 2 function join và scope để bạn
có thể chủ động điều khiển việc parallel tasks.
Để tìm hiểu thêm về cách rayon hoạt động bạn có thể đọc thêm bài blog từ tác giả:
https://smallcultfollowing.com/babysteps/blog/2015/12/18/rayon-data-parallelism-in-rust/
Demo & benchmark
https://rust-tieng-viet.github.io/crates/rayon.html#demo--bench
References
Related Posts
Rust: indoc
indoc là một crate nhỏ nhưng hữu ích giúp canh lề (indented documents). indoc!() macro nhận multiline string và un-indents lúc compile time, xoá tất cả khoảng trắng đầu tiên trên cách dòng dựa theo dòng đầu tiên.
Rust: Box
Tất cả giá trị trên Rust mặc định đều được allocated trên stack. Giá trị có thể được boxed, allocated trên heap bằng cách sử dụng Box<T>. Box<T> là một smart pointer của Rust cho phép allocated trên heap giá trị có kiểu T, còn pointer trỏ đến giá trị đó sẽ nằm trên stack.
Rust Design Pattern: Builder Pattern
Builder được sử dụng cực kỳ phổ biến trong Rust so với các ngôn ngữ khác, bởi vì Rust không có overloading.
Rust Design Pattern: Command Pattern
Ý tưởng cơ bản của Command Pattern là tách các actions thành các object riêng và gọi chúng thông qua parameters.