Parallel processing 有可能结合人造丝和更快的速度吗?

Parallel processing 有可能结合人造丝和更快的速度吗?,parallel-processing,rust,simd,rayon,Parallel Processing,Rust,Simd,Rayon,对于集合的算法并行化非常有用,对于x86平台上的集合(如Vec)的矢量化(SIMD)也非常有用。我尝试将它们结合起来,迭代器似乎彼此不喜欢。有没有一种方法可以将这两个库用于同时受益于矢量化和并行化的算法?像下面这个例子: let lots_of_3s = (&[-123.456f32; 128][..]).iter() .map(|v| { 9.0 * v.abs().sqrt().sqrt().recip().ceil().sqrt() - 4.0 - 2.0

对于集合的算法并行化非常有用,对于x86平台上的集合(如
Vec
)的矢量化(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>>();
let lots_of_3s=(&[-123.456f32;128][…]).iter()
.地图(v){
9.0*v.abs().sqrt().sqrt().recip().ceil().sqrt()-4.0-2.0
})
收集::();

您可以使用人造丝,以更快的速度处理每个块

让一批三合一=(&[-123.456f32;1000000][..)
.par_块(128)
.平面图(|块|{
大块
.simd_iter(f32s(0.0))
.simd|u图(|v|{
f32s(9.0)*v.abs().sqrt().rsqrt().ceil().sqrt()-f32s(4.0)-f32s(2.0)
})
.scalar_collect()
})
收集::();

需要注意的一件事是超线程内核。我的理解是,这些虚拟内核没有自己的SIMD单元,因此您将与自己竞争,导致大量的缓存抖动。@Shepmaster:是的,只需一个线程就可以使整个内核的SIMD执行单元饱和的代码不需要超读,但这种情况很少见。就像一个调音很好的马特穆尔。甚至像x264和x265这样的视频编解码器(大量使用矢量ALU)也会因为使用每个物理核心的两个逻辑核心而获得较小的加速,比如1080p视频上Skylake i7-6700k上的
x264-preset slow
。如果您的代码在延迟而不是吞吐量上出现瓶颈(例如,在没有足够累加器的情况下减少),则HT可以是一种暴露更多指令级并行性的好方法。@Shepmaster:TL:DR:SMT(超线程的通用形式)是一种向每个物理内核暴露更多指令级并行性的方法。具有独立迭代的循环不会带来太多好处,但是隐藏缓存未命中延迟仍然有帮助,除非来自竞争同一缓存的两个线程的额外缓存压力会导致太多未命中。(一些微体系结构资源是静态分区的,例如Intel CPU中的ROB和store缓冲区,但性能不太可能因为缩小它们而下降。)嗯,我没有意识到有一个陷阱,很高兴知道这一点。谢谢你的评论。