一 簡述
為了應對無線波束形成、大規(guī)模計算和機器學習推斷等新一代應用需求的非線性增長,AMD 開發(fā)了一項全新的創(chuàng)新處理技術(shù) AI 引擎,片內(nèi)集成該AI Engine的FPGA系列是Versal 自適應計算加速平臺 (ACAP) 。
有很多文檔都描述了AI Engine的架構(gòu)和性能參數(shù),但是看完這些后,現(xiàn)實中遇到的問題最多的是這個AI Engine到底怎么用,在Vivado中怎么調(diào)用,數(shù)據(jù)怎么跟PL、ARM之間進行交互,數(shù)據(jù)怎么給AIEngine運算,計算后的結(jié)果又怎么獲取,有沒有相關(guān)的例程等等。我想通過以下教程從Vivado建工程、添加 AI 引擎和應用、Vitis Unified裸機應用程序并生成bin文件在硬件上跑起來一個完整的步驟來告訴大家AI Engine是怎么用起來的,通過這個例子能夠讓大家熟悉Vivado和Vitis Unified IDE對AIE怎么操作。
作者在創(chuàng)建本文例程時使用的開發(fā)工具版本是VitisUnified 2023.2。
二 AI Engine裸機應用創(chuàng)建的流程
流程分為以下四個步驟,如下圖所示:
步驟一:定制平臺的創(chuàng)建
構(gòu)建硬件平臺是設(shè)計的起點,將用于構(gòu)建 Vitis 軟件平臺應用程序。在本教程的這一步驟中,描述了如何創(chuàng)建新平臺的示例。首先使用 AMD Vivado設(shè)計套件中的AI引擎構(gòu)建硬件系統(tǒng)。
1.在Vivado中構(gòu)建AMD Versal可擴展嵌入式平臺示例設(shè)計
1)啟動Vivado,然后在歡迎窗口中選擇Open Example Project;
2)先單擊Next,在Templates選擇頁面中選擇VersalExtensible Embedded Platform,點擊Next;
3)將此項目命名為custom_pfm_vck190或者自定義并單擊Next;
4)在開發(fā)板選擇頁面中,這里選擇的是Versal VCK190 Evaluation Platform,點擊Next;
5)在設(shè)計預設(shè)頁面中,保持默認設(shè)置。請注意,示例中的可擴展平臺AI引擎已添加;
6)單擊Finish完成示例工程的創(chuàng)建,Vivado自動使用剛剛創(chuàng)建的模板設(shè)計打開 Vivado項目,可以打開Block Deisgn來查看平臺設(shè)計的詳細信息。通過使用預構(gòu)建的可擴展平臺模板,可以輕松獲得經(jīng)過驗證的平臺硬件設(shè)計,以繼續(xù)下一步。在實際的設(shè)計開發(fā)過程中,可以使用它作為baseline設(shè)計并在此基礎(chǔ)上進行進一步的修改;
7)在Vivado左側(cè)的Flow Navigator 面板中單擊GenerateBlock Design,單擊Generate,然后等待該過程完成;
注意:生成模塊設(shè)計時,Vivado會顯示嚴重警告,這是因為中斷控制器IP有一個未連接的輸入??梢院雎?,因為Vitis稍后會在流程中自動連接該輸入。
8)從Vivado菜單中單擊File,然后選擇Export -> ExportPlatform,點擊Next;
A.在第二頁上,選擇Hardware and hardware emulation作為平臺類型,單擊Next;
B.在第三頁上選擇Pre-synthesis,單擊Next;
C.在第四頁上,添加平臺名稱,單擊Next;
D.在第五頁中,設(shè)置XSA的名稱,然后單擊Finish;
9)導出硬件平臺后關(guān)閉Vivado工程。
2. 在 Vitis 軟件平臺中構(gòu)建平臺
1)打開 Vitis Unified,然后選擇一個工作區(qū);
2)在歡迎頁面上,選擇Create PlatformComponent,或選擇File -> New Component ->Platform;
3)將平臺組件名稱設(shè)置為base_pfm_vck190,然后單擊Next;
4)選擇Hardware Design并使用上一步Vivado導出的 XSA,然后單擊Next;
5) 將操作系統(tǒng)設(shè)置為aie_runtime,將處理器設(shè)置為ai_engine,然后單擊Next,接著再單擊Finish完成平臺組件創(chuàng)建;
6)然后通過在流程導航器中單擊Build并選擇base_pfm_vck190組件來構(gòu)建平臺;
注意:如果后面要更改XSA文件,單擊位于該平臺組件的Settings文件夾中的 vitis-comp.json,然后單擊Switch XSA;
7)生成的平臺可以在base_pfm_vck190/export中找到。
在此步驟中,從Vivado Design Suite中開始創(chuàng)建硬件平臺,然后根據(jù)導出的XSA文件在Vitis Unified軟件平臺中構(gòu)建平臺。下一步驟,將使用Vitis Unified中的平臺構(gòu)建AI Engine應用程序。
步驟二:創(chuàng)建AI引擎應用
在這一步驟中,將學習如何從模板創(chuàng)建新的AI Engine應用程序工程,并運行Emulation-AIE程序。
1. 新建一個AI Engine應用項目
1)如果已關(guān)閉 Vitis UnifiedIDE,將其打開,使用步驟一中相同的工作區(qū);
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組件名稱設(shè)置為simple_aie_application,然后單擊Next;
5)在Select Platform頁面中,選擇要使用的平臺,選擇剛剛創(chuàng)建的base_pfm_vck190平臺, 單擊Next,然后下一頁面中單擊Finish;
6)該Simple模板導入了兩個文件夾:
A.Src文件夾包含kernels和graph的源代碼;
B.Data文件夾包含仿真輸入的數(shù)據(jù)(input.txt)和正確的輸出數(shù)據(jù) (golden.txt)。
7)打開文件project.h查看graph,可以看到該AIE示例graph有一個輸入和一個輸出,并實現(xiàn)了具有相同功能的兩個內(nèi)核,第一個內(nèi)核的輸出提供給第二個內(nèi)核;
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文件查看內(nèi)核中實現(xiàn)哪些功能,可以看到這是一個簡單的計算,將輸入的實部和虛部相加給輸出的實部,輸入的實部減去虛部給輸出的虛部。
2.構(gòu)建項目并通過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)在控制臺中可以看到仿真成功運行,輸出數(shù)據(jù)文件已經(jīng)生成build/aiesimulator_output
/data/output.txt,可以將文件output.txt與golden.txt文件里面數(shù)據(jù)進行比較,output.txt與golden.txt數(shù)據(jù)一樣。
? 步驟三:系統(tǒng)集成
在這一步驟中,將學習如何將 HLS 中的可編程邏輯 (PL) 內(nèi)核添加到系統(tǒng)項目中,并構(gòu)建整個系統(tǒng)。
1.修改graph以用于硬件構(gòu)建 步驟二已經(jīng)創(chuàng)建了一個可以在AI Engine陣列上運行的應用程序,現(xiàn)在需要修改AI Engine graph以便在硬件中使用,并使用 Vitis 編譯器 (V++) 將AI Engine陣列連接到PL;project.cpp中的main函數(shù)不會在硬件運行中使用,因此需要添加一個開關(guān)(#ifdefined(...)),以便在硬件構(gòu)建時不考慮這個main函數(shù);
2.添加 PL 內(nèi)核
在此示例中,使用 HLS 內(nèi)核用于連接memory和 AXI4-Stream 接口,以便memory和 AXI4-Stream接口之間的數(shù)據(jù)交互;
mm2s kernel:從memory讀取數(shù)據(jù)并將其輸入到AI Engine陣列中;
s2mm kernel:從AI Engine陣列接收輸出數(shù)據(jù)并將其寫入memory。
1)在 Vitis Unified IDE 中,單擊File -> New Component -> HLS;
2)將第一個組件命名為mm2s并單擊Next;
3)在Configuration File頁面中,保留默認設(shè)置(Empty File),然后單擊Next;
4)在Source Files頁面中,添加mm2s.cpp文件;
5)在同一頁面
中,將mm2s函數(shù)設(shè)置為top function(點擊Browse并選擇mm2s),然后單擊Next;
6)在
Hardware選擇平臺頁面中,選擇剛剛創(chuàng)建的base_pfm_vck190平臺,點擊Next;
7)在
Settings頁面中flow_target下選擇Vitis KernelFlow Target,package.output_format下選擇Generate Vitis XO,單擊Next,然后單擊Finish;
8)重
復以上1 到 7 ,使用s2mm.cpp文件創(chuàng)建一個名為s2mm的 HLS 組件。
3. 配置硬件鏈接項目
剛剛已經(jīng)導入了kernels,現(xiàn)在我們需要告訴 Vitis Linker如何將所有組件連接在一起
1)在Vitis Unified IDE中單擊File -> New Component -> System Project創(chuàng)建一個新的系統(tǒng)項目組件;
2)將此系統(tǒng)組件命名為simple_aie_application_system_project并單擊Next;
3)在Platform頁面中選擇剛剛創(chuàng)建的base_pfm_vck190平臺;
4)跳過Embedded Component Paths頁面(單擊Next),此頁面用于運行 Linux 的系統(tǒng),這個示例是裸機系統(tǒng),所以不用管,然后在下一面中單擊Finish;
5)打開simple_aie_application_system_project-> Settings
下名為vitis-sys.json 的設(shè)置文件,然后單擊文件底部Components部分中的add Existing Component,單擊HLS并選擇mm2s和s2mm組件;
6)再次單擊文件底部Components部分中的add Existing Component,單擊AIEngine并選擇simple_aie_application組件;
7)現(xiàn)在需要告訴 Vitis 編譯器系統(tǒng)的連接情況,此步驟是使用配置文件完成的。仍在設(shè)置文件vitis-sys.json中,在Hardware LinkSettings下單擊binary_container_1展開,然后單擊hw_link/binary_container_1-link.cfg;
將binary_container_1-link.cfg顯示更改為Source Editor,并在[connectivity]下添加以下行;
以上計算單元的命名規(guī)則參照Vitis Unified Software Platform Documentation: ApplicationAcceleration Development (UG1393);
8)在binary_container_1-link.cfg頁面中,將顯示更改回Settings Form并啟用Exporthardware (XSA)。
4.構(gòu)建系統(tǒng)
1)在Vitis Unified IDE的流程導航器中,確保選擇了simple_aie_application_system_project并單擊HARDWARE -> LINK - binary_container_1下的Build Binary Container,當彈出頁面要求構(gòu)建組件(simple_aie_application、mm2s 和 s2mm)時,全選上后單擊OK開始編譯,編譯過程需要一些時間才能完成,依次編譯AI Engine應用工程、HLS硬件內(nèi)核工程、硬件鏈接工程,過一段時間后系統(tǒng)可以成功構(gòu)建并沒有錯誤;
2)可以打開生成的Vivado工程
?
在下一步驟中,將創(chuàng)建一個處理系統(tǒng) (PS) 裸機應用程序,并用它來運行該系統(tǒng)。
步驟四:PS 應用程序的創(chuàng)建和運行
在這一步驟中,將學習如何使用上面步驟中生成的XSA構(gòu)建PS裸機應用程序,然后編譯并運行整個系統(tǒng)。
1.在裸機Domain中創(chuàng)建一個新平臺
1)在 Vitis Unified IDE 中,工作區(qū)目錄與上面步驟中相同,單擊File -> New Component-> Platform;
2)將平臺項目名稱設(shè)置為AIE_A-to-Z_pfm_vck190,然后單擊Next;
3)使用上面步驟中生成的XSA,可以在以下位置找到該XSA:
4)將Operating system設(shè)置為standalone,將Processor設(shè)置為psv_cortexa72_0,單擊Next,然后下一頁面中單擊Finish;
5)編譯平臺。
2.創(chuàng)建裸機的AI引擎控制應用程序
1)在 Vitis Unified IDE 中單擊File -> New Component -> Application創(chuàng)建一個新應用程序;
2)將應用程序的名稱設(shè)置為A-to-Z_app并單擊Next;
3)選擇剛剛創(chuàng)建的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文件的內(nèi)容,可以看到代碼正在初始化輸入數(shù)據(jù)和輸出數(shù)據(jù)的內(nèi)存空間,需要注意的是這里使用.init()和.run()APIs 來控制AI引擎:
printf("Starting AIE Graph ");
printf("GraphInitialization ");
mygraph.init();
printf("Done ");
printf("- ");
printf("Running Graph for 4iterations ");
mygraph.run(4);
從系統(tǒng)中啟用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)構(gòu)建組件A-to-Z_app。
3.打包整個系統(tǒng)
1) 展開simple_aie_application_system_project,在Settings目錄中,單擊打開vitis-sys.json,然后單擊Package Settings下的package.cfg配置文件;
2)在package.cfg的General部分的 Baremetal Elf 設(shè)置中添加以下內(nèi)容,告訴打包程序添加應用程序可執(zhí)行文件,并在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中運行系統(tǒng)
現(xiàn)在整個系統(tǒng)已經(jīng)構(gòu)建完成,可以在 hardware emulation中對其進行測試;
1)選中simple_aie_application_system_project,在流程導航器中,單擊HARDWARE EMULATION下的StartEmulator;
2)在Start Emulator彈出窗口中,保留默認設(shè)置并單擊Start;
注意:可以使能Show Waveform選項打開Vivado Simulator,并觀察 PL 信號的波形,如果使能了此選項,請確保在Vivado Simulator中運行simulation,因為 QEMU將等待它。
3)可以在Vitis控制臺中看到應用程序成功運行且沒有錯誤;
4)要停止Emulator,單擊流程導航器中Start Emulator上的ⅹ。
5.針對硬件構(gòu)建系統(tǒng)
在硬件中運行系統(tǒng)之前,需要重建系統(tǒng)以針對硬件;為硬件編譯構(gòu)建simple_aie_application_system_project項目(單擊Flow 導航器中HARDWARE下的Build All )。
6.在硬件中運行系統(tǒng)
使用 SD 卡運行應用程序:
1)正確連接好開發(fā)板的電源線、JTAG USB 線、UART USB 線,并將啟動模式設(shè)置為 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 卡插入開發(fā)板,然后打開開發(fā)板電源,可以看到應用程序成功運行,沒有錯誤。
三總結(jié)
在本文中,基于 VCK190評估板,在Vivado中創(chuàng)建了一個通用的硬件平臺并導出,在Vitis Unified中將 AI Engine 內(nèi)核和 PL 內(nèi)核添加到系統(tǒng)中,并構(gòu)建了 PS 裸機應用程序來控制系統(tǒng),并在HARDWARE EMULATION和硬件中運行成功。通過以上步驟可以知道怎么把Versal的AIE用起來,希望能夠幫助大家盡快能將AMD Versal中這一全新的創(chuàng)新處理技術(shù)AI引擎運用到項目或者產(chǎn)品中。
下一篇文章會基于這篇文章介紹創(chuàng)建一個運行Linux操作系統(tǒng)的Vitis平臺,并在該平臺上運行AI引擎工程。
審核編輯:劉清
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
593瀏覽量
27397 -
機器學習
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132630 -
數(shù)據(jù)交互
+關(guān)注
關(guān)注
0文章
30瀏覽量
10489 -
中斷控制器
+關(guān)注
關(guān)注
0文章
59瀏覽量
9456 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66537
原文標題:Versal裸機使用AI Engine的完整流程
文章出處:【微信號:Comtech FPGA,微信公眾號:Comtech FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論