STM32U3 HSP 硬件矩阵乘法加速实测前言STM32U3 是 ST 新出的超低功耗 Cortex-M33,主频 96MHz。这颗片子有个比较有意思的外设叫 HSP(Hardware Signal Processing),官方定位是"可编程硬件加速器"——里面有 SPE 引擎、固件可编程、支持 FFT/FIR/矩阵/向量等各种 DSP 操作。上一个工程已经实测了FIR和RFFT的HSP加速,这个工程直接copy,进行矩阵乘法测试对比 硬件平台
通过查阅资料 HSP 有两种使用方式:
HSP 支持的运算有很多,例如FFT/RFFT/DCT、FIR/IIR/LMS 滤波、向量加减乘除/指数对数/三角函数、矩阵乘法/转置/求逆、复数运算等等,本次对比矩阵乘法。 对比方式使用同一个矩阵乘法,CPU 和 HSP 各跑 5 次,取后 4 次平均。用 DWT 周期计数器计时。 CPU 实现是标准三重循环,稍微做了点优化——ikj 遍历顺序 + 稀疏跳过(零值不乘):
然后直接调用HSP的函数,球的结果
矩阵用伪随机数填充(-1.0 ~ 1.0),确保不全是零。最后用 4 个采样点比对 CPU 和 HSP 结果,验证正确性。 HSP 初始化初始化也不复杂,直接使用ST给出的demo:
拆解
启动完状态是 IDLE,这时候就能发 Direct Command 了。 测试结果
测试数据见下图 32X32矩阵测试
64X64矩阵测试
128X128矩阵测试
速度分析Cortex-M33 的单精度 FPU 做一次 MAC 大概 1-3 个周期,但矩阵乘法有大量循环开销、地址计算、缓存未命中等。实测 CPU 有效吞吐大约 0.13 MAC/cycle。 HSP 的 SPE 引擎是专用硬件路径,矩阵乘法在里面是硬件加速的——所有乘加操作在 HSP 内部流水线完成,没有取指/译码开销,数据走内部 SRAM(CRAM/DRAM/BRAM)而不是通过 AHB 总线反复读写。 内存布局STM32U3 的 SRAM 总共 256KB,分为 IRAM1(192KB,地址 0x20000000)和 IRAM2(64KB,地址 0x20030000)。128×128 测试的三个矩阵各占 64KB,matrix_A 和 matrix_B 放在 IRAM1,matrix_C 跨 IRAM1/IRAM2 存放。剩下的 64KB 给栈(~8KB)、堆(~14KB)和全局变量(~10KB),刚好够用。 HSP 内部还有 48KB BRAM(地址 0x30098000,分 BRAMA/BRAMB/BRAMAB 三个 16KB Bank),通过散列文件的 128×128 已经是极限了,想跑 256×256(需要 768KB)得上外扩 PSRAM 踩坑记录散列文件加 BRAM 段
HSP 不能写栈内存HSP 是 AHB 总线主设备,按理说能访问全部地址空间。但实测 HSP_CORE_Init 后的状态HSP 初始化完成后状态是 编译顺序HSP 中间件的头文件互相引用比较乱,有些 其他 HSP 操作速览矩阵乘法只是冰山一角,HSP 还能做很多事情。在HSP的API中还有一些其他常用的操作: 有时间会一一进行测试
cmsis库中也有相关操作函数,后续可以对比二者差异 总结STM32U3 这颗芯片的 HSP 硬件加速器对于一些数**算加速效果十分显著。矩阵乘法实测 13.5x 加速,和官方宣传的性能一致。 Cortex-M33 单核跑 128×128 矩阵乘法要 150ms,HSP 只要 11ms。对于需要在 MCU 上做实时信号处理、边缘 AI 推理的场景,HSP可以轻松实现一些复杂算法/模型的部署 并且凭借U3的极致功耗 带来很好的能效比 唯一的遗憾是 SRAM 只有 256KB,想要测试更大规模矩阵发现RAM被撑爆了。。。。期待后续的 STM32U3 型号或者下一代能给更大的 SRAM。 |
【STM32U3 评测】串口控制步进电机与LabVIEW数据采集
【STM32U3评测】低功耗模式功耗测量
【STM32U3评测】实战项目:无电池温湿度计
【STM32U3 评测】4. USBx HID 通信
[STM32U3 评测] HSP 硬件信号处理单元 FIR 加速测试
【STM32U3 评测】HSP 加速 FFT 与计量滤波算法测试
【NUCLEO-U3C5ZI 测评】+ 手写数字识别
新品发布:STM32U3B5/C5,配备2 MB Flash存储器和HSP,首款无需电池即可运行AI的超低功耗STM32微控制器
【STM32U3评测】不太一样的点灯及编程测试
【STM32U3开发板测评】低功耗模式功耗实测
微信公众号
手机版