什么是 CPU 指令集与向量加速 AVX / NEON?
从“单把水果刀逐个切胡萝卜”,进化为“四联排超宽组合钢刀一刀剁下8片”——让 CPU 算力在不提高时钟频率的情况下暴涨 4~16 倍的并行核武器!
Single Instruction Single Data(单指令单数据)。执行 $A + B$ 循环时,CPU 每次时钟周期只能读取 1 个数字,执行 1 次加法,吐出 1 个结果。面对百万级像素或大模型张量,需要循环执行百万次指令。
Single Instruction Multiple Data(单指令多数据)。一条指令直接操控 128/256/512 位超宽向量寄存器,在同一个时钟周期内将 4 个、8 个甚至 16 个浮点数同时打包相加或相乘!
CPU 向量加速的三大底层支柱
从超宽寄存器到乘加融合指令的极致设计
1. 宽幅向量寄存器 (Vector Lanes)
普通寄存器只有 64 位(存 1 个整数/双精度浮点)。而 AVX2 提供 256 位 YMM 寄存器,AVX-512 提供 512 位 ZMM 寄存器,ARM NEON 提供 128 位 Q0~Q31。寄存器被划分为多个“车道”(Lanes)并行塞入数据。
2. 数据级并行 (Data-Level Parallelism)
无需启动多个复杂的操作系统线程(多线程有上下文切换和锁开销)。单核心内部的 ALU 算术逻辑单元被加宽,同一个硬件时钟节拍内,一条微指令直接广播到所有车道同步结算。
3. 乘加融合指令 (FMA / Fused Multiply-Add)
矩阵乘法的灵魂算子 $D = A \times B + C$。传统做法是先算乘法、舍入、再算加法(2 条指令 + 精度损耗);FMA(AVX2/NEON 内置)将其合并为单周期单指令单次舍入,吞吐翻倍且精度更高!
📐 向量位宽与车道容量演进图(以 32-bit 单精度浮点数为例)
随着指令集代际演进,寄存器一次性能“吞吐”的浮点数数量呈指数级跃升:
🎮 交互模拟器:向量化对 1,000,000 个浮点数矩阵点积的提速实测
点击下方不同的 CPU 指令集执行模式,观察执行周期、循环次数与理论吞吐:
深入理解:两大阵营的向量化演进
x86 与 ARM 在指令集架构上的世纪竞合
x86:从 MMX、SSE 到 AVX-512 / AVX10
x86 阵营走的是“大力出奇迹”路线。早期 AVX-512 因发热量大曾导致 CPU 降频,但随着工艺进步,AMD Zen4/Zen5 与 Intel 新架构已全面攻克功耗瓶颈,成为 llama.cpp CPU 量化推理的核心主力。
ARM:NEON 普及化与 SVE / SME 可变长向量
ARM 从 iPhone、安卓手机到 Apple Silicon 全面标配 128 位 NEON。新一代 ARMv9 更是引入了 SVE(可伸缩向量)与 SME(矩阵扩展),让编译器无需重写代码即可自动适配不同硬件位宽。
自动向量化 (Auto-Vectorization)
现代 GCC、Clang 编译器极度聪明:当你写出简单的 for (int i=0; i<N; i++) a[i] += b[i]; 时,开启 -O3 -mavx2 编译器就会自动为你发射 vaddps 等向量指令,无需手写汇编!