153、NPU的编译器开发:调试信息生成

153、NPU的编译器开发:调试信息生成

NPU的编译器开发:调试信息生成

一个让我熬夜三天的bug

凌晨两点,示波器上的波形还在跳动。我盯着屏幕上那行汇编代码,感觉血压在往上窜——NPU跑出来的结果和仿真对不上,差了一个像素值。更诡异的是,这个错误只在特定输入尺寸下复现,换张图就正常了。

我翻出编译器生成的调试信息,发现NPU的DMA描述符里,源地址偏移量写错了。编译器在计算tiling切分时,把最后一个block的起始地址算偏了16字节。这个bug藏得很深,因为大部分情况下地址对齐没问题,只有遇到非对齐的feature map宽度才会触发。

这就是调试信息生成的重要性——没有它,你面对NPU的二进制指令流,就像在黑箱里摸电路板,只能靠猜。

调试信息的本质:给二进制穿上衣服

NPU编译器生成的最终产物是一串二进制指令,但调试信息就是给这些冰冷二进制穿上可读的外衣。它要回答三个问题:这条指令对应源代码的哪一行?这个张量在内存里的实际地址是多少?这个循环展开后的迭代次数对不对?

我习惯把调试信息分成三个层次:

第一层:符号映射。把NPU的寄存器编号、内存地址、指令操作码,映射回IR(中间表示)里的变量名和操作。比如NPU_REG_R0对应的是conv_weight_ptr0x8000A000是输入feature map的基地址。

第二层:源码关联。记录每条NPU指令对应原始神经网络模型中的哪个算子、哪一层。这需