可以将人造丝和更快结合吗?

时间:2018-07-09 20:01:57

标签: parallel-processing rust simd rayon

Rayon非常适合集合的算法并行化,而Faster非常适合x86平台上的Vec<f32>这样的集合的矢量化(SIMD)。我试图将它们组合在一起,并且迭代器似乎彼此不喜欢。有没有一种方法可以将这两个库用于可从向量化和并行化中受益的算法?像“更快”示例中的这样:

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 个答案:

答案 0 :(得分:1)

您可以只使用人造丝的par_chunks并使用Faster处理每个块。

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>>();