基于“部分向量复制”的高带宽利用率 SpMV FPGA 加速器:架构、公式与实验复现

嵌入式系统 时间:2025-11-06来源:

摘要

稀疏矩阵-向量乘(SpMV)在图计算、机器学习和工程仿真等场景中广泛使用,并常常主导整体运行时间。针对 FPGA 的高外存带宽与可定制数据通路,本文重构并评述 ASP-DAC’23 提出的“通过部分向量复制实现高带宽利用率的 SpMV”方案。该方案以读无冲突的向量缓冲区写无冲突的加法树以及乒乓寄存器为核心,目标是在不显著增加数据冗余的前提下,提升归一化带宽利用率(BU)。作者在真实平台上报告相较最新方案的**平均 1.10×**性能提升。


1. 问题与动机

1.1 SpMV 的瓶颈本质

SpMV 只对非零元进行乘加,导致输入向量访问按列索引呈不规则跳转,CPU/GPU 端常出现缓存未命中与带宽受限,难以发挥算力;而 FPGA 具备更高效的外存带宽使用潜力与可编程流水线,更契合存储受限应用。因此,如何在 FPGA 上提高 BU(Bandwidth Utilization) 成为关键。

1.2 既有路线的不足

三类典型做法:

结论:核心矛盾是向量不规则访问引发的端口冲突与失衡,这是 BU 下降的根源。


2. 方案总览:部分向量复制 + 两类“无冲突”单元

基本思想:把大矩阵按列切成块(block),每块对应的向量片段足够小时,在片上做双份复制,为多 PE 并行提供足够读端口;同时在写回端用写无冲突加法树提前合并同一行的部分和,避免写地址冲突;批(batch)间用乒乓寄存器隐藏部分和装/存的访存开销。

作者标注的三点贡献如下:

  1. 读无冲突向量缓冲区:在多于 2 次并发访问时仍不阻塞流水;

  2. 写无冲突加法树:消除对同一累加器地址的并发写入冲突,最小化批内写延迟;

  3. 乒乓寄存器:批切换时并行完成“上批存/下批装”,隐藏访存开销。


3. 数学刻画与复杂度

3.1 BU 定义与性能分解

论文采用归一化 BU

BU=2⋅NnonzeroDatawidthbyte⋅CtotalBU=frac{2cdot N_{text{nonzero}}}{text{Datawidth}_{text{byte}}cdot C_{text{total}}}BU=DatawidthbyteCtotal2Nnonzero

其中 2⋅Nnonzero2cdot N_{text{nonzero}}2Nnonzero 来自每非零元一次乘法一次加法。流水执行下的总周期:

Ctotal=Cldv+Cexe+CpipeC_{text{total}}=C_{text{ldv}}+C_{text{exe}}+C_{text{pipe}}Ctotal=Cldv+Cexe+Cpipe

分别为向量装载所有批执行流水起始的开销(CpipeC_{text{pipe}}Cpipe 为常数)。

3.2 向量装载与批执行模型

若向量长度为 NvN_vNv,单元素字节数 BvB_vBv,外设接口字宽 Datawidthbytetext{Datawidth}_{text{byte}}Datawidthbyte

Cldv=Nv⋅BvDatawidthbyteC_{text{ldv}}=frac{N_vcdot B_v}{text{Datawidth}_{text{byte}}}Cldv=DatawidthbyteNvBv

批执行周期取计算与部分和访存二者的较大者。设第 iii 批含非零元 NiN_iNi,PE 数为 NNN,部分和访存开销为 CpsumC_{text{psum}}Cpsum,则

Cexe=∑i=0Nbatchmax⁡ ⁣(Cpsum, ⌈NiN⌉)C_{text{exe}}=sum_{i=0}^{N_{text{batch}}}max!left(C_{text{psum}}, leftlceilfrac{N_i}{N}rightrceilright)Cexe=i=0Nbatchmax(Cpsum, NNi)

注:后续数据预处理会补零对齐,以满足批内整除与隐藏 CpsumC_{text{psum}}Cpsum 的需要,从而简化控制并稳定流水。


4. 数据预处理与矩阵分块

4.1 双向分块:列向块 + 行成批

4.2 预处理算法(要点)


5. 关键硬件模块

5.1 系统数据通路

