3 个不稳定版本

0.2.0 2022 年 11 月 12 日
0.1.1 2022 年 11 月 11 日
0.1.0 2022 年 11 月 11 日

#947 in 并发

AGPL-3.0 或更高版

17KB
354

木綿(momen) 是低开销线程池库。木綿(momen) 在日语中意为棉花。

使用方法

use momen::prelude::*;
fn daxpy(alpha: f64, x: &[f64], y: &mut [f64]) {
    y.iter_mut().zip(x.iter()).for_each(|(y, x)| *y += alpha * *x);
}
let thread_pool = ThreadPoolDyn::new();
let n = thread_pool.max_len();
let mut x = Vec::with_capacity(1000);
let mut y = vec![0f64; 1000];
for i in 0..1000 {
    x.push(i as f64);
}
let chunck_size = (1000 + n - 1) / n;
let alpha = std::f64::consts::PI;
x.chunks(chunck_size)
 .zip(y.chunks_mut(chunck_size))
 .par_for_each_dyn(&|(x, y)| daxpy(alpha, x, y), &thread_pool);
for i in 0..1000 {
    assert_eq!(alpha * x[i], y[i]);
}

基准测试

  • 操作系统: Ubuntu
  • 处理器: Ryzen 9 5950X
  • 内存: DDR4 3600MHz 128GB
  • momen = "0.2.0"
  • rayon = "1.5.3"

lib.rs:

木綿(momen) 是低开销线程池库。

use momen::prelude::*;
fn daxpy(alpha: f64, x: &[f64], y: &mut [f64]) {
    y.iter_mut().zip(x.iter()).for_each(|(y, x)| *y += alpha * *x);
}
let thread_pool = ThreadPoolDyn::new();
let n = thread_pool.max_len();
let mut x = Vec::with_capacity(1000);
let mut y = vec![0f64; 1000];
for i in 0..1000 {
    x.push(i as f64);
}
let chunck_size = (1000 + n - 1) / n;
let alpha = std::f64::consts::PI;
x.chunks(chunck_size)
 .zip(y.chunks_mut(chunck_size))
 .par_for_each_dyn(&|(x, y)| daxpy(alpha, x, y), &thread_pool);
for i in 0..1000 {
    assert_eq!(alpha * x[i], y[i]);
}

依赖项

~0.1–11MB
~61K SLoC