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()
}
// 使用 #[target_feature(enable = "avx2")] 手动启用
优化技巧
// 1. 避免循环依赖
fn bad(data: &mut [f64]) {
for i in 1..data.len() {
data[i] = data[i] + data[i-1]; // ❌ 依赖前一个结果
}
}
// 2. 使用迭代器(编译器更容易优化)
fn good(data: &[f64]) -> f64 {
data.iter().sum() // ✅ 可以并行
}
// 3. 数据对齐
#[repr(align(32))]
struct AlignedData {
data: [f64; 8],
}
SIMD crate
[dependencies]
packed_simd = "0.3" # nightly only
// nightly only
// use packed_simd::f64x4;
//
// fn add_simd(a: f64x4, b: f64x4) -> f64x4 {
// a + b
// }
小结
| 技巧 | 说明 |
|---|---|
| 迭代器 | 编译器更容易自动向量化 |
| 避免依赖 | 循环内不要依赖前一次结果 |
| 数据对齐 | #[repr(align(N))] |
| target_feature | 手动启用 CPU 特性 |
练习编辑器
rust
Loading...