
使用AVX2需包含、用__m256类型、32字节内存对齐、-mavx2编译标志,逐块加载-计算-存储,如32元float数组相加需4次__m256运算。
直接用 C++ 写 AVX/SSE 指令,不靠编译器自动向量化,核心是:用 immintrin.h(或对应头文件)引入内在函数(intrinsics),操作 __m128 / __m256 等向量类型,手动调度数据和计算逻辑。
SSE 使用 128 位寄存器,AVX 使用 256 位(AVX2 还支持整数运算,AVX-512 是 512 位,需额外开启)。实际开发中建议优先用 AVX2(主流 CPU 均支持):
#include ,用 __m128,一次处理 4 个 float
#include ,用 __m256,一次处理 8 个 float
,支持 __m256i 处理 8 个 int32_t 或 32 个 int8_t
-mavx2 -mfma;MSVC:项目属性 → 启用增强指令集 → AVX2以“两个 float 数组逐元素相加”为例(长度为 32 的数组 a、b、c):
aligned_alloc(32, size) 或 _mm_malloc(size, 32)
__m256),共 4 次迭代:
for (int i = 0; i < 32; i += 8) {
__m256 va = _mm256_load_ps(&a[i]);
__m256 vb = _mm256_load_ps(&b[i]);
__m256 vc = _mm256_add_ps(va, vb);
_mm256_store_ps(&c[i], vc);
}_mm256_mask_load_ps)_mm256_loadu_ps(u 表示 unaligned)可避免崩溃,但性能略降;生产环境仍建议对齐 + 正常 load_mm256_add_ps(float)和 _mm256_add_epi32(int32)不能互换,类型不匹配会静默出错_mm256_extract_ps 开销大,应尽量保持向量化流水vec_add(float* a, float* b, float* c, int n),内部处理对齐、循环、余数别只信代码写了 intrinsic 就变快 —— 实测才是关键:
std::chrono::high_resolution_clock 测量标量版 vs SIMD 版的耗时(重复多次取平均)-S -O2 生成 .s 文件,搜索 vaddps、vmovaps 等指令确认是否生成了 AVX 指令