本文將分成三篇,探討如何基於Kahn處理網路(KPN),定義AI引擎繪圖程式設計模型。上一篇介紹Kahn處理網路,本節則介紹資料流程程式設計,如何適用於AI引擎。節點或核心(Kernel)通常在AI引擎中,用於執行任務,並且可執行的工作範圍不像圖1運算模型提及的單一運算子嚴格。AI引擎可以包含多個Kernel,用於執行不同的任務。
KPN的邊緣端代表資料往返於演算單元或連接埠的路徑。邊緣被用於I/O串流、階層式(Cascade)I/O串流、串流或直接記憶體存取(DMA)FIFO,以及AI引擎區塊架構中的本機區塊記憶體緩衝區。
在AI引擎設計中,KPN節點(AI引擎Kernel)之間的連接,透過C++自行調適資料流程(ADF)圖程式。這段程式碼可建立KPN節點(AI引擎Kernel)之間的資料流程圖連接,並識別這些節點所需的任何大型記憶體緩衝區,以及該繪圖任務所需的所有I/O。
執行的排程由資料流程圖,以及輸入數據和輸出資源的可用性來決定:
- AI引擎沒有IP指令指標暫存器(Instruction Pointer)。只要所有輸入資料可用,如同在KPN中,每個區塊都會觸發並執行其Kernel函數。
- 設備基於資料流程圖的特性,可提供多個執行單元,範圍包含數十個到數百個AI引擎。但是根據資料流程圖中相互連線的特性,全部、部分或沒有引擎會平行處理任務有些、沒有或者全部並行執行。
- 所有AI引擎就像在KPN中一樣,都在運算或等待資料輸入。
AI引擎編譯器接收資料輸入(資料流程圖和Kernel),並生成用於在具備AI引擎裝置上,可執行的應用。AI引擎編譯器會分配必要的鎖定、記憶體緩衝區、DMA通道和描述子等必要資源,並生成用於將圖行映射到AI引擎陣列的路徑資訊。它為每個核心(Core)合成一個主要程式,這個程式用於排程該Core上的所有Kernel,並在緩衝區之間執行必要的鎖定機制和資料複製。
如圖9所示,函數1的作用是為每個B產生兩個A。平均而言,函數2消耗的A是其消耗的B的兩倍。但是這些數字有時候可能是A,有時候可能是B。為了處理這種情況,資料/標記需要累積以便後續處理。在某些情況下,如果資料累積的週期較長,可能導致系統停滯並影響效能。具體難度根據設計要求而異,而克服這些挑戰的方法包括透過添加FIFO來累積資料,透過使用多個AI引擎和其它最佳化技術的方式程式化設計Kernel,以提高效能。同時瞭解鎖死(Deadlock)問題,並使用適當的技術來解決也至關重要。
表1列出了KPN和AI引擎術語之間的比較。在某些情況下,對於特定演算法而言,資料流程程式設計具有一定挑戰性,因為排程可能會導致程式停滯。
AI引擎架構
AI引擎提供多層級平行性,包括指令級平行性和資料級平行性(圖10)。指令級平行性包括一個純量操作、最多兩個移動指令、兩個向量讀取(載入)、一個向量寫入(儲存)以及一個可執行的向量指令。每個時脈週期可以執行7路超長指令字(Very Long Instruction Word, VLIW)指令。
資料級平行性透過向量級運算實現,其中可以在每個時脈週期的基礎上,運算多組資料。每個AI引擎都包含一個向量和純量處理器、專用程式記憶體、本機32 KB資料記憶體,以及可在三個相鄰方向中的任意一個方向上,存取本機資料的權限本。此外,每個AI引擎也可以存取DMA引擎和AXI4互連交換機,透過串流與其它AI引擎、可程式化設計邏輯(PL)或DMA通訊。
AI引擎Kernel/繪圖程式設計
加速程式設計所需的Kernel/函數,使用具備AI引擎API(針對AI引擎的VLIW標量和向量處理器)的C++來程式設計。AI引擎Kernel程式碼使用產品如AMD Vitis開發套件中,包含的AI引擎編譯器(Aiecompiler)編譯。AI引擎編譯器對編譯Kernel,以生成在AI引擎處理器上,可執行與可連結格式(ELF)檔。Kernel可被映射到基於演算法的獨立AI引擎上,以執行平行運算(圖11)。
資訊流程的概念,應該應用於設計規範,以盡可能善用平行運算的優勢。此外,確保AI引擎Kernel的執行速度加快,也能保有資料流程程式設計的優勢。下一篇將介紹AI引擎設計範例。
(本文由AMD提供)
AI引擎程式設計(2) 智慧運算加速資料流程設計