1 个不稳定版本

0.1.0 2022年3月7日

#1475 in 硬件支持

MIT 协议

7KB
111

simd-slice

此 crate 提供了一个具有 simd 启用操作的包装类型 struct SimdSlice(&[T])

由于各种原因,依赖编译器的自动向量化可能会失败。使用此 crate 可以显式启用向量化,而无需冗余代码。

示例

let a: Vec<i32> = {
    let mut a = vec![0_i32; N];
    for i in 0..N {
        a[i] = (i % 12345) as i32;
    }
    a
};

use simd_slice::AsSimdSlice;

// unaligned, odd-length cases are supported
let sum: i32 = a.as_simd_slice().sum(); 
let min: Option<i32> = a.as_simd_slice().min();
let max: Option<i32> = a.as_simd_slice().max();

基准测试

在包含 1000000 项的 Vec<i32> 上进行 reduce-sum

naive:   251.136µs (=1.000, 4039 iterations in 62 samples)
rayon:   108.663µs (=0.997, 9542 iterations in 71 samples)
simd :    52.341µs (=0.998, 20470 iterations in 79 samples)
both1:   148.563µs (=0.999, 7165 iterations in 68 samples)
both2:    61.943µs (=0.992, 16915 iterations in 77 samples)
both3:    82.678µs (=0.997, 12705 iterations in 74 samples)
  • simd = simd-slice
  • both1 = rayon chunks(4) + std::simd
  • both2 = rayon chunks(4096) + std::simd
  • both3 = rayon chunks(slice.len()/num_cores) + std::simd

依赖关系

~465KB