078、NPU的稀疏计算支持:硬件如何跳过零值?
078、NPU的稀疏计算支持:硬件如何跳过零值?去年调试一块自研NPU芯片时,遇到一个诡异现象:模型推理速度在特定层突然掉到理论峰值的1/3。翻遍RTL仿真波形,发现MAC阵列有一半时间在空转——ALU的输入数据全是零,但控制逻辑还在老老实实走完乘加流程。那一刻我意识到,NPU的稀疏计算支持不是锦上添花,而是决定实际算力能否兑现的关键。零值带来的性能黑洞神经网络中ReLU激活函数会产生大量零值,MobileNet这类轻量模型某些层的稀疏度甚至超过70%。传统NPU如果按部就班处理每个元素,相当于让高速公路收费站给空车也收全价过路费。硬件跳过零值的本质,是把计算资源集中在非零数据上,避免无效的乘加操作。但“跳过”二字背后藏着无数坑。最直接的问题是:你怎么知道下一个数据是零?如果等数据从DRAM搬进寄存器再判断,延迟已经产生了。更麻烦的是,跳过零值会破坏数据流的连续性,导致MAC阵列出现“气泡”——部分计算单元空闲,部分还在忙,整体利用率反而下降。硬件稀疏化的三种流派我接触过的NPU架构中,稀疏计算支持大致分三类,各有各的脾气。第一种:位掩码标记法。在数据旁附加一个bitmask,每个bit对应一个元素是否为非零。硬件读取数据时先看mask,零值直接跳过。这方法实现简单,但mask本身占用带宽,且只能处理固定块大小的稀疏(比如4x4块)。我们第一版芯片用的就是这方案,结果发现当稀疏度超过80%时,mask开销反而让有效带宽下降——相当于为了省油钱,雇了个专职记账员。