好的,我们继续。这是《嵌入式NPU原理基础》系列的第51篇。今天聊一个在NPU里真正干“重活”的模块——向量处理单元(VPU),以及它和那个看起来有点“闲”的标量单元(SPU)到底怎么配合。051、NPU的向量处理单元(VPU):与标量单元的协同从一次“死锁”说起去年调试一个端侧AI加速项目,模型是MobileNetV3-SSD,跑在自研的NPU原型上。前向推理一切正常,但一旦开启在线学习(在线更新全连接层权重),系统就随机卡死。复位后看寄存器,VPU的指令队列空了,但状态寄存器显示“忙”。标量单元那边,PC指针停在一条简单的“MOV”指令上,一动不动。当时团队里有人怀疑是VPU的向量访存单元挂了,有人怀疑是标量单元的中断处理有bug。最后用逻辑分析仪抓了总线,发现一个诡异的现象:VPU在等一个标量单元产生的“循环计数”,而标量单元在等VPU写回一个“完成标志”。典型的死锁——两个单元互相等待对方先释放资源。这个问题的根因,就是VPU和标量单元的协同机制设计得过于“紧耦合”,而且没有做超时保护。从那以后,我每次看NPU的架构文档,第一件事就是翻“SPU-VPU握手协议”那一章。VPU到底在干什么?简单说,NPU里大部分计算密集型操作——卷积、池化、全连接、激活函数——都是VPU干的。它本质上是一个SIMD(单指令多数据)引擎,但比CPU的SIMD扩展(比如ARM的NEON、x86的AVX)要“暴力”得多。一个典型的VPU可能包含:向量寄存器堆:比如32个
051、NPU的向量处理单元(VPU):与标量单元的协同
好的,我们继续。这是《嵌入式NPU原理基础》系列的第51篇。今天聊一个在NPU里真正干“重活”的模块——向量处理单元(VPU),以及它和那个看起来有点“闲”的标量单元(SPU)到底怎么配合。051、NPU的向量处理单元(VPU):与标量单元的协同从一次“死锁”说起去年调试一个端侧AI加速项目,模型是MobileNetV3-SSD,跑在自研的NPU原型上。前向推理一切正常,但一旦开启在线学习(在线更新全连接层权重),系统就随机卡死。复位后看寄存器,VPU的指令队列空了,但状态寄存器显示“忙”。标量单元那边,PC指针停在一条简单的“MOV”指令上,一动不动。当时团队里有人怀疑是VPU的向量访存单元挂了,有人怀疑是标量单元的中断处理有bug。最后用逻辑分析仪抓了总线,发现一个诡异的现象:VPU在等一个标量单元产生的“循环计数”,而标量单元在等VPU写回一个“完成标志”。典型的死锁——两个单元互相等待对方先释放资源。这个问题的根因,就是VPU和标量单元的协同机制设计得过于“紧耦合”,而且没有做超时保护。从那以后,我每次看NPU的架构文档,第一件事就是翻“SPU-VPU握手协议”那一章。VPU到底在干什么?简单说,NPU里大部分计算密集型操作——卷积、池化、全连接、激活函数——都是VPU干的。它本质上是一个SIMD(单指令多数据)引擎,但比CPU的SIMD扩展(比如ARM的NEON、x86的AVX)要“暴力”得多。一个典型的VPU可能包含:向量寄存器堆:比如32个