在 SDSoC 環(huán)境中編譯程序時(shí),構(gòu)建過程輸出提供了從 SD 卡配置 Zynq SoC 所需的系列文件。該系列文件包括一級(jí)和二級(jí)引導(dǎo)載入程序,以及操作系統(tǒng)所需的應(yīng)用和映像。
SDSOC 實(shí)例
下面我們看看 SDSoC 環(huán)境如何工作,多快就能讓實(shí)例啟動(dòng)并運(yùn)行起來。我們針對(duì)的 ZedBoard 開發(fā)板運(yùn)行 Linux 操作系統(tǒng)并使用內(nèi)置矩陣乘法器和加法模板。
首先一如既往地創(chuàng)建項(xiàng)目。我們能通過歡迎窗口(圖 1)或通過菜單選擇“File -> New -> SDSoC”項(xiàng)目來創(chuàng)建項(xiàng)目。這兩種方法都能打開對(duì)話框,讓我們給項(xiàng)目命名,選擇開發(fā)板和操作系統(tǒng)(圖 2)。
這將在 SDSoC GUI 左側(cè) Project Explorer 下生成項(xiàng)目。我們在該項(xiàng)目下會(huì)看到以下文件夾,每個(gè)文件夾都有自己唯一的圖標(biāo):
? SDSoC 硬件功能:這里我們能看到轉(zhuǎn)移到硬件的功能。一開始這個(gè)文件夾是空的,等待我們轉(zhuǎn)移。
? Includes:展開這個(gè)文件夾能看到構(gòu)建過程中使用的所有 C/C++ 報(bào)頭文件。
? src:包含演示用源代碼。
為確保我們正確配置所有事項(xiàng),包括 SDSoC 安裝和環(huán)境以及開發(fā)板,我們要構(gòu)建演示,其只在器件片上處理系統(tǒng) (PS) 側(cè)運(yùn)行。
當(dāng)然,下一步就是構(gòu)建項(xiàng)目了。在菜單上選中項(xiàng)目,我們選擇“Project->Build Project”。構(gòu)建時(shí)間不會(huì)太長。完成后,會(huì)看到如圖 3 所示的文件夾出現(xiàn)在 Project Explorer 中的項(xiàng)目下。除了上述文件夾之外,還有:
? 二進(jìn)制文件:這里能找到軟件編譯過程生成的可執(zhí)行連接 (ELF) 文件。
? 歸檔:鏈接對(duì)象文件,創(chuàng)建其中的二進(jìn)制文件。
? SDRelease:包含我們的引導(dǎo)文件和報(bào)告。
我們已經(jīng)構(gòu)建了首個(gè)演示,只能在 Zynq SoC 的 PS 上運(yùn)行,下面我們來看看如何確保其按預(yù)期正常運(yùn)行。對(duì)應(yīng)用進(jìn)行特性分析,明確 SDSoC 加速運(yùn)行。工程師用特性分析信息明確應(yīng)該移動(dòng)哪些功能。
我們用已提供的 sds_lib.h 庫在基本層面進(jìn)行特性分析,這能在 64 位全局計(jì)數(shù)器上獲得基本時(shí)間戳 API,讓我們測出每個(gè)功能的用時(shí)。我們用API 能簡單記錄功能開始和停止時(shí)間,這一時(shí)間差就是整個(gè)過程的執(zhí)行時(shí)間。
源代碼包括兩個(gè)版本的矩陣乘法和加法算法。所謂的黃金版不用于轉(zhuǎn)移到片上可編程邏輯 (PL);另一版則針對(duì)這個(gè)目的。通過在 PS 中構(gòu)建并運(yùn)行,我們能確保有針對(duì)性地對(duì)比,而且兩個(gè)流程執(zhí)行時(shí)間基本相同。
構(gòu)建完成后,我們能拷貝“Project Explorer 下 SDRelease -> sd_card”文件夾中的所有文件到 SD 卡,然后將 SD 卡插到 ZedBoard 上(SD 卡配置的模式引腳要正確設(shè)置)。終端程序連接以及引導(dǎo)序列完成后,我們就要運(yùn)行程序。輸入“/mnt/mult_add.elf”(這里的 mult_add 是我們創(chuàng)建的項(xiàng)目的名稱)。在 ZedBoard 上運(yùn)行,得到如圖 4 所示的結(jié)果,顯示兩個(gè)功能運(yùn)行的時(shí)間基本相同。
驗(yàn)證執(zhí)行時(shí)間基本相同后,我們將乘法函數(shù)移到 SoC 的 PL 側(cè),這步很容易實(shí)現(xiàn)。
分析實(shí)例中 src 目錄的文件結(jié)構(gòu),我們看到:
? main.cpp:這包含主函數(shù)、黃金計(jì)算、時(shí)間戳和器件硬件側(cè)所用的乘法加法函數(shù)調(diào)用。
? mmult.cpp:這包含在硬件部分運(yùn)行的乘法函數(shù)。
? madd.cpp:這包含在硬件部分運(yùn)行的加法函數(shù)。
完成上述步驟后,下次構(gòu)建項(xiàng)目時(shí),SDSoC 鏈接器會(huì)自動(dòng)調(diào)用賽靈思 Vivado HLS 和Vivado 來執(zhí)行 SoC 中 PL 側(cè)的功能。
下一步就是將一個(gè)函數(shù)轉(zhuǎn)移到 SoC 的 PL 側(cè)。我們通過以下兩種方法之一能完成這一任務(wù):
1. 在 Project Explorer 中,我們展開文件,看到文件中的函數(shù),選擇感興趣的函數(shù),右鍵點(diǎn)擊并選擇“Toggle HW/SW [H]”(圖5)。
2. 打開文件并執(zhí)行右側(cè)“outline”標(biāo)簽下的同樣選項(xiàng),這也能顯示函數(shù)(圖 6)。
開關(guān)硬件中加速的 mmult() 函數(shù)能讓 [H] 添加到函數(shù)后面(圖 7)。
我們還會(huì)看到 SDSoC Hardware Functions 下選擇的功能(“Project Explorer”標(biāo)簽中項(xiàng)目下方,圖 8)。這能讓我們方便地看到設(shè)計(jì)中加速的所有功能。
完成上述步驟后,下次構(gòu)建項(xiàng)目時(shí),SDSoC 鏈接器會(huì)自動(dòng)調(diào)用賽靈思 Vivado HLS和Vivado Design Suite 其余部分來執(zhí)行 SoC 中 PL 側(cè)的功能。與此同時(shí),會(huì)創(chuàng)建軟件驅(qū)動(dòng)程序,支持功能加速。我們看到,功能轉(zhuǎn)移到器件 PL 側(cè)是無縫的,而且還會(huì)提高性能。
編譯和生成 SD 卡映像后,我將 mmult() 函數(shù)移到硬件,在 ZedBoard 上運(yùn)行。如圖 9 所示,執(zhí)行時(shí)間(處理器工作循環(huán))只有 52,444 / 183,289 = 0.28,也就是此前期間 PS 側(cè) 183,289 個(gè)處理器工作循環(huán)(執(zhí)行時(shí)間)的 28%(圖 4)??紤]到器件 PS 側(cè)相同功能的性能,我們看到只需簡單點(diǎn)擊鼠標(biāo)就能大幅改進(jìn)執(zhí)行時(shí)間。
這里給出的例子可以直接看出 SDSoC 環(huán)境和緊密集成的 HLS 功能的強(qiáng)大無縫功能。
評(píng)論