You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:16:11