代码之家  ›  专栏  ›  技术社区  ›  Stan Prokop

有可能把人造丝和更快的结合起来吗?

  •  4
  • Stan Prokop  · 技术社区  · 6 年前

    Rayon 很适合集合的算法并行化,并且 Faster 非常适合在x86平台上进行矢量化(simd),例如 Vec<f32> 是的。我试着把它们组合起来,迭代器似乎不喜欢彼此。有没有办法将这两个库用于既有利于矢量化又有利于并行化的算法?比如下面这个例子:

    let lots_of_3s = (&[-123.456f32; 128][..]).iter()
        .map(|v| {
            9.0 * v.abs().sqrt().sqrt().recip().ceil().sqrt() - 4.0 - 2.0
        })
        .collect::<Vec<f32>>();
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Anders Kaseorg    6 年前

    你可以用人造丝 par_chunks 以更快的速度处理每一块。

    let lots_of_3s = (&[-123.456f32; 1000000][..])
        .par_chunks(128)
        .flat_map(|chunk| {
            chunk
                .simd_iter(f32s(0.0))
                .simd_map(|v| {
                    f32s(9.0) * v.abs().sqrt().rsqrt().ceil().sqrt() - f32s(4.0) - f32s(2.0)
                })
                .scalar_collect()
        })
        .collect::<Vec<f32>>();
    
    推荐文章