SIMD 向量化
更新时间:2026-10-01。配合 SoA 布局,向量化是吞吐优化主力。
一、自动向量化优先
简单、无循环携带依赖、对齐、无别名(restrict)的循环,-O3 可自动向量化。用 -fopt-info-vec(gcc)/ -Rpass=loop-vectorize(clang)查看是否成功及原因,优先改循环形态而非手写汇编。
二、intrinsics
需要手动控制时用 #include <immintrin.h>(AVX)或 NEON 头:__m256 向量、_mm256_load_ps/_mm256_add_ps/_mm256_store_ps,一次处理 8 个 float。代价是平台耦合、可移植性差、尾元素要标量处理。

三、常见坑
- 依赖/未对齐导致没向量化却以为已加速。
- intrinsics 跨平台不可用。
- 忽略剩余元素越界。
小结
总结
SIMD 用一条指令并行处理多个数据来成倍提升数据并行吞吐:应先让编译器自动向量化——写规整、无循环携带依赖、对齐、用 restrict 消除别名的循环并开 -O3,用 -fopt-info-vec/-Rpass=loop-vectorize 查清没向量化的原因、优先调整循环形态;自动不够才手写平台相关的 intrinsics(x86 SSE/AVX 的 __m256/_mm256_*、ARM NEON),代价是可移植性差、需处理对齐和尾部元素,且与 SoA 布局配合收益最大。