012、乘累加单元(MAC):NPU中最基本的计算单元

012、乘累加单元(MAC):NPU中最基本的计算单元 乘累加单元(MAC):NPU中最基本的计算单元一次让我失眠三天的调试去年做一款边缘AI芯片的驱动开发,遇到一个诡异现象:同样的卷积网络,在仿真环境里跑出98%的准确率,上板实测直接掉到73%。我盯着波形图看了三天,最后发现是MAC单元的累加器位宽配置出了问题——高位截断时,某个卷积层的偏置项被吞掉了两个比特。这种问题,教科书上不会写。但只要你碰过NPU的底层驱动,迟早会撞上。MAC到底是什么乘累加,全称Multiply-Accumulate,就是做一件事:y = a * b + c。别笑,神经网络里90%以上的计算量,最后都落在这个公式上。一个卷积层,假设输入是3x3的feature map,卷积核是3x3,那就要做9次乘法、8次加法。一个典型的MobileNet有几十层,每层几百个卷积核,算下来就是几百万次MAC操作。NPU之所以比CPU快,就是因为它在硬件里塞了几百甚至几千个MAC单元,可以同时干活。MAC单元的内部结构其实很简单:一个乘法器,一个加法器,一个累加寄存器。但魔鬼在细节里。定点数:芯片工程师的噩梦CPU里做浮点运算很自然,但NPU为了面积和功耗,几乎清一色用定点数。INT8是最常见的,也有INT4、INT2甚至二值化的。定点数的核心问题是:小数点在哪?我见过最坑的案例,是某团队把激活值的Q格式设成Q7.0(纯整数),权重设成Q4.3(4位整数3位小数),结果卷积输出直接爆炸——