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>>();
最佳答案 您可以使用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>>();