一 簡述
為了應對無線波束形成、大規模計算和機器學習推斷等新一代應用需求的非線性增長,AMD 開發了一項全新的創新處理技術 AI 引擎,片內集成該AI Engine的FPGA系列是Versal 自適應計算加速平臺 (ACAP) 。
有很多文檔都描述了AI Engine的架構和性能參數,但是看完這些后,現實中遇到的問題最多的是這個AI Engine到底怎么用,在Vivado中怎么調用,數據怎么跟PL、ARM之間進行交互,數據怎么給AIEngine運算,計算后的結果又怎么獲取,有沒有相關的例程等等。我想通過以下教程從Vivado建工程、添加 AI 引擎和應用、Vitis Unified裸機應用程序并生成bin文件在硬件上跑起來一個完整的步驟來告訴大家AI Engine是怎么用起來的,通過這個例子能夠讓大家熟悉Vivado和Vitis Unified IDE對AIE怎么操作。
作者在創建本文例程時使用的開發工具版本是VitisUnified 2023.2。
二 AI Engine裸機應用創建的流程
流程分為以下四個步驟,如下圖所示:
步驟一:定制平臺的創建
構建硬件平臺是設計的起點,將用于構建 Vitis 軟件平臺應用程序。在本教程的這一步驟中,描述了如何創建新平臺的示例。首先使用 AMD Vivado設計套件中的AI引擎構建硬件系統。
1.在Vivado中構建AMD Versal可擴展嵌入式平臺示例設計
1)啟動Vivado,然后在歡迎窗口中選擇Open Example Project;
2)先單擊Next,在Templates選擇頁面中選擇VersalExtensible Embedded Platform,點擊Next;
3)將此項目命名為custom_pfm_vck190或者自定義并單擊Next;
4)在開發板選擇頁面中,這里選擇的是Versal VCK190 Evaluation Platform,點擊Next;
5)在設計預設頁面中,保持默認設置。請注意,示例中的可擴展平臺AI引擎已添加;
6)單擊Finish完成示例工程的創建,Vivado自動使用剛剛創建的模板設計打開 Vivado項目,可以打開Block Deisgn來查看平臺設計的詳細信息。通過使用預構建的可擴展平臺模板,可以輕松獲得經過驗證的平臺硬件設計,以繼續下一步。在實際的設計開發過程中,可以使用它作為baseline設計并在此基礎上進行進一步的修改;
7)在Vivado左側的Flow Navigator 面板中單擊GenerateBlock Design,單擊Generate,然后等待該過程完成;
注意:生成模塊設計時,Vivado會顯示嚴重警告,這是因為中斷控制器IP有一個未連接的輸入。可以忽略,因為Vitis稍后會在流程中自動連接該輸入。
8)從Vivado菜單中單擊File,然后選擇Export -> ExportPlatform,點擊Next;
A.在第二頁上,選擇Hardware and hardware emulation作為平臺類型,單擊Next;
B.在第三頁上選擇Pre-synthesis,單擊Next;
C.在第四頁上,添加平臺名稱,單擊Next;
D.在第五頁中,設置XSA的名稱,然后單擊Finish;
9)導出硬件平臺后關閉Vivado工程。
2. 在 Vitis 軟件平臺中構建平臺
1)打開 Vitis Unified,然后選擇一個工作區;
2)在歡迎頁面上,選擇Create PlatformComponent,或選擇File -> New Component ->Platform;
3)將平臺組件名稱設置為base_pfm_vck190,然后單擊Next;
4)選擇Hardware Design并使用上一步Vivado導出的 XSA,然后單擊Next;
5) 將操作系統設置為aie_runtime,將處理器設置為ai_engine,然后單擊Next,接著再單擊Finish完成平臺組件創建;
6)然后通過在流程導航器中單擊Build并選擇base_pfm_vck190組件來構建平臺;
注意:如果后面要更改XSA文件,單擊位于該平臺組件的Settings文件夾中的 vitis-comp.json,然后單擊Switch XSA;
7)生成的平臺可以在base_pfm_vck190/export中找到。
在此步驟中,從Vivado Design Suite中開始創建硬件平臺,然后根據導出的XSA文件在Vitis Unified軟件平臺中構建平臺。下一步驟,將使用Vitis Unified中的平臺構建AI Engine應用程序。
步驟二:創建AI引擎應用
在這一步驟中,將學習如何從模板創建新的AI Engine應用程序工程,并運行Emulation-AIE程序。
1. 新建一個AI Engine應用項目
1)如果已關閉 Vitis UnifiedIDE,將其打開,使用步驟一中相同的工作區;
2)單擊View -> Examples查看隨Vitis Unified安裝的應用實例;
3)在AI Engine Examples ->Installed AI Engine Examples下選擇Simple,并單擊Create AI Engine Component from Template;
注意:在Simple模板的描述中,它表示該模板僅適用于AIE仿真和SW(x86)仿真。在下面步驟中,將學習如何使其在硬件上運行。
4)將AIE組件名稱設置為simple_aie_application,然后單擊Next;
5)在Select Platform頁面中,選擇要使用的平臺,選擇剛剛創建的base_pfm_vck190平臺, 單擊Next,然后下一頁面中單擊Finish;
6)該Simple模板導入了兩個文件夾:
A.Src文件夾包含kernels和graph的源代碼;
B.Data文件夾包含仿真輸入的數據(input.txt)和正確的輸出數據 (golden.txt)。
7)打開文件project.h查看graph,可以看到該AIE示例graph有一個輸入和一個輸出,并實現了具有相同功能的兩個內核,第一個內核的輸出提供給第二個內核;
first = kernel::create(simple);
second = kernel::create(simple);
adf::connect(in.out[0], first.in[0]);
connect(first.out[0], second.in[0]);
connect(second.out[0], out.in[0]);
該graph的圖形表示如下:
8)打開kernels/kernels.cc文件查看內核中實現哪些功能,可以看到這是一個簡單的計算,將輸入的實部和虛部相加給輸出的實部,輸入的實部減去虛部給輸出的虛部。
2.構建項目并通過Emulation-AIE運行
1)在流程導航器中,確保選擇simple_aie_application組件,然后單擊AIE SIMULATOR / HARDWARE下的Build;
2)Bulid完成后,要運行 System C 仿真(Emulation-AIE或AIE SIMULATOR),在 Flow 導航器中,確保選擇simple_aie_application組件,然后單擊AIE SIMULATOR / HARDWARE下的Run;
3)在控制臺中可以看到仿真成功運行,輸出數據文件已經生成build/aiesimulator_output
/data/output.txt,可以將文件output.txt與golden.txt文件里面數據進行比較,output.txt與golden.txt數據一樣。
? 步驟三:系統集成
在這一步驟中,將學習如何將 HLS 中的可編程邏輯 (PL) 內核添加到系統項目中,并構建整個系統。
1.修改graph以用于硬件構建 步驟二已經創建了一個可以在AI Engine陣列上運行的應用程序,現在需要修改AI Engine graph以便在硬件中使用,并使用 Vitis 編譯器 (V++) 將AI Engine陣列連接到PL;project.cpp中的main函數不會在硬件運行中使用,因此需要添加一個開關(#ifdefined(...)),以便在硬件構建時不考慮這個main函數;
2.添加 PL 內核
在此示例中,使用 HLS 內核用于連接memory和 AXI4-Stream 接口,以便memory和 AXI4-Stream接口之間的數據交互;
mm2s kernel:從memory讀取數據并將其輸入到AI Engine陣列中;
s2mm kernel:從AI Engine陣列接收輸出數據并將其寫入memory。
1)在 Vitis Unified IDE 中,單擊File -> New Component -> HLS;
2)將第一個組件命名為mm2s并單擊Next;
3)在Configuration File頁面中,保留默認設置(Empty File),然后單擊Next;
4)在Source Files頁面中,添加mm2s.cpp文件;
5)在同一頁面
中,將mm2s函數設置為top function(點擊Browse并選擇mm2s),然后單擊Next;
6)在
Hardware選擇平臺頁面中,選擇剛剛創建的base_pfm_vck190平臺,點擊Next;
7)在
Settings頁面中flow_target下選擇Vitis KernelFlow Target,package.output_format下選擇Generate Vitis XO,單擊Next,然后單擊Finish;
8)重
復以上1 到 7 ,使用s2mm.cpp文件創建一個名為s2mm的 HLS 組件。
3. 配置硬件鏈接項目
剛剛已經導入了kernels,現在我們需要告訴 Vitis Linker如何將所有組件連接在一起
1)在Vitis Unified IDE中單擊File -> New Component -> System Project創建一個新的系統項目組件;
2)將此系統組件命名為simple_aie_application_system_project并單擊Next;
3)在Platform頁面中選擇剛剛創建的base_pfm_vck190平臺;
4)跳過Embedded Component Paths頁面(單擊Next),此頁面用于運行 Linux 的系統,這個示例是裸機系統,所以不用管,然后在下一面中單擊Finish;
5)打開simple_aie_application_system_project-> Settings
下名為vitis-sys.json 的設置文件,然后單擊文件底部Components部分中的add Existing Component,單擊HLS并選擇mm2s和s2mm組件;
6)再次單擊文件底部Components部分中的add Existing Component,單擊AIEngine并選擇simple_aie_application組件;
7)現在需要告訴 Vitis 編譯器系統的連接情況,此步驟是使用配置文件完成的。仍在設置文件vitis-sys.json中,在Hardware LinkSettings下單擊binary_container_1展開,然后單擊hw_link/binary_container_1-link.cfg;
將binary_container_1-link.cfg顯示更改為Source Editor,并在[connectivity]下添加以下行;
以上計算單元的命名規則參照Vitis Unified Software Platform Documentation: ApplicationAcceleration Development (UG1393);
8)在binary_container_1-link.cfg頁面中,將顯示更改回Settings Form并啟用Exporthardware (XSA)。
4.構建系統
1)在Vitis Unified IDE的流程導航器中,確保選擇了simple_aie_application_system_project并單擊HARDWARE -> LINK - binary_container_1下的Build Binary Container,當彈出頁面要求構建組件(simple_aie_application、mm2s 和 s2mm)時,全選上后單擊OK開始編譯,編譯過程需要一些時間才能完成,依次編譯AI Engine應用工程、HLS硬件內核工程、硬件鏈接工程,過一段時間后系統可以成功構建并沒有錯誤;
2)可以打開生成的Vivado工程
?
在下一步驟中,將創建一個處理系統 (PS) 裸機應用程序,并用它來運行該系統。
步驟四:PS 應用程序的創建和運行
在這一步驟中,將學習如何使用上面步驟中生成的XSA構建PS裸機應用程序,然后編譯并運行整個系統。
1.在裸機Domain中創建一個新平臺
1)在 Vitis Unified IDE 中,工作區目錄與上面步驟中相同,單擊File -> New Component-> Platform;
2)將平臺項目名稱設置為AIE_A-to-Z_pfm_vck190,然后單擊Next;
3)使用上面步驟中生成的XSA,可以在以下位置找到該XSA:
4)將Operating system設置為standalone,將Processor設置為psv_cortexa72_0,單擊Next,然后下一頁面中單擊Finish;
5)編譯平臺。
2.創建裸機的AI引擎控制應用程序
1)在 Vitis Unified IDE 中單擊File -> New Component -> Application創建一個新應用程序;
2)將應用程序的名稱設置為A-to-Z_app并單擊Next;
3)選擇剛剛創建的AIE_A-to-Z_pfm_vck190作為平臺,然后單擊Next;
4)選擇 A72_0 domain(standalone_psv_cortexa72_0),單擊Next,然后在下一頁面中單擊Finish;
5)右鍵單擊A-to-Z_app工程下的src文件夾,然后單擊Import -> Files;
6)將aie_control.cpp從simple_aie_application project工程中( simple_application/build/hw/Work/ps/c_rts/aie_control.cpp)導入到src文件夾中;
7)從文章末下載鏈接下載main.cpp導入到文件夾src中,瀏覽main.cpp文件的內容,可以看到代碼正在初始化輸入數據和輸出數據的內存空間,需要注意的是這里使用.init()和.run()APIs 來控制AI引擎:
printf("Starting AIE Graph ");
printf("GraphInitialization ");
mygraph.init();
printf("Done ");
printf("- ");
printf("Running Graph for 4iterations ");
mygraph.run(4);
從系統中啟用AI引擎graph有兩種方式:
A. 在 PDI 中啟用graph,這表示該graph將在BOOT 期間啟動并永遠運行;
B.使用
APIs從PS程序中啟動AI引擎graph,本例中就是使用的該啟動方式。
8)在A-to-Z_app 組件下,打開Settings下的UserConfig.cmake,在Directories中的Include Paths (-I)里添加以下目錄:
A.
B.$ENV{XILINX_VITIS}/aietools/include。
9)仍在UserConfig.cmake文件中的Libraries部分中添加以下:
A.在Libraries (-l)里添加adf_api;
B.在Librarysearch path (-L)里添加$ENV{XILINX_VITIS}/aietools/lib/aarchnone64.o。
10)修改Linker Script以增加 AIE 庫的heap;
A.展開A-to-z_app組件;
B.在src目錄中,單擊lscript.ld打開該項目Linker Script;
C.在Linker Script中將heap大小修改為0x100000(1MB)。
?
11)構建組件A-to-Z_app。
3.打包整個系統
1) 展開simple_aie_application_system_project,在Settings目錄中,單擊打開vitis-sys.json,然后單擊Package Settings下的package.cfg配置文件;
2)在package.cfg的General部分的 Baremetal Elf 設置中添加以下內容,告訴打包程序添加應用程序可執行文件,并在A72處理器上運行它;
../../../../A-to-Z_app/build/A-to-Z_app.elf,a72-0
3)在AI Engine部分中,選擇Do not enable cores選項,取消選擇Enabledebug選項;
4)編譯用于硬件仿真的simple_aie_application_system_project項目(單擊Flow 導航器中HARDWARE EMULATION下的Build All )。
4.在Hardware Emulation中運行系統
現在整個系統已經構建完成,可以在 hardware emulation中對其進行測試;
1)選中simple_aie_application_system_project,在流程導航器中,單擊HARDWARE EMULATION下的StartEmulator;
2)在Start Emulator彈出窗口中,保留默認設置并單擊Start;
注意:可以使能Show Waveform選項打開Vivado Simulator,并觀察 PL 信號的波形,如果使能了此選項,請確保在Vivado Simulator中運行simulation,因為 QEMU將等待它。
3)可以在Vitis控制臺中看到應用程序成功運行且沒有錯誤;
4)要停止Emulator,單擊流程導航器中Start Emulator上的ⅹ。
5.針對硬件構建系統
在硬件中運行系統之前,需要重建系統以針對硬件;為硬件編譯構建simple_aie_application_system_project項目(單擊Flow 導航器中HARDWARE下的Build All )。
6.在硬件中運行系統
使用 SD 卡運行應用程序:
1)正確連接好開發板的電源線、JTAG USB 線、UART USB 線,并將啟動模式設置為 SD 啟動;
2)展開simple_aie_application_system_project組件下的Output -> hw -> package,在該package目錄中,有一個sd_card.img文件;
3)使用balenaEtcher工具將sd_card.img燒錄到SD卡中;
4)啟動連接到VCK190 COM端口的UART終端;
5)將 SD 卡插入開發板,然后打開開發板電源,可以看到應用程序成功運行,沒有錯誤。
三總結
在本文中,基于 VCK190評估板,在Vivado中創建了一個通用的硬件平臺并導出,在Vitis Unified中將 AI Engine 內核和 PL 內核添加到系統中,并構建了 PS 裸機應用程序來控制系統,并在HARDWARE EMULATION和硬件中運行成功。通過以上步驟可以知道怎么把Versal的AIE用起來,希望能夠幫助大家盡快能將AMD Versal中這一全新的創新處理技術AI引擎運用到項目或者產品中。
下一篇文章會基于這篇文章介紹創建一個運行Linux操作系統的Vitis平臺,并在該平臺上運行AI引擎工程。
審核編輯:劉清
-
Linux系統
+關注
關注
4文章
592瀏覽量
27357 -
機器學習
+關注
關注
66文章
8382瀏覽量
132443 -
數據交互
+關注
關注
0文章
30瀏覽量
10475 -
中斷控制器
+關注
關注
0文章
59瀏覽量
9442 -
Vivado
+關注
關注
19文章
808瀏覽量
66349
原文標題:Versal裸機使用AI Engine的完整流程
文章出處:【微信號:Comtech FPGA,微信公眾號:Comtech FPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論