94·性能优化高级

SIMD 向量化

SIMD 向量化

学习目标

  1. 理解 SIMD 概念
  2. 掌握自动向量化
  3. 了解 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...