基于SIMD实现4/8个DWORD整数的向量内前缀和
高效计算连续累积和的SIMD实现方案(Sapphire Rapids及以上CPU)
问题背景
现有由4或8个无符号DWORD整数组成的向量化向量V,需计算从V[0]+V[1]开始,直到V[0]+…+V[7]的所有连续累积和(保留所有中间结果),已知求和无溢出(总和不超过2^28-1),CPU为Intel Sapphire Rapids及以上。
最优实现:利用AVX-512前缀和指令
Sapphire Rapids原生支持AVX-512指令集,其中的vprefixsumud(无符号双字前缀和)指令可以单条指令完成所有前缀和计算,效率远高于朴素加法。
8元素DWORD向量(256位/512位向量)
使用vprefixsumud指令直接计算:
vprefixsumud zmm1, zmm0 ; zmm0为输入向量V,zmm1存储前缀和结果
生成的结果向量中:
zmm1[0] = V[0]zmm1[1] = V[0]+V[1]zmm1[2] = V[0]+V[1]+V[2]- ...
zmm1[7] = V[0]+…+V[7]
直接提取zmm1[1]到zmm1[7]即可得到你需要的所有连续累积和。
4元素DWORD向量(128位向量)
同理使用128位版本的指令:
vprefixsumud xmm1, xmm0 ; xmm0为输入向量V,xmm1存储前缀和结果
提取xmm1[1]到xmm1[3]就是目标结果。
效率对比
- 朴素加法需要多次向量加法+移位操作(8元素场景至少需要7条指令),延迟高且占用更多硬件资源。
vprefixsumud是硬件原生支持的单指令操作,延迟仅为几周期,吞吐量远高于手动累加,完全利用了Sapphire Rapids的AVX-512硬件加速能力。
注意事项
- 由于求和无溢出(总和≤2^28-1),
vprefixsumud针对无符号DWORD的计算完全适配该范围,无需额外处理溢出。 - 编译时需开启AVX-512指令集支持:GCC使用
-mavx512f -mavx512vl,MSVC使用/arch:AVX512。
内容的提问来源于stack exchange,提问作者dodexahedron
相关产品推荐
相关产品推荐

