是否可以将 Rayon 和 Faster 结合起来?
Is it possible to combine Rayon and Faster?
Rayon looks great for algorithm parallelization of collections, and Faster 非常适合在 x86 平台上对 Vec<f32>
等集合进行矢量化 (SIMD)。我试图将它们结合起来,但迭代器似乎彼此不喜欢。有没有办法将这两个库用于可以同时受益于矢量化和并行化的算法?就像 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>>();
您可以只使用 Rayon 的 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>>();
Rayon looks great for algorithm parallelization of collections, and Faster 非常适合在 x86 平台上对 Vec<f32>
等集合进行矢量化 (SIMD)。我试图将它们结合起来,但迭代器似乎彼此不喜欢。有没有办法将这两个库用于可以同时受益于矢量化和并行化的算法?就像 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>>();
您可以只使用 Rayon 的 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>>();