162、NPU的编译器开发:数据预取与软件流水 NPU的编译器开发:数据预取与软件流水一个让我熬夜三天的bug去年做某款AI芯片的编译器时,遇到一个诡异现象:同样的卷积网络,在仿真器上跑出98%的MAC利用率,上板实测只有62%。我盯着波形图看了整整两天,发现NPU的DMA引擎每隔几十个周期就会“发呆”——数据没到位,计算单元干等着。这个问题的根源,就是数据预取策略和软件流水编排出了问题。今天聊聊这块的实战经验。数据预取:别让NPU饿着NPU和CPU最大的不同在于:CPU有复杂的cache层次结构,而NPU通常只有简单的SRAM缓冲区,甚至直接操作DDR。这意味着数据搬运的时机必须精确控制。预取距离的陷阱我见过最典型的错误是预取距离设得太小。假设你的NPU处理一个3x3卷积,输入特征图尺寸是224x224,输出通道64。如果等当前行处理完才去取下一行数据,DMA延迟会直接暴露在关键路径上。// 错误示范:同步等待 dma_load(input_row[i]); // 发起DMA wait_dma_done(); // 傻等 npu_process(input_row[i]); // 处理正确的做法是提前发起预取,让DMA和计算并行:// 正确做法:双缓冲+预取 dma_load(input_row[0]); // 先取第一行 for (int i = 0; i total_rows; i++)