AMD NPU¶
- 版权所有:
© 2024 超微半导体公司
- 作者:
Sonal Santan <sonal.santan@amd.com>
概述¶
AMD NPU(神经网络处理器)是集成到 AMD 客户端 APU 中的多用户 AI 推理加速器。NPU 能够高效执行 CNN、LLM 等机器学习应用。NPU 基于 AMD XDNA 架构。NPU 由 amdxdna 驱动程序管理。
硬件描述¶
AMD NPU 由以下硬件组件组成
AMD XDNA 阵列¶
AMD XDNA 阵列由使用 AMD AI 引擎技术构建的计算和内存单元的二维阵列组成。每列有 4 行计算单元和 1 行内存单元。每个计算单元都包含一个 VLIW 处理器,并带有其专用的程序和数据内存。内存单元充当 L2 内存。二维阵列可以在列边界处进行分区,从而创建一个空间隔离的分区,该分区可以绑定到工作负载上下文。
每列还拥有专用的 DMA 引擎,用于在主机 DDR 和内存单元之间移动数据。
AMD Phoenix 和 AMD Hawk Point 客户端 NPU 采用 4x5 拓扑结构,即 4 行计算单元排列成 5 列。AMD Strix Point 客户端 APU 采用 4x8 拓扑结构,即 4 行计算单元排列成 8 列。
微控制器¶
微控制器运行 NPU 固件,该固件负责命令处理、XDNA 阵列分区设置、XDNA 阵列配置、工作负载上下文管理和工作负载编排。
NPU 固件使用一个名为 ERT 的独立非特权上下文实例来服务每个工作负载上下文。ERT 也用于执行与工作负载上下文关联的用户提供的 ctrlcode
。
NPU 固件使用一个名为 MERT 的单一独立特权上下文来服务来自 amdxdna 驱动程序的管理命令。
邮箱¶
微控制器和 amdxdna 驱动程序使用特权通道执行管理任务,例如设置上下文、遥测、查询、错误处理、设置用户通道等。如前所述,特权通道请求由 MERT 提供服务。特权通道绑定到一个单一邮箱。
微控制器和 amdxdna 驱动程序为每个工作负载上下文使用一个专用的用户通道。用户通道主要用于向 NPU 提交工作。如前所述,用户通道请求由 ERT 实例提供服务。每个用户通道都绑定到其自己的专用邮箱。
PCIe EP¶
NPU 在 x86 主机 CPU 眼中是一个 PCIe 设备,具有多个 BAR 和一些 MSI-X 中断向量。NPU 使用专用的高带宽 SoC 级互连结构来读写主机内存。ERT 的每个实例都有其自己的专用 MSI-X 中断。MERT 获得一个 MSI-X 中断实例。
PCIe BAR 的数量因具体设备而异。根据其功能,PCIe BAR 通常可以分为以下类型。
PSP BAR:公开 AMD PSP(平台安全处理器)功能
SMU BAR:公开 AMD SMU(系统管理单元)功能
SRAM BAR:公开邮箱的环形缓冲区
邮箱 BAR:公开邮箱控制寄存器(头、尾和 ISR 寄存器等)
公共寄存器 BAR:公开公共寄存器
在特定设备上,上述 BAR 类型可能合并到一个单一的物理 PCIe BAR 中。或者某个模块可能需要两个物理 PCIe BAR 才能完全发挥功能。例如,
在 AMD Phoenix 设备上,PSP、SMU、公共寄存器 BAR 位于 PCIe BAR 索引 0。
在 AMD Strix Point 设备上,邮箱和公共寄存器 BAR 位于 PCIe BAR 索引 0。PSP 在 PCIe BAR 索引 0(公共寄存器 BAR)和 PCIe BAR 索引 4(PSP BAR)中拥有一部分寄存器。
进程隔离硬件¶
如前所述,XDNA 阵列可以动态划分为独立的物理分区,每个分区可能包含一列或多列。物理分区通过微控制器编程列隔离寄存器来设置。每个物理分区都与一个 PASID 相关联,该 PASID 也由微控制器编程。因此,NPU 中的多个物理分区可以进行受 PASID 保护的并发主机访问。
NPU 固件本身使用微控制器 MMU 强制执行的隔离上下文来处理用户和特权通道请求。
混合空间和时间调度¶
AMD XDNA 架构支持二维阵列的混合空间和时间(分时)调度。这意味着可以动态设置和拆除空间分区,以适应各种工作负载。一个*空间*分区可以*独占地*绑定到一个工作负载上下文,而另一个分区可以*暂时地*绑定到多个工作负载上下文。微控制器会更新暂时共享分区的 PASID,以使其与在任何时刻绑定到该分区的上下文相匹配。
资源解析器¶
amdxdna 驱动程序的资源解析器组件管理二维阵列在各种工作负载之间的分配。每个工作负载在其元数据中描述了运行 NPU 二进制文件所需的列数。资源解析器组件利用工作负载传递的提示及其自身的启发式算法来决定二维阵列的(重新)分区策略以及工作负载在列的空间和时间共享方面的映射。固件强制执行资源解析器做出的上下文到列的资源绑定决策。
AMD Phoenix 和 AMD Hawk Point 客户端 NPU 可以支持 6 个并发工作负载上下文。AMD Strix Point 可以支持 16 个并发工作负载上下文。
应用程序二进制文件¶
NPU 应用程序工作负载由 NPU 编译器生成的两个独立的二进制文件组成。
AMD XDNA 阵列叠加层(overlay),用于配置 NPU 空间分区。叠加层包含用于设置流交换机配置的指令和计算单元的 ELF。叠加层由关联的 ERT 实例加载到绑定到工作负载的空间分区上。有关更多详细信息,请参阅 Versal 自适应 SoC AIE-ML 架构手册 (AM020)。
ctrlcode
,用于编排加载在空间分区上的叠加层。ctrlcode
由微控制器上在工作负载上下文中以保护模式运行的 ERT 执行。ctrlcode
由一系列名为XAie_TxnOpcode
的操作码组成。有关更多详细信息,请参阅 AI 引擎运行时。
特殊主机缓冲区¶
每个上下文的指令缓冲区¶
每个工作负载上下文都使用一个主机驻留的 64 MB 缓冲区,该缓冲区被内存映射到为服务该工作负载而创建的 ERT 实例中。工作负载使用的 ctrlcode
被复制到这个特殊内存中。该缓冲区像该工作负载使用的所有其他输入/输出缓冲区一样受 PASID 保护。指令缓冲区也被映射到工作负载的用户空间中。
全局特权缓冲区¶
此外,驱动程序还分配了一个单一缓冲区用于维护任务,例如记录来自 MERT 的错误。这个全局缓冲区使用全局 IOMMU 域,并且只能由 MERT 访问。
高级使用流程¶
以下是在 AMD NPU 上运行工作负载的步骤
将工作负载编译成叠加层和
ctrlcode
二进制文件。用户空间在驱动程序中打开一个上下文并提供叠加层。
驱动程序向资源解析器查询,为工作负载提供一组列。
然后驱动程序请求 MERT 在设备上创建具有所需列的上下文。
MERT 然后创建一个 ERT 实例。MERT 还会将指令缓冲区映射到 ERT 内存中。
用户空间然后将
ctrlcode
复制到指令缓冲区。用户空间然后创建一个命令缓冲区,其中包含指向输入、输出和指令缓冲区的指针;然后将命令缓冲区提交给驱动程序并进入睡眠状态等待完成。
驱动程序通过邮箱将命令发送到 ERT。
ERT *执行*指令缓冲区中的
ctrlcode
。ctrlcode
的执行在 AMD XDNA 阵列运行时启动主机 DDR 的 DMA 操作(输入和输出)。当 ERT 到达
ctrlcode
的末尾时,它会触发一个 MSI-X 中断,向驱动程序发送完成信号,然后驱动程序唤醒等待中的工作负载。
启动流程¶
amdxdna 驱动程序使用 PSP 安全地加载已签名的 NPU 固件并启动 NPU 微控制器的引导。amdxdna 驱动程序随后在 BAR 0 上的一个特殊位置等待活动信号。NPU 在 SoC 挂起期间关闭,并在恢复后开启,此时 NPU 固件会重新加载,并再次执行握手。
用户空间组件¶
编译器¶
Peano 是一个基于 LLVM 的开源编译器,用于 AMD XDNA 阵列计算单元,可在以下链接获取:https://github.com/Xilinx/llvm-aie
开源 IREE 编译器支持 AMD NPU 的 ML 模型图编译,底层使用 Peano。可在以下链接获取:https://github.com/nod-ai/iree-amd-aie
用户模式驱动程序 (UMD)¶
开源 XRT 运行时栈与 amdxdna 内核驱动程序接口。XRT 可在以下链接获取:https://github.com/Xilinx/XRT
NPU 的开源 XRT shim 可在以下链接获取:https://github.com/amd/xdna-driver
DMA 操作¶
DMA 操作指令在 ctrlcode
中编码为 XAIE_IO_BLOCKWRITE
操作码。当 ERT 执行 XAIE_IO_BLOCKWRITE
时,主机 DDR 和 L2 内存之间的 DMA 操作会生效。
错误处理¶
当 MERT 在 AMD XDNA 阵列中检测到错误时,它会暂停该工作负载上下文的执行,并通过特权通道向驱动程序发送异步消息。然后驱动程序向 MERT 发送一个缓冲区指针,以捕获绑定到故障工作负载上下文的分区的寄存器状态。然后驱动程序通过读取缓冲区指针的内容来解码错误。
遥测¶
MERT 可以报告各种遥测信息,例如以下各项
L1 中断计数器
DMA 计数器
深度睡眠计数器
等