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 列。

共享 L2 記憶體

單行記憶體單元建立了一個由軟體管理的片上 L2 記憶體池。DMA 引擎用於在主機 DDR 和記憶體單元之間移動資料。AMD Phoenix 和 AMD Hawk Point NPU 總共有 2560 KB 的 L2 記憶體。AMD Strix Point NPU 總共有 4096 KB 的 L2 記憶體。

微控制器

微控制器執行 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 編譯器生成的兩個獨立的二進位制檔案組成。

  1. AMD XDNA 陣列疊加層(overlay),用於配置 NPU 空間分割槽。疊加層包含用於設定流交換機配置的指令和計算單元的 ELF。疊加層由關聯的 ERT 例項載入到繫結到工作負載的空間分割槽上。有關更多詳細資訊,請參閱 Versal 自適應 SoC AIE-ML 架構手冊 (AM020)

  2. ctrlcode,用於編排載入在空間分割槽上的疊加層。ctrlcode 由微控制器上在工作負載上下文中以保護模式執行的 ERT 執行。ctrlcode 由一系列名為 XAie_TxnOpcode 的操作碼組成。有關更多詳細資訊,請參閱 AI 引擎執行時

特殊主機緩衝區

每個上下文的指令緩衝區

每個工作負載上下文都使用一個主機駐留的 64 MB 緩衝區,該緩衝區被記憶體對映到為服務該工作負載而建立的 ERT 例項中。工作負載使用的 ctrlcode 被複制到這個特殊記憶體中。該緩衝區像該工作負載使用的所有其他輸入/輸出緩衝區一樣受 PASID 保護。指令緩衝區也被對映到工作負載的使用者空間中。

全域性特權緩衝區

此外,驅動程式還分配了一個單一緩衝區用於維護任務,例如記錄來自 MERT 的錯誤。這個全域性緩衝區使用全域性 IOMMU 域,並且只能由 MERT 訪問。

高階使用流程

以下是在 AMD NPU 上執行工作負載的步驟

  1. 將工作負載編譯成疊加層和 ctrlcode 二進位制檔案。

  2. 使用者空間在驅動程式中開啟一個上下文並提供疊加層。

  3. 驅動程式向資源解析器查詢,為工作負載提供一組列。

  4. 然後驅動程式請求 MERT 在裝置上建立具有所需列的上下文。

  5. MERT 然後建立一個 ERT 例項。MERT 還會將指令緩衝區對映到 ERT 記憶體中。

  6. 使用者空間然後將 ctrlcode 複製到指令緩衝區。

  7. 使用者空間然後建立一個命令緩衝區,其中包含指向輸入、輸出和指令緩衝區的指標;然後將命令緩衝區提交給驅動程式並進入睡眠狀態等待完成。

  8. 驅動程式透過郵箱將命令傳送到 ERT。

  9. ERT *執行*指令緩衝區中的 ctrlcode

  10. ctrlcode 的執行在 AMD XDNA 陣列執行時啟動主機 DDR 的 DMA 操作(輸入和輸出)。

  11. 當 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 計數器

  • 深度睡眠計數器

參考資料