Rayon 很适合集合的算法并行化,并且 Faster 非常适合在x86平台上进行矢量化(simd),例如 Vec<f32> 是的。我试着把它们组合起来,迭代器似乎不喜欢彼此。有没有办法将这两个库用于既有利于矢量化又有利于并行化的算法?比如下面这个例子:
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>>();
你可以用人造丝 par_chunks 以更快的速度处理每一块。
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>>();