SIMD 向量化
学习目标
- 理解 SIMD 概念
- 掌握自动向量化
- 了解
std::simd(nightly)
核心概念
自动向量化
fn sum_array(data: &[f64]) -> f64 {
data.iter().sum()
}
fn dot_product(a: &[f64], b: &[f64]) -> f64 {
a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
}
优化技巧
fn bad(data: &mut [f64]) {
for i in 1..data.len() {
data[i] = data[i] + data[i-1];
}
}
fn good(data: &[f64]) -> f64 {
data.iter().sum()
}
#[repr(align(32))]
struct AlignedData {
data: [f64; 8],
}
SIMD crate
[dependencies]
packed_simd = "0.3"
小结
| 技巧 | 说明 |
|---|
| 迭代器 | 编译器更容易自动向量化 |
| 避免依赖 | 循环内不要依赖前一次结果 |
| 数据对齐 | #[repr(align(N))] |
| target_feature | 手动启用 CPU 特性 |