数据自 DRAM 进入解码器,根据类型送至向量缓冲区矩阵缓冲区累加器;4×PE 取数相乘,产物进入写无冲突加法树,再由累加器累计到片上部分和缓冲(PSB, URAM),块完成后回写 DRAM。

5.2 读无冲突向量缓冲区(核心:部分复制)

5.3 写无冲突加法树(核心:地址冲突提前合并)

当多个 PE 产物指向同一行时,通过MUX 选择 + 多级流水加法把冲突项先加在树内,再输出到不同“无冲突”端口写累加器,典型两路冲突 P0,0P_{0,0}P0,0P2,0P_{2,0}P2,0 的处理流程被给出(含寄存级数与交叉开关选择)。

5.4 乒乓寄存器(批间装/存隐藏)

每个累加器从单寄存器拓展为 R1/R2/R3:当前批累计、下批装载、上批存储三者并行,按“R1→R2→R3”轮转,完全隐藏批切换过程中的部分和装/存开销。


6. 动机示例复盘:为何它更快?

6×66times 66×6 的玩具矩阵(8 个非零)为例:


7. 实验设置与对比

7.1 理论峰值 BU

在 64 B 数据宽下,每拍处理 4 个非零(值+索引在本设计的 512-bit 通道组织下达成),理论最少周期 Nnonzero/4N_{text{nonzero}}/4Nnonzero/4,代入式 (2) 得

BUpeak=2Nnonzero64⋅(Nnonzero/4)=0.125BU_{text{peak}}=frac{2N_{text{nonzero}}}{64cdotleft(N_{text{nonzero}}/4right)}=0.125BUpeak=64(Nnonzero/4)2Nnonzero=0.125

7.2 整体性能

在 12 个矩阵上,本文方案的平均 BU 高于 ReDESK(1.26×)与 ReOrder(1.10×),且对 stanford 等列极稀疏矩阵,重排法难以避免向量端口冲突,我们仍保持优势。

7.3 资源占用与批高权衡


8. 工程解构与实现要点

  1. I/O 组织:按“向量段 + 批数据”顺序下发,DMA 顺序读;批内已按 (5) 对齐,控制简化。

  2. 矩阵/向量缓冲:矩阵侧 4×FIFO 与 4×PE 匹配,深度较小(装消速率相近);向量侧“两份子缓冲+MUX”提供 4 读口,端口时分读写。

  3. 冲突化解

    • 读冲突:由“部分复制”与端口编排根除;

    • 写冲突:加法树内合并同地址产物,再输出到 4 路无冲突写口。

  4. 批间切换:R1/R2/R3 三工位“当前累计/下批装载/上批写回”循环滚动,隐藏 CpsumC_{text{psum}}Cpsum


9. 适用性与局限


10. 结论与复现建议

本文重构表明,“部分向量复制 + 写无冲突加法树 + 乒乓累加器”可在不引入显著冗余的情况下,实现更高的带宽利用率与更稳健的并行度。实测(ZCU106,100 MHz,512-bit 外设)显示对比两类先进基线的平均 1.10× 提升。

工程复现 Checklist


公式与符号速览

yi=∑j=0colsAi,j⋅xj,Ai,j≠0y_i=sum_{j=0}^{text{cols}}A_{i,j}cdot x_j,quad A_{i,j}neq 0yi=j=0colsAi,jxj,Ai,j=0


BU=2⋅NnonzeroDatawidthbyte⋅CtotalBU=frac{2cdot N_{text{nonzero}}}{text{Datawidth}_{text{byte}}cdot C_{text{total}}}BU=DatawidthbyteCtotal2Nnonzero


Ctotal=Cldv+Cexe+CpipeC_{text{total}}=C_{text{ldv}}+C_{text{exe}}+C_{text{pipe}}Ctotal=Cldv+Cexe+Cpipe


Cldv=Nv⋅BvDatawidthbyteC_{text{ldv}}=frac{N_vcdot B_v}{text{Datawidth}_{text{byte}}}Cldv=DatawidthbyteNvBv


Cexe=∑i=0Nbatchmax⁡ ⁣(Cpsum, ⌈NiN⌉)C_{text{exe}}=sum_{i=0}^{N_{text{batch}}}max!left(C_{text{psum}}, leftlceilfrac{N_i}{N}rightrceilright)Cexe=i=0Nbatchmax(Cpsum, NNi)


关键词:

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版