项目背景
本项目面向迭代升级的兼容2D/3D图像的SIMD型视觉芯片(升级前旧版[芯片论文链接][芯片论文pdf][封装论文链接][封装论文pdf])开发配套的AI模型编译部署工具链。旨在解决无完整工具链时期,开发者需纯手工编写自定义指令集汇编以实现网络推理的低效与易错难题。
在前期(面向自研脉动阵列处理器的编译部署工具链)的基础上,我针对此款SIMD架构处理器的特性,深度重构了编译器的前端调度与后端生成模块,主要修改如下:
- 前端抽象与内存调度:
- 算子解耦:将原脉动阵列中强耦合的 Conv-BN-ReLU 融合算子中的 Pooling 与 Resize 剥离,交由向量核进行独立汇编实现。
- 无冲突地址映射:严格遵循向量数据存储器的双区独立读写约束,实现输入特征、网络参数与输出结果的静态内存分配。
- 后端生成与算子库:
- 张量维度重排:将权重与偏置等参数在编译期重排,适配向量处理器中“行交织”的内存物理格式。
- 汇编算子库:针对不同 PE 分组的重构模式,编写高优化的算子汇编模板。
- 自动化生成:衔接前端解析的计算图与分配地址,自动实例化算子模板,生成端到端网络推理的二进制参数文件和汇编代码。
技术方案概览
- 基于新版SIMD视觉处理器的微架构特性,设计并实现卷积与矩阵乘等核心算子在向量核上的高效映射。
- 研发基于算子模板库的端到端AI编译器后端,实现模型解析、地址分配、张量重排到汇编代码生成的全流程。
个人贡献
-
针对多级寄存器与指令双发射机制,完成深度学习核心算子在SIMD向量核上的指令映射
-
重构编译器底层基建,构建基于汇编算子库的自动化编译工具链,避免手工编写汇编代码
-
成功编译并部署轻量化CenterNet检测算法(参数量788.45kB、计算量350.63MOPs),实测片上端到端推理延迟仅 6.36 ms
-
成功编译并部署SiamVC跟踪算法(参数量437.06kB、计算量234.98MOPs),实测模板分支初始化 0.64 ms,搜索跟踪分支 3.13 ms
-
成功编译并部署EfficientViT分类算法(参数量1.405MB、计算量171.824MOPs),实测片上端到端推理延迟仅 4.73 ms
详细技术实现
💡 提示:点击对应模块可展开阅读。
1. 硬件平台:自研 SIMD 视觉芯片微架构
相较于初代版本,新版SIMD芯片在工艺与架构上实现提升:
- 算力密度提升:采用28nm工艺,主频提升至600MHz;通过定制扩展指令令向量核内 AI MAC 单元密度翻倍,峰值算力达 2.2 TOPS。
- 环形拓扑互联:PE阵列首尾物理相连形成环状拓扑,支持首尾间数据轮转。
- 多芯分布式扩展:集成高速 SERDES 接口,支撑多芯片间的低延迟通信与大规模模型分布式推理。
1.1.向量核架构
向量核由标量单元和向量单元组成,其中向量单元包含256个PE,每个PE与邻域2个PE之间能够互相访问本地寄存器,且可重构为6种PE分组(PE Group, PEG)模式(PEG256×1, PEG128×2, PEG64×4, PEG32×8, PEG16×16, PEG8×32)。向量核的流水线如图1所示、PEG示例如图2和图3所示。



标量单元和向量单元共享流水线的前两级,在IL阶段根据指令类型进行双发射,实现标量单元和向量单元的指令级并行。
1.2.存储层次与访存接口
向量核包含数据存储器(Vision Processor Data Memory, VPDM)和多类型寄存器,并通过可变粒度的访存接口进行数据读写,构成多层次的存储结构。
寄存器类型:
- 标量寄存器(Scalar Regfile, SRF): 位于标量单元内的32个32bit寄存器,常用作跳转标志位、地址指针以及全局变量参数;
- 全局寄存器(Global Regfile, GRF): 位于向量单元中每组PEG的16个32bit寄存器,一般用于PEG内所有PE共享的权重;
- 本地寄存器(Local Regfile, LRF): 位于向量单元中每个PE的16个16bit寄存器,一般存放输入特征图数据;
- AI累加器(AI Regfile, ARF): 位于向量单元中每个PE的8个32bit累加器,寄存aimac指令运算的部分和。
VPDM架构如图4所示,通过2组、每组16个BANK、每个BANK为128bit位宽8192深度的SRAM模块组成,共计4MB容量。由于组选择设计特点,核心只能同时读写不同分组,需要程序适配避免因同时读写同一组导致出错。

