1 个不稳定版本
0.1.0 | 2022年3月7日 |
---|
#1475 in 硬件支持
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 (R²=1.000, 4039 iterations in 62 samples)
rayon: 108.663µs (R²=0.997, 9542 iterations in 71 samples)
simd : 52.341µs (R²=0.998, 20470 iterations in 79 samples)
both1: 148.563µs (R²=0.999, 7165 iterations in 68 samples)
both2: 61.943µs (R²=0.992, 16915 iterations in 77 samples)
both3: 82.678µs (R²=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