039、NPU中断处理:异步推理与同步推理去年调试一块带NPU的AIoT芯片,遇到一个诡异现象:模型推理偶尔返回全零结果,但硬件状态寄存器显示推理已完成。用逻辑分析仪抓NPU中断信号,发现中断触发时刻和DDR数据总线上的写完成事件差了整整12个时钟周期。查了三天,最后发现是NPU的中断处理函数里直接调用了推理结果读取——而NPU的DMA引擎还在做最后的cache line回写。这个坑让我意识到,NPU的中断处理远不是“收到中断就读结果”那么简单。中断到底在通知什么NPU的中断信号,和CPU的UART中断完全是两码事。UART中断告诉你“数据已经到寄存器了”,但NPU中断告诉你“计算单元已经停止工作了”——这两个状态之间,可能还隔着数据通路上的流水线延迟。典型的NPU推理流程:输入数据从DDR搬运到NPU本地SRAM → 计算阵列执行矩阵运算 → 结果写回DDR → 触发中断。问题出在最后一步:很多NPU在“写回DDR”指令发出后就触发中断,而不是等DDR写完成。这就像你让快递员送货,他刚出门你就打电话告诉收件人“货到了”。我手头这颗芯片的NPU手册里写着一行小字:“中断在写事务提交后立即产生,不保证数据在DDR中可见。”这种设计是为了减少中断延迟,但代价是软件必须做额外的同步。同步推理:简单但低效同步推理是最直观的做法:CPU发起推理指令后,轮询NPU的状态寄存器,直到标志位被置位。代码大概长这样: