项目背景

传统AI加速器多采用多核异构或内存映射等松耦合集成方式。在此架构下,控制核与加速器之间高度依赖系统总线或DMA进行显式数据搬运与任务调度,这不仅带来了高昂的驱动与中断处理开销,频繁的内存访问更导致了“内存墙”与功耗瓶颈,难以满足极低功耗边缘端场景的需求。

RISC-V指令集架构凭借其开源与高度可扩展的特性,为边缘AI加速提供了紧耦合设计范式的可能性。通过自定义扩展指令,可将并行计算阵列直接作为执行部件嵌入CPU流水线的EX(执行)阶段,从根本上消除核间数据交互延迟并大幅简化软件编程模型。

本项目作为独立探索的”toy project”,旨在通过全栈软硬件协同开发,探索高能效AI MCU的微架构演进方向。


技术方案概览

  • 硬件层:定义RISC-V矩阵乘扩展指令集,并依托NICE接口设计基于权重固定(Weight-Stationary)数据流的脉动阵列加速器。
  • 算法层:针对硬件存储约束,构建轻量化MLP网络(MNIST识别任务),并引入QAT量化压缩实现INT8定点部署。
  • 软件层:采用自底向上策略,封装内联汇编算子库,实现C语言级端到端模型推理与Tile分块调度。

个人贡献

  • 定制5条RISC-V矩阵乘扩展指令,依托Custom编码域实现脉动阵列的低延迟控制与调度

  • 构建并部署轻量化MLP模型(参数量55.84kB、计算量0.109MOPs),经QAT量化压缩后在MNIST数据集上保持97.26%的高推理精度

  • 完成FPGA端到端原型验证,相较于纯标量计算,扩展指令集加速方案实现指令数缩减近2.4万倍,推理提速423倍

详细技术实现

💡 提示:点击对应模块可展开阅读。

1.RISC-V自定义扩展指令集

本项目依托开源蜂鸟E203(图1)的NICE(Nuclei Instruction Co-unit Extension)协处理器接口进行脉动阵列加速器(图2)的集成。其接口协议支持RISC-V标准的custom0-3指令编码空间,为紧耦合架构提供拓展基础。

图1
图 1 E203 MCU系统微架构框图

基于WS(Weight-Stationary)数据流的脉动阵列计算特性,定制化设计了5条扩展指令,以覆盖初始化、乘累加计算及结果写回的全生命周期:

指令 (Inst) 寄存器1 (rs1) 寄存器2 (rs2) 功能描述 (Function)
sparam {ReLU_en(1bit), sft(5bit), Mul(16bit)} - 加载反量化乘移位因子及ReLU激活配置至输出处理单元
lybuf Bias_addr - 加载偏置(Bias)至PE阵列的累加寄存器
lwbuf Weight_addr 权重矩阵列数 加载权重至PE阵列内部寄存器并固定
matmul Input_addr 输入矩阵列数 触发输入矩阵对角化加载及阵列乘累加,更新部分和
sybuf Output_addr 输出矩阵列数 触发部分和的反量化计算,并将输出特征写回主存
2.脉动阵列硬件微架构设计

加速器核心计算部件采用WS数据流脉动阵列架构(图2),主要由片上缓存(Input Buffer, Weight Buffer, Output Buffer)与可配置规模的PE阵列及后处理模块(Requant+ReLU)构成。

图2
图 2 基于WS数据流的脉动阵列协处理器架构

2.1.数据流控与对角矩阵生成

为满足脉动阵列的并行计算时序,设计了硬件对角化访存模块。输入矩阵加载至Input Buffer后,通过周期性移位产生阶梯状的对角数据流(图3、图4),确保数据在阵列内部流动时计算对齐。

图3
图 3 16×16输入矩阵示例
图4
图 4 周期性数据移位与对角输出时序示意

2.2.总线级数据打包优化

为最大化利用E203的32-bit数据总线带宽,采用数据打包传输策略,将4个INT8格式的输入或权重元素拼接单次传输(图5),提升访存吞吐率并降低总线争用开销。

图5
图 5 访存数据拼接打包机制
3.轻量化MLP设计与量化压缩

