6

Rayon看起来非常适合集合的算法并行化,Faster非常适合 x86 平台上的矢量化 (SIMD),例如Vec<f32>. 我试图将它们结合起来,迭代器似乎彼此不喜欢。有没有办法将这两个库用于可以同时受益于矢量化和并行化的算法?就像 Faster 示例中的这个:

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

1 回答 1

4

您可以只使用人造丝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>>();
于 2018-12-31T13:28:28.080 回答