可变粒度访存接口配合可重构PEG模式,实现了广播、单播、组播等多种形式和粒度的数据搬运机制,其示例如图5和图6所示。


2. 核心算子(Conv / MatMul)的指令级映射
2.1.卷积映射
针对 SIMD 阵列特点,将空间维度的计算映射到PE阵列:输入特征图的列映射到PE索引(如第3列对应PE3),行映射到PE中LRF索引(如第1行对应所有PE的LRF1);权重广播到PEG的GRF中。在此映射方式下对应的卷积循环如图7所示。

从图7中可以看出向量核上的卷积映射具有以下特点:
- 阵列匹配的分块计算: 为了匹配PE阵列尺寸和单个PE处理的通道数,在输出通道和行方向上tile分块
- 内循环并行展开: 输出特征列对应PE索引、输出特征行对应PE内LRF,实现内层循环展开(loop unroll)数据级并行计算
- 外循环OS(Output Stationary)数据流: 采用输出固定数据流,最外层为输出通道循环,复用至部分和累加完成后才将结果写回
内层循环采用自定义指令集中的aimac42ex指令完成乘累加,配合邻域PE数据实现单次计算2个输出通道的4行输出特征,其示意如图8所示。
对于3×3卷积而言,通过连续9条aimac42ex指令实现了单次卷积计算:
aimac42ex lr1, lr3, gr1(lhw), d(l1) //Step=1
aimac42ex lr1, lr3, gr1(hhw) //Step=2
aimac42ex lr1, lr3, gr2(lhw), d(h1) //Step=3
aimac42ex lr2, lr4, gr2(hhw), d(l1) //Step=4
aimac42ex lr2, lr4, gr3(lhw) //Step=5
aimac42ex lr2, lr4, gr3(hhw), d(h1) //Step=6
aimac42ex lr3, lr5, gr4(lhw), d(l1) //Step=7
aimac42ex lr3, lr5, gr4(hhw) //Step=8
aimac42ex lr3, lr5, gr5(lhw), d(h1) //Step=9
外层循环则通过计数器遍历输入通道(loop1)、输出行(loop2)和输出通道(loop3),重复调用内循环完成单次2个输出通道的4行输出特征图,遍历完成后最终实现完整特征图。
利用率优化: 当特征图尺寸较小时,可重构为多个PEG通道间并行计算以提高计算单元利用率,以64×64特征图输入为例(图9),可将向量单元重构为PEG64×4并行。
行交织数据排布: 由于多PEG并行计算导致了特征图在芯片内的物理排布呈现“行交织”的形态,即对于逻辑上为(W,H,C)格式的特征图,在芯片上实际为(W,#PEG,H,C/#PEG)格式。这也要求模型参数进行相对应的数据重排,将逻辑上为(K,K,Cin,Cout)格式的Weight重排为(2,#PEG,k,k,Cin,Cout/Tco)格式、逻辑上为(Cout)格式的Bias重排为(2,#PEG,Cout/Tco)格式。

2.2.矩阵乘映射
通过标量与向量的连续外积和来实现矩阵乘法映射,可通过aimulg和aiadd2指令的组合来实现如图10所示的计算过程。

将矩阵A中的标量映射到PEG中的GRF、矩阵B中的向量映射到PE中的LRF。在此映射方式下对应的矩阵乘循环如图11所示。

内层循环采用自定义指令集中的aimulg+aiadd2指令完成乘累加,其示意如图12所示。
对于图10举例的矩阵乘运算而言,通过连续12次乘累加实现了整个矩阵乘计算:
aimulg air1,lr1,gr1(lhw); // Step=1,
aiadd2; aimulg air1,lr2,gr1(hhw) // Step=2,
aiadd2; aimulg air1,lr3,gr2(lhw) // Step=3,
aiadd2; aimulg air1,lr4,gr2(hhw) // Step=4, 第1行完成
aimulg air1,lr1,gr3(lhw); // Step=5,
aiadd2; aimulg air1,lr2,gr3(hhw) // Step=6,
aiadd2; aimulg air1,lr3,gr4(lhw) // Step=7,
aiadd2; aimulg air1,lr4,gr4(hhw) // Step=8, 第2行完成
aimulg air1,lr1,gr5(lhw); // Step=9,
aiadd2; aimulg air1,lr2,gr5(hhw); // Step=10,
aiadd2; aimulg air1,lr3,gr6(lhw); // Step=11,
aiadd2; aimulg air1,lr4,gr6(hhw); // Step=12, 第3行完成
外层循环则通过计数器遍历输出矩阵行(loop1)、输入矩阵行(loop2),重复调用内循环完成向量-标量乘累加,遍历完成后最终实现完整输出矩阵。
利用率优化: 当矩阵B的列数K较小时,可通过PEG重构实现多个PEG在不同行间并行计算以提高计算单元利用率,以A(32,128)×B(128,64)=C(32,64)为例,可将向量单元重构为PEG64×4并行。
编译部署与正确性验证
完成编译器前端(算子融合、地址分配)和后端(张量重排、模型文件生成、汇编算子库实现、汇编代码生成)相关部分的代码编写以后,在目标检测和跟踪模型上进行了编译部署和仿真验证。
1. 综合性能指标汇总
| 评估维度 | CenterNet (目标检测) | SiamVC (单目标跟踪) | EfficientViT (分类) |
|---|---|---|---|
| 轻量化模型规模 (Params / 计算量) | 788.45 kB / 350.63 MOPs | 437.06 kB / 234.98 MOPs | 1.405 MB / 171.824 MOPs |
| QAT 部署精度 | mAP: 97.75% (HRSC2016) | Success: 58.5% / Precision: 76.7% (OTB100) | Top-1/5 Acc: 80.68%/94.28% (ImageNet100) |
| 自动化生成汇编代码量 | 8,548 行 | 10,218 行 | 14,410行 |
| 端侧片上实测推理延迟 | 6.36 ms (端到端) | 3.77 ms (模板 0.64ms + 搜索 3.13ms) | 4.73 ms (端到端) |
2. CenterNet目标检测模型的编译部署与仿真验证
对Anchor-free目标检测模型CenterNet(图13)进行轻量化改造,在参数量788.45kB、计算量350.63MOPs的情况下,QAT量化版模型在HRSC2016数据集上船舶检测mAP达到97.75%。

模型经算子融合后缩减至108层,编译后生成了8548行汇编代码。内存分配无重叠冲突(图14),VCS仿真与MATLAB理论值一致。

3. SiamVC目标跟踪模型的编译部署与仿真验证
以本科毕设实现的目标跟踪算法SiamVC(图15)为基础实现了轻量化跟踪网络,在参数量437.06kB、计算量234.98MOPs的情况下,QAT版本模型在OTB100数据集上跟踪Success达到58.5%、Precision达到76.7%。

模型经算子融合后缩减至130层,编译后生成了10218行汇编代码。内存分配无重叠冲突(图16),VCS仿真与MATLAB理论值一致。

4. EfficientViT分类模型的编译部署与仿真验证
对EfficientViT-b0(图17)为基础实现了轻量化分类网络,在参数量1.405MB、计算量171.824MOPs的情况下,QAT版本模型在ImageNet100数据集上Top-1/5准确率分别达到80.68%和94.28%。

模型经算子融合后缩减至184层,编译后生成了14410行汇编代码。内存分配无重叠冲突(图18),VCS仿真与MATLAB理论值一致。

总结与思考
个人评价:从粗粒度调度到细粒度编程
通过本次编译部署工具链的开发,我深刻体会到了不同体系结构间的范式差异。相比以往项目(本科毕设的旧版NNA和支持CNN-Transformer的新版NNA)采用粗粒度的配置字来驱动脉动阵列推理加速,SIMD向量核的编程是细粒度的,每一步计算都需要通过指令编程来实现。这种方式在通用性和灵活性上比粗粒度配置更优,能够实现各种复杂的算子并兼容传统计算机视觉,但失去了脉动阵列天然的数据复用优势,算力转化效率高度依赖于编译器对指令流水线的时序编排与吞吐优化。
瓶颈剖析:单线程SIMD的访存困境
在板级实测中暴露了一个性能瓶颈:尽管新版SIMD峰值算力(2.2 TOPS)远超脉动阵列(1.4 TOPS),但其在 CenterNet 网络下的实测帧率(不到 160 FPS)却落后于脉动阵列(375 FPS)。
造成这种现象的根本原因在于SIMD细粒度编程造成的访存受限(Memory Bounded)。由于缺乏硬件级的上下文切换机制,过于细碎的计算任务导致核心必须频繁等待 Load/Store 指令,大大降低了实际计算强度(Arithmetic Intensity)、导致计算单元闲置。
解决思路:
- 软件优化:借助双发射流水机制重新编排汇编指令:当前版本SIMD向量处理器的硬件已经无法更改,只能从软件推理函数层面充分利用双发射机制进行优化,引入寄存器级的乒乓机制,在当前迭代运算时同步加载下一次迭代所需的数据,实现访存延迟隐藏(Latency Hiding)。
- 下一代硬件改进:从单线程SIMD到SIMT:在下一代处理器中考虑从硬件层面实现多线程支持,通过硬件调度器判断当前线程访存时切换到数据准备就绪的线程,保证计算单元始终处于忙碌状态,实现计算与访存的重叠。