针对E203片上DTCM(数据紧耦合存储器)扩容至128kB后的空间约束,构建了5层全连接网络(MLP)作为MNIST识别任务的基础模型(图6)。

图6
图 6 轻量化MLP网络拓扑结构

模型参数量为55.84kB、计算量为0.109MOPs,量化前的FP模型识别准确率为97.30%、QAT量化后的准确率为97.26%,满足部署条件。

4.推理驱动与计算调度实现

软件层采用分层设计理念:底层扩展指令调用借助内联汇编封装硬件指令,中层算子实现完成大尺寸矩阵的Tile-based分块计算,高层网络推理完成整体网络的实现。

  • 内联汇编封装:在NucleiStudio中利用C语言内联汇编编写指令接口(图7)。
  • 算子分块调度:当算子维度超过脉动阵列硬件规模(如32×32)时,软件自动执行Tile划分与累加调度(图8)。
  • 网络推理评估:主函数按拓扑顺序调度各层推理,并集成硬件Timer用于精确的性能与指令数剖析(图9-11)。
图7
图 7 内联汇编函数示例
图8
图 8 全连接层Tile级调度逻辑
图9
图 9 端到端推理与性能统计流程

输入和权重矩阵以二维数组的形式存储在DTCM中,其示例分别如图10和图11所示。

图10
图 10 输入数组示例
图11
图 11 权重数组示例

FPGA验证与性能评估

在Xilinx A7-100t FPGA平台(图12)上部署并验证了32×32阵列规模的紧耦合系统,系统时钟频率为33MHz。测试输入为32张28×28分辨率的MNIST图像(图13),性能统计结果通过UART终端实时打印(图14)。

1. 综合性能指标

在 32×32 阵列规模下,我将“基于自定义指令集的协处理器加速方案”与“纯标量软件计算方案(C语言)”进行了基准对照:

评估维度 纯标量软件实现 (Baseline) 扩展指令集加速方案 最终优化收益
消耗指令数 (Instructions) 14,374,915 条 600 条 减少 23,958 倍
执行周期数 (Clock Cycles) 15,910,699 个 37,577 个 提速 423 倍
推理精度 (MNIST) 97.30% (FP32) 97.26% (INT8 QAT) 精度近乎无损

2. FPGA 板级实测结果

图12
图 12 A7-100t FPGA评估验证平台
图13
图 13 测试集图像阵列数据
图14
图 14 串口打印推理结果与时钟周期统计

总结与思考

个人评价:从松耦合到指令级紧耦合

本项目是我对紧耦合AI加速架构的首次工程实践。相较于传统多核异构处理器,基于RISC-V扩展指令的紧耦合微架构统一了编程模型。开发者依托标准编译工具链及单机C语言环境即可完成复杂的计算与控制调度,显著削减了驱动开发与软件抽象开销。然而,当前系统侧重于矩阵乘硬件加速,对于SoftMax、LayerNorm等复杂非线性算子的原生支持依然缺失,存在扩展优化空间。

瓶颈剖析:协处理器接口的带宽限制与阻塞调度

在性能调优阶段,我发现Nuclei NICE接口的带宽与阻塞时序成为了制约算力上限的核心瓶颈。

脉动阵列的最佳能效状态是流水线填满后的无缝乘累加流转。但由于NICE接口强依赖顺序单指令执行(不支持指令级并行,阻塞主线),系统在处理不同Tile时,必须等待当前矩阵分块的计算指令彻底完结,方可下发后续的数据加载指令,这种加载-计算间的显式同步导致了阵列流水线的周期性闲置。

解决思路:

  • 深度定制流水架构:摒弃NICE接口,直接在CPU微架构的EX级之后插入解耦的加速器旁路,实现更高带宽的数据互联,但增加了RTL设计难度。
  • 引入指令队列解耦(Decoupled Pipeline):保留硬件接口但引入指令FIFO缓冲队列。当处理器预取到连续的 载入 与 计算 指令时,交由队列管理模块进行资源冲突检查,实现内存访存流水与阵列计算流水的并发重叠执行(Overlapping),从而彻底掩盖访存延迟。

总而言之,本项目实现了一个端到端AI MCU,为后续探索支持复杂算子流水与乱序调度的端侧智能架构奠定了基础。