SIMD 指令与缓存局部性
SIMD:一条指令同时处理多个数据 SIMD 全称 Single Instruction Multiple Data(单指令多数据),是 Flynn 分类法里的一种:一条指令同时对一组数据执行相同的操作,属于数据并行。与之相对的是普通的标量指令(SISD,Single Instruction Single Data),一条指令只处理一个数据。 CPU 指令集里的指令并不是都能批量操作数据的:只有一部分特定操作(加减乘除、位运算如异或/与/或、比较、移位等)才提供了"批量版本",这部分指令就叫 SIMD 指令;分支跳转这类指令就没有对应的 SIMD 形式。批量操作的前提是数据要打包进宽寄存器——比如一个 256 位的 YMM 寄存器可以看作 8 个 32 位整数拼在一起,一条 SIMD 指令对这个寄存器操作时,是把 8 个"数据槽"同时各自执行同一个操作(8 次加法或 8 次异或同时完成),而不是把整个 256 位当成一个数来算。这一整批 SIMD 指令加上背后的宽寄存器,合在一起就构成了一个 SIMD 指令集扩展。 现代 CPU 都提供了专门的向量寄存器和向量指令集来支持 SIMD: 架构 指令集 寄存器宽度 x86 SSE / SSE2 128 位 x86 AVX / AVX2 256 位 x86 AVX-512 512 位 ARM NEON 128 位 ARM SVE 可变长(128~2048 位) 举个例子,如果要对两个长度为 4 的 float 数组逐元素相加,用标量指令需要 4 次加法;如果用 128 位的 SSE 寄存器(正好能装下 4 个 32 位 float),一条向量加法指令就能同时算完这 4 组加法,吞吐量提升了 4 倍。 ...