092、NPU的虚拟地址支持:MMU与IOMMU

发布时间:2026/6/25 12:33:06

092、NPU的虚拟地址支持:MMU与IOMMU 092、NPU的虚拟地址支持:MMU与IOMMU去年做一款AI摄像头方案时,遇到一个诡异的NPU崩溃问题。模型推理到第37帧,NPU突然报“page fault”,然后整个系统硬复位。查了两天,最后发现是NPU访问的输入缓冲区物理地址跨了4MB边界,而NPU内部的MMU页表只配置了连续虚拟地址映射,物理内存却是不连续的。这个坑让我意识到,NPU的虚拟地址管理远比CPU复杂,尤其是IOMMU的存在,让整个内存访问路径变成了一个“三跳”的接力赛。为什么NPU需要自己的MMUCPU有MMU,DMA有SMMU,NPU为什么还要搞一套?直接让NPU访问物理地址不行吗?早期NPU确实这么干。但问题在于,NPU要处理的数据量太大——一个1080p的输入图像,加上权重、中间特征图,动辄几十MB。如果NPU只能访问物理连续内存,系统就得预留大块连续物理内存,这在长时间运行的嵌入式设备上几乎不可能。内存碎片化会让NPU频繁申请失败。更关键的是,NPU的访存模式极其特殊。它不像CPU那样随机访问,而是按照固定的数据流模式——卷积窗口滑动、池化窗口滑动、矩阵分块。这种模式意味着NPU的MMU需要针对“流式访问”做优化,而不是CPU那种“随机访问”的TLB设计。NPU内部的MMU通常叫“NPU MMU”或“Neural MMU”,它和CPU的MMU共享页表结构,但TLB的替换策略完全不同。CPU的TLB倾向于保留最近使用的页表项,而NPU的TLB需要预取“即将被卷积窗口覆盖的页”。有些NPU甚至支持“页表预取指令”,让驱动在启动推理前就把需要的页表项刷进TLB。

相关新闻