Vitis指南 | Xilinx Vitis 系列(一)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
連載目錄
一、Vitis 2019.2 軟件平臺(tái)發(fā)行說(shuō)明
1.1 Vitis 軟件平臺(tái)中的內(nèi)容
1.1.1 硬件加速的應(yīng)用程序開(kāi)發(fā)流程
1.2 改變行為
1.2.1 從SDAccel遷移
1.2.2 從SDSoC遷移
1.3 支持平臺(tái)
1.3.1 數(shù)據(jù)中心加速卡
1.3.2 嵌入式平臺(tái)
二、安裝
三、Vitis 加速環(huán)境簡(jiǎn)介
3.1 簡(jiǎn)介與概述
3.2 FPGA加速
3.3 執(zhí)行模型
3.4 建立過(guò)程
3.4.1 主機(jī)程序構(gòu)建過(guò)程
3.4.2 FPGA二進(jìn)制構(gòu)建過(guò)程
3.5 建立目標(biāo)
3.5.1 軟件仿真
3.5.2 硬件仿真
3.5.3 系統(tǒng)
3.6 使用Vitis軟件平臺(tái)加速應(yīng)用程序的方法論
3.6.1 文件受眾和范圍
3.6.2 加速:工業(yè)類比
3.6.3 設(shè)計(jì)設(shè)備加速應(yīng)用程序的方法
3.6.4 開(kāi)發(fā)C / C ++內(nèi)核的方法論
四、開(kāi)發(fā)應(yīng)用程序
4.1 程序設(shè)計(jì)模型
4.2 主機(jī)申請(qǐng)
4.2.1 設(shè)置OpenCL環(huán)境
4.2.2 在FPGA中執(zhí)行命令
4.2.3 后處理和FPGA清理
4.2.4 摘要
4.3 RTL內(nèi)核
4.3.1 RTL內(nèi)核的要求
4.3.2 RTL內(nèi)核開(kāi)發(fā)流程
4.3.2.1 將RTL代碼打包為Vivado IP
4.3.2.2 創(chuàng)建內(nèi)核描述XML文件
4.3.2.3 從RTL內(nèi)核創(chuàng)建XO文件
4.3.3 RTL內(nèi)核向?qū)?/span>
4.3.4 摘要
五、構(gòu)建和運(yùn)行程序
5.1 設(shè)置Vitis環(huán)境
5.2 建立目標(biāo)
5.2.1 軟件仿真
5.2.2 硬件仿真
5.2.3 系統(tǒng)硬件目標(biāo)
5.3 構(gòu)建主機(jī)程序
5.4 構(gòu)建FPGA二進(jìn)制文件
5.4.1 在Vivado HLS中創(chuàng)建內(nèi)核
六、對(duì)應(yīng)用程序進(jìn)行性能分析,優(yōu)化和調(diào)試
七、使用Vitis分析儀
7.1 處理報(bào)告
7.2 了解葡萄分析儀
7.3 創(chuàng)建運(yùn)行配置
7.4 配置葡萄分析儀
八、使用Vitis IDE
8.1 Vitis命令選項(xiàng)
8.2 創(chuàng)建Vitis IDE項(xiàng)目
8.2??.1 啟動(dòng)Vitis IDE工作區(qū)??
8.2.2 創(chuàng)建一個(gè)應(yīng)用程序項(xiàng)目
8.2.3 管理平臺(tái)和存儲(chǔ)庫(kù)
8.2.4 了解Vitis IDE
8.2.5 添加源
8.2.5.1 添加源文件
8.2.5.2 創(chuàng)建和編輯新的源文件
8.2.5.3 在項(xiàng)目編輯器視圖中工作
8.2.5.4 在助理視圖中工作
8.3 建立系統(tǒng)
8.3.1 Vitis IDE指導(dǎo)視圖
8.3.2 從Vitis IDE使用Vivado工具
8.4 Vitis IDE調(diào)試流程
8.5 配置Vitis IDE
8.5.1 Vitis項(xiàng)目設(shè)置
8.5.2 Vitis Build配置設(shè)置
8.5.3 Vitis運(yùn)行配置設(shè)置
8.5.4 Vitis二進(jìn)制容器設(shè)置
8.5.5 Vitis硬件功能設(shè)置
8.5.6 Vitis工具鏈設(shè)置
8.5.6.1 Vitis內(nèi)核編譯器和鏈接器選項(xiàng)
8.5.6.2 emconfigutil設(shè)置
8.5.6.3 G ++主機(jī)編譯器和鏈接器設(shè)置
8.6 項(xiàng)目進(jìn)出口
8.6.1 導(dǎo)出Vitis項(xiàng)目
8.6.2 導(dǎo)入葡萄項(xiàng)目
正文
一 Vitis 2019.2軟件平臺(tái)發(fā)行說(shuō)明
1.1 Vitis軟件平臺(tái)中的內(nèi)容
1.1.1 硬件加速的應(yīng)用程序開(kāi)發(fā)流程
對(duì)于基于FPGA的加速,Vitis核心開(kāi)發(fā)工具包允許使用API構(gòu)建軟件應(yīng)用程序,比如建立一個(gè)軟件應(yīng)用程序的OpenCL? API,運(yùn)行硬件(HW)內(nèi)核上加速卡,如賽靈思 Alveo數(shù)據(jù)中心加速卡。所述葡萄核心開(kāi)發(fā)套件還支持運(yùn)行運(yùn)行Linux,如嵌入式處理器平臺(tái)上的軟件應(yīng)用ZYNQ的UltraScale +片上多核設(shè)備。對(duì)于嵌入式處理器平臺(tái),Vitis核心開(kāi)發(fā)套件執(zhí)行模型還使用OpenCL API和基于Linux的Xilinx 運(yùn)行時(shí)(XRT),用于調(diào)度硬件內(nèi)核并控制數(shù)據(jù)移動(dòng)。
VItis具包可支持Alove 200,U250,U280和數(shù)據(jù)中心加速卡,還有zcu102_base,zcu104_base,zc702_base和zc706_base嵌入式處理器平臺(tái)。除了這些現(xiàn)成的平臺(tái)以外,還支持自定義平臺(tái)。
通過(guò)Vitis軟件平臺(tái),您可以將數(shù)據(jù)中心應(yīng)用程序遷移到嵌入式平臺(tái)。所述Vitis核心開(kāi)發(fā)工具包括在V++臺(tái)上的硬件內(nèi)核編譯器,g++編譯器用于編譯在x86主機(jī)上運(yùn)行的應(yīng)用,以及ARM®用于交叉編譯應(yīng)用程序到的嵌入式處理器上運(yùn)行的編譯器的Xilinx設(shè)備。
1.2 改變行為
1.2.1 從SDAccel遷移
下表列出了SDAccel開(kāi)發(fā)環(huán)境和Vitis軟件平臺(tái)之間的差異。
1.2.2 從SDSoC遷移
- 總覽
該葡萄的核心開(kāi)發(fā)工具包是仿照SDAccel?編程和執(zhí)行模型。Vitis環(huán)境的一項(xiàng)優(yōu)勢(shì)是它對(duì)數(shù)據(jù)中心和邊緣應(yīng)用程序的支持。這意味著您可以在標(biāo)準(zhǔn)數(shù)據(jù)中心平臺(tái)(例如Alveo?數(shù)據(jù)中心U200加速卡)上對(duì)應(yīng)用程序進(jìn)行原型設(shè)計(jì),然后在可用時(shí)將應(yīng)用程序重定向到邊緣平臺(tái)。有關(guān)更多信息,請(qǐng)參閱構(gòu)建主機(jī)程序。
在Vitis環(huán)境中,您需要調(diào)用Arm交叉編譯器以構(gòu)建主應(yīng)用程序代碼,并調(diào)用Vitis編譯器以構(gòu)建硬件內(nèi)核。您為主機(jī)(.elf)創(chuàng)建一個(gè)可執(zhí)行文件,為硬件內(nèi)核(.xclbin)創(chuàng)建一個(gè)映像。您將使用OpenCL API和基于Linux的Xilinx運(yùn)行時(shí)(XRT)來(lái)控制主應(yīng)用程序和內(nèi)核之間的數(shù)據(jù)移動(dòng),并計(jì)劃任務(wù)的執(zhí)行。
對(duì)于嵌入式處理器平臺(tái)(或項(xiàng)目),Vitis環(huán)境僅支持運(yùn)行Linux主機(jī)操作系統(tǒng)且平臺(tái)已將XRT和ZOCL驅(qū)動(dòng)程序添加到根文件系統(tǒng)的平臺(tái)。平臺(tái)創(chuàng)建者需要提供一個(gè)sysroot,以便通過(guò)OpenCL包含文件和庫(kù)交叉編譯到Arm 核心。在主機(jī)編譯期間,您將需要使用適當(dāng)?shù)臉?biāo)頭。
要從SDSoC環(huán)境遷移到Vitis環(huán)境,您將必須修改構(gòu)建腳本和源代碼。本節(jié)討論遷移步驟,包括命令行示例,這些示例使用sysroot中的文件,使用Vitis編譯器編譯硬件內(nèi)核,并使用Arm cross編譯器編譯主機(jī)應(yīng)用程序。提供的代碼示例僅用于教育目的,不應(yīng)用于您的設(shè)計(jì)。
基本遷移步驟如下:
- 遷移主機(jī)應(yīng)用程序
- 更新所需的#include文件
- 根據(jù)需要編輯主要功能以及任何其他軟件的僅特定功能
- 遷移硬件功能
- 使用編譯指示定義內(nèi)核接口
- 建立系統(tǒng)
- 構(gòu)建和鏈接內(nèi)核
- 編譯和鏈接應(yīng)用程序
- 遷移主機(jī)應(yīng)用程序
在本節(jié)中,您將回顧具有和加速功能的簡(jiǎn)單SDSoC?程序,main()以識(shí)別必須更改的元素。要開(kāi)始將應(yīng)用程序和硬件功能遷移到Vitis環(huán)境平臺(tái)和工具的過(guò)程,請(qǐng)檢查您的主要功能和硬件功能代碼。此處提供的代碼是mmult示例應(yīng)用程序。
以下代碼段是main()原始開(kāi)發(fā)應(yīng)用程序項(xiàng)目中的示例函數(shù)。
#include#include #include "mmult.h" #include "sds_lib.h" #define NUM_TESTS 5 void printMatrix(int *mat, int col, int row) { for (int i = 0; i < col; i++) { for (int j = 0; j < row; j++) { std::cout << mat[i*row+j] << "\t"; } std::cout << std::endl; } std::cout << std::endl; } int main() { int col = BUFFER_SIZE; int row = BUFFER_SIZE; int *matA = (int*)sds_alloc(col*row*sizeof(int)); int *matB = (int*)sds_alloc(col*row*sizeof(int)); int *matC = (int*)sds_alloc(col*row*sizeof(int)); std::cout << "Mat A" << std::endl; printMatrix(matA, col, row); std::cout << "Mat B" << std::endl; printMatrix(matB, col, row); //Run the hardware function multiple times for(int i = 0; i < NUM_TESTS; i++) { std::cout << "Test #: " << i << std::endl; // Populate matA and matB srand(time(NULL)); for (int i = 0; i < col*row; i++) { matA[i] = rand()%10; matB[i] = rand()%10; } std::cout << "MatA * MatB" << std::endl; mmult(matA, matB, matC, col, row); } printMatrix(matC, col, row); return 0;
該代碼為存儲(chǔ)為一維數(shù)組的三個(gè)不同的二維矩陣分配內(nèi)存matA,matB使用隨機(jī)數(shù)填充和 ,然后相乘matA并matB計(jì)算 matC。結(jié)果打印到屏幕上,測(cè)試運(yùn)行十次。
轉(zhuǎn)到Vitis環(huán)境sds++時(shí),需要由應(yīng)用程序開(kāi)發(fā)人員顯式管理由編譯器和運(yùn)行時(shí)隱式處理的一些任務(wù)。
- 遷移硬件功能
從SDSoC?環(huán)境遷移硬件功能以用于Vitis環(huán)境時(shí),需要記住的內(nèi)容很少。
為了在PL中執(zhí)行,現(xiàn)在將硬件功能單獨(dú)編譯為.xo文件,因此它不包含在main()函數(shù)中,并且不需要像SDSoC環(huán)境中那樣的用于函數(shù)定義的特定頭文件。在丟棄頭文件之前,必須將BUFFER_SIZE聲明復(fù)制 到mmult函數(shù)中。您還可以評(píng)論或刪除該 #include語(yǔ)句。
- 建立系統(tǒng)
在SDSoC?環(huán)境中,sds++編譯器同時(shí)構(gòu)建主應(yīng)用程序(.elf)和硬件加速功能(PL區(qū)域的位流)。在簡(jiǎn)單的示例中,用于編譯main()函數(shù)和mmult硬件函數(shù)的命令行如下:
sds++ -Wall -O0 -g -I"../src" -c -fmessage-length=0 -MT"src/mmult.o" -MMD \ -MP -MF"src/mmult.d" -MT"src/mmult.o" -o "src/mmult.o" "../src/mmult.cpp" \ -sds-hw mmult mmult.cpp -sds-end -sds-sys-config a53_linux -sds-proc \ a53_linux -sds-pf "zcu102"
從該單個(gè)命令中,該sds++命令處理該sds-hw塊以編譯mmult函數(shù),然后再鏈接main.o對(duì)象文件以構(gòu)建目標(biāo)應(yīng)用程序main.elf。最后,它將生成sd_card文件夾,其中包含啟動(dòng)和運(yùn)行應(yīng)用程序所需的適當(dāng)文件。
在Vitis環(huán)境中,硬件內(nèi)核和主要應(yīng)用程序的編譯由兩個(gè)單獨(dú)的編譯器執(zhí)行。
- 高級(jí)主題:多個(gè)計(jì)算單元和內(nèi)核流
1.3 支持平臺(tái)
1.3.1 數(shù)據(jù)中心加速卡
Xilinx提供了幾種可用于數(shù)據(jù)中心的加速卡:
- Alveo U50數(shù)據(jù)中心加速卡
- Alveo U200數(shù)據(jù)中心加速卡
- Alveo U250數(shù)據(jù)中心加速卡
- Alveo U280數(shù)據(jù)中心加速卡
有關(guān)每個(gè)加速卡和可用目標(biāo)平臺(tái)的規(guī)格,請(qǐng)參閱數(shù)據(jù)中心加速卡。
1.3.2 嵌入式平臺(tái)
不支持 Artix®-7,Kintex®-7,Virtex®-7以及裸機(jī)和RTOS平臺(tái)進(jìn)行加速。對(duì)于基于非加速的設(shè)計(jì),請(qǐng)參見(jiàn)《Vitis Unified軟件平臺(tái)文檔:嵌入式軟件開(kāi)發(fā)(UG1400)》。
下面列出了可與Vitis核心開(kāi)發(fā)套件一起使用的嵌入式平臺(tái),可以在Xilinx官網(wǎng)上找到它們。
- zcu102_base:基于ZCU102 Zynq UltraScale + MPSoC和XRT。
- zcu104_base:基于ZCU104 Zynq UltraScale + MPSoC和XRT。
- zc702_base:基于ZC702Zynq®- 7000SoC 和XRT。
- zc706_base:基于ZC706Zynq®- 7000SoC 和XRT。
二、安裝
三、Vitis 加速環(huán)境簡(jiǎn)介
3.1 簡(jiǎn)介與概述
Vitis unified 軟件是一個(gè)將Xilinx軟件開(kāi)發(fā)的各個(gè)方面結(jié)合到一個(gè)統(tǒng)一環(huán)境中的新工具。Vitis軟件平臺(tái)既支持Vitis嵌入式軟件開(kāi)發(fā)流程,也支持Vitis應(yīng)用程序加速開(kāi)發(fā)流程,Vitis嵌入式軟件開(kāi)發(fā)流程是為希望使用下一代技術(shù)的Xilinx軟件開(kāi)發(fā)工具包(SDK)用戶設(shè)計(jì)的,Vitis應(yīng)用程序加速開(kāi)發(fā)流程是為希望使用最新的Xilinx FPGA軟件加速開(kāi)發(fā)流程的軟件開(kāi)發(fā)人員設(shè)計(jì)的。該內(nèi)容主要涉及應(yīng)用程序加速流,以及Vitis核心開(kāi)發(fā)工具包和Xilinx運(yùn)行時(shí)(XRT)的使用。
Vitis應(yīng)用程序加速開(kāi)發(fā)流程為使用軟件和硬件組件的標(biāo)準(zhǔn)編程語(yǔ)言開(kāi)發(fā)和交付FPGA加速應(yīng)用程序提供了一個(gè)框架。軟件組件或主機(jī)程序是使用C/ c++開(kāi)發(fā)的,可以在x86或嵌入式處理器上運(yùn)行,并使用OpenCL API調(diào)用來(lái)管理與加速器的運(yùn)行時(shí)交互??梢允褂肅/ c++、OpenCL C或RTL開(kāi)發(fā)硬件組件或內(nèi)核。Vitis軟件平臺(tái)支持各種方法,允許您從開(kāi)發(fā)應(yīng)用程序或內(nèi)核開(kāi)始。
下圖是Vitis軟件平臺(tái)示意圖。如圖所示,Vitis 統(tǒng)一軟件平臺(tái)包含以下功能和元素:
- Vitis技術(shù)的目標(biāo)是加速硬件平臺(tái),例如Alveo?數(shù)據(jù)中心加速器卡或Zynq®UltraScale +?MPSoC和基于Zynq®-7000SoC的嵌入式處理器平臺(tái)。
- XRT為您的宿主程序提供了API和驅(qū)動(dòng)程序,以使其與目標(biāo)平臺(tái)連接,并處理宿主程序和加速內(nèi)核之間的事務(wù)。
- Vitis核心開(kāi)發(fā)套件提供了軟件開(kāi)發(fā)工具堆棧(例如編譯器和交叉編譯器),用于構(gòu)建主機(jī)程序和內(nèi)核代碼;分析器(可讓您分析和分析應(yīng)用程序的性能);調(diào)試器(可幫助您定位和修復(fù)任何問(wèn)題)您的應(yīng)用程序中的問(wèn)題。
- Vitis加速庫(kù)通過(guò)最少的代碼更改即可提供性能優(yōu)化的FPGA加速,而無(wú)需重新實(shí)現(xiàn)算法即可利用Xilinx自適應(yīng)計(jì)算的優(yōu)勢(shì)。Vitis加速庫(kù)可用于數(shù)學(xué),統(tǒng)計(jì),線性代數(shù)和DSP的常用功能,也可用于特定領(lǐng)域的應(yīng)用程序,例如視覺(jué)和圖像處理,定量財(cái)務(wù),數(shù)據(jù)庫(kù),數(shù)據(jù)分析和數(shù)據(jù)壓縮。有關(guān)Vitis加速庫(kù)的更多信息,請(qǐng)參見(jiàn)Xilinx github庫(kù),https://xilinx.github.io/Vitis_Libraries/。
3.2 FPGA加速
與傳統(tǒng)的CPU / GPU加速相比,Xilinx FPGA具有許多優(yōu)勢(shì),包括能夠?qū)崿F(xiàn)可在處理器上運(yùn)行的任何功能的自定義架構(gòu),從而以較低的功耗實(shí)現(xiàn)了更好的性能。與處理器體系結(jié)構(gòu)相比,在Xilinx器件中包含可編程邏輯(PL)架構(gòu)的結(jié)構(gòu)在應(yīng)用程序執(zhí)行中實(shí)現(xiàn)了高度的并行性。
為了在Xilinx器件上實(shí)現(xiàn)軟件加速的優(yōu)勢(shì),可以考慮在硬件中加速應(yīng)用程序的大型計(jì)算密集型部分。在自定義硬件中實(shí)現(xiàn)這些功能可以使您在性能和功耗之間達(dá)到理想的平衡。
有關(guān)如何構(gòu)建具有最佳性能的應(yīng)用程序以及其他推薦設(shè)計(jì)技術(shù)的更多信息,請(qǐng)查看使用Vitis軟件平臺(tái)加速應(yīng)用程序的方法。
3.3 執(zhí)行模型
在Vitis核心開(kāi)發(fā)套件中,應(yīng)用程序在主機(jī)應(yīng)用程序和硬件加速的內(nèi)核之間分割,并在它們之間建立通信通道。使用C / C ++編寫(xiě)并使用API抽象(例如OpenCL)的主機(jī)程序在主機(jī)處理器(例如x86服務(wù)器或 用于嵌入式平臺(tái)的Arm處理器)上運(yùn)行,而硬件加速的內(nèi)核則在主機(jī)的可編程邏輯(PL)區(qū)域內(nèi)運(yùn)行。一個(gè)賽靈思設(shè)備。
由XRT管理的API調(diào)用用于處理主機(jī)程序和硬件加速器之間的事務(wù)。主機(jī)和內(nèi)核之間的通信(包括控制和數(shù)據(jù)傳輸)通過(guò)PCIe®總線或嵌入式平臺(tái)的AXI總線進(jìn)行。當(dāng)控制信息在硬件中的特定內(nèi)存位置之間傳輸時(shí),全局內(nèi)存用于在主機(jī)程序和內(nèi)核之間傳輸數(shù)據(jù)。主機(jī)處理器和硬件加速器均可訪問(wèn)全局內(nèi)存,而主機(jī)應(yīng)用程序只能訪問(wèn)主機(jī)內(nèi)存。
例如,在典型的應(yīng)用程序中,主機(jī)首先將要由內(nèi)核操作的數(shù)據(jù)從主機(jī)內(nèi)存?zhèn)鬏數(shù)饺謨?nèi)存。內(nèi)核隨后對(duì)數(shù)據(jù)進(jìn)行操作,將結(jié)果存儲(chǔ)回全局內(nèi)存中。內(nèi)核完成后,主機(jī)將結(jié)果傳輸回主機(jī)內(nèi)存。主機(jī)和全局內(nèi)存之間的數(shù)據(jù)傳輸會(huì)引入延遲,這可能會(huì)給整個(gè)應(yīng)用程序帶來(lái)巨大的成本。為了在實(shí)際系統(tǒng)中實(shí)現(xiàn)加速,硬件加速內(nèi)核所獲得的好處必須超過(guò)數(shù)據(jù)傳輸所增加的延遲。
Vitis核心開(kāi)發(fā)套件應(yīng)用程序的體系結(jié)構(gòu)
目標(biāo)平臺(tái)包含F(xiàn)PGA加速內(nèi)核,全局存儲(chǔ)器以及用于存儲(chǔ)器傳輸?shù)闹苯哟鎯?chǔ)器訪問(wèn)(DMA)。內(nèi)核可以具有一個(gè)或多個(gè)全局存儲(chǔ)器接口,并且是可編程的。該葡萄的核心開(kāi)發(fā)工具包執(zhí)行模型可以分解為以下步驟:
- 1.主機(jī)程序通過(guò)Alveo數(shù)據(jù)中心加速器卡上的PCIe接口,或通過(guò)嵌入式平臺(tái)上的AXI總線,將內(nèi)核所需的數(shù)據(jù)寫(xiě)入連接的設(shè)備的全局存儲(chǔ)器中。
- 12.主機(jī)程序使用其輸入?yún)?shù)設(shè)置內(nèi)核。
- 13.主機(jī)程序觸發(fā)FPGA上內(nèi)核功能的執(zhí)行。
- 14.內(nèi)核根據(jù)需要執(zhí)行所需的計(jì)算,同時(shí)從全局內(nèi)存中讀取數(shù)據(jù)。
- 15.內(nèi)核將數(shù)據(jù)寫(xiě)回到全局內(nèi)存,并通知主機(jī)它已完成任務(wù)。
- 16.主機(jī)程序?qū)?shù)據(jù)從全局存儲(chǔ)器讀回主機(jī)存儲(chǔ)器,并根據(jù)需要繼續(xù)處理。
FPGA可以在加速器上容納多個(gè)內(nèi)核實(shí)例,不同類型的內(nèi)核以及同一內(nèi)核的多個(gè)實(shí)例。XRT透明地協(xié)調(diào)了主機(jī)程序和加速器中內(nèi)核之間的交互。Xilinx Github存儲(chǔ)庫(kù)上提供了XRT體系結(jié)構(gòu)文檔,https://xilinx.github.io/XRT/。
3.4 建立過(guò)程
Vitis的核心開(kāi)發(fā)工具包提供了所有標(biāo)準(zhǔn)的軟件開(kāi)發(fā)環(huán)境的特點(diǎn):
- 在x86或Arm®處理器上運(yùn)行的主機(jī)應(yīng)用程序的編譯器或交叉編譯器。
- 交叉編譯器,用于構(gòu)建FPGA二進(jìn)制文件。
- 調(diào)試環(huán)境可幫助識(shí)別和解決代碼中的問(wèn)題。
- 性能分析器可識(shí)別瓶頸并幫助您優(yōu)化應(yīng)用程序。
構(gòu)建過(guò)程遵循主機(jī)程序和內(nèi)核代碼的標(biāo)準(zhǔn)編譯和鏈接過(guò)程。如下圖所示,主機(jī)程序是使用GNU C ++編譯器(g++)或GNU C ++ Arm交叉編譯器為基于MPSoC的設(shè)備構(gòu)建的。FPGA二進(jìn)制文件是使用Vitis編譯器構(gòu)建的。
3.4.1 主機(jī)程序構(gòu)建過(guò)程
主應(yīng)用程序g++通過(guò)以下兩步過(guò)程進(jìn)行編譯并與編譯器鏈接:
- 1.將任何所需的代碼編譯到目標(biāo)文件(.o)中。
- 2.將對(duì)象文件(.o)與XRT共享庫(kù)鏈接以創(chuàng)建可執(zhí)行文件。
3.4.2 FPGA二進(jìn)制構(gòu)建過(guò)程
內(nèi)核可以用C / C ++或OpenCL C代碼描述,也可以從打包的RTL設(shè)計(jì)中創(chuàng)建。如上圖所示,每個(gè)硬件內(nèi)核都獨(dú)立編譯為Xilinx目標(biāo)(.xo)文件。
Xilinx對(duì)象(.xo)文件與硬件平臺(tái)鏈接,以創(chuàng)建FPGA二進(jìn)制文件(.xclbin),該文件已加載到目標(biāo)平臺(tái)上的Xilinx設(shè)備中。
構(gòu)建FPGA二進(jìn)制文件的關(guān)鍵是確定要生成的構(gòu)建目標(biāo)。有關(guān)更多信息,請(qǐng)參閱構(gòu)建目標(biāo)。
有關(guān)構(gòu)建過(guò)程的詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)構(gòu)建FPGA二進(jìn)制文件。
3.5 建立目標(biāo)
Vitis編譯器生成過(guò)程生成主機(jī)程序可執(zhí)行文件和FPGA二進(jìn)制(.xclbin)。FPGA二進(jìn)制文件的性質(zhì)由構(gòu)建目標(biāo)確定。
- 當(dāng)構(gòu)建目標(biāo)是軟件或硬件仿真時(shí),Vitis編譯器會(huì)生成FPGA二進(jìn)制文件中內(nèi)核的仿真模型。這些仿真目標(biāo)使您可以在相對(duì)較快的周期內(nèi)構(gòu)建,運(yùn)行和迭代設(shè)計(jì)。調(diào)試應(yīng)用程序并評(píng)估性能。
- 當(dāng)構(gòu)建目標(biāo)是硬件系統(tǒng)時(shí),Vitis編譯器使用Vivado Design Suite運(yùn)行綜合和實(shí)現(xiàn),從而為硬件加速器生成.xclbin 。它使用這些工具進(jìn)行預(yù)定義的設(shè)置,這些設(shè)置被證明可以提供良好的結(jié)果質(zhì)量。使用Vitis核心開(kāi)發(fā)套件不需要這些工具的知識(shí)。但是,精通硬件的開(kāi)發(fā)人員可以充分利用這些工具,并使用所有可用功能來(lái)實(shí)現(xiàn)內(nèi)核。
Vitis編譯器提供了三種不同的構(gòu)建目標(biāo),用于調(diào)試和驗(yàn)證目的的兩個(gè)仿真目標(biāo),用來(lái)產(chǎn)生實(shí)際的FPGA二進(jìn)制文件的默認(rèn)硬件目標(biāo):
- 軟件仿真(sw_emu)
主機(jī)應(yīng)用程序代碼和內(nèi)核代碼都被編譯為在主機(jī)處理器上運(yùn)行。這樣可以通過(guò)快速的構(gòu)建和運(yùn)行循環(huán)來(lái)優(yōu)化迭代算法。該目標(biāo)對(duì)于識(shí)別語(yǔ)法錯(cuò)誤,對(duì)與應(yīng)用程序一起運(yùn)行的內(nèi)核代碼執(zhí)行源代碼級(jí)調(diào)試以及驗(yàn)證系統(tǒng)的行為很有用。
- 硬件仿真(hw_emu)
內(nèi)核代碼被編譯成硬件模型(RTL),該模型在專用模擬器中運(yùn)行。這種構(gòu)建和運(yùn)行循環(huán)需要更長(zhǎng)的時(shí)間,但可以提供詳細(xì)的,周期精確的內(nèi)核活動(dòng)視圖。該目標(biāo)對(duì)于測(cè)試將在FPGA中使用的邏輯功能以及獲得初始性能估計(jì)非常有用。
- 系統(tǒng)(hw)
內(nèi)核代碼被編譯成硬件模型(RTL),然后在FPGA上實(shí)現(xiàn),從而產(chǎn)生可以在實(shí)際FPGA上運(yùn)行的二進(jìn)制文件。
3.6 使用Vitis軟件平臺(tái)加速應(yīng)用程序的方法論
3.6.1 文件受眾和范圍
本指南的目的是使系統(tǒng)設(shè)計(jì)師和軟件開(kāi)發(fā)人員熟悉以下內(nèi)容:
- 架構(gòu)設(shè)備加速應(yīng)用程序的方法
- 開(kāi)發(fā)C / C ++內(nèi)核的方法
3.6.2 加速:工業(yè)類比
CPU,GPU和可編程設(shè)備之間存在明顯差異。了解這些差異是有效開(kāi)發(fā)每種設(shè)備的應(yīng)用程序并實(shí)現(xiàn)最佳加速的關(guān)鍵。
CPU和GPU均具有預(yù)定義的體系結(jié)構(gòu),具有固定數(shù)量的內(nèi)核,固定指令集和剛性內(nèi)存體系結(jié)構(gòu)。GPU通過(guò)內(nèi)核數(shù)量和采用SIMD / SIMT并行性來(lái)擴(kuò)展性能。相反,可編程設(shè)備是完全可定制的體系結(jié)構(gòu)。開(kāi)發(fā)人員創(chuàng)建針對(duì)應(yīng)用程序需求進(jìn)行了優(yōu)化的計(jì)算單元。通過(guò)創(chuàng)建深度流水線化的數(shù)據(jù)路徑來(lái)實(shí)現(xiàn)性能,而不是乘以計(jì)算單元的數(shù)量。
可以將CPU視為一組研討會(huì),每個(gè)研討會(huì)都雇用一名非常熟練的工人。這些工人可以使用通用工具,使他們可以構(gòu)建幾乎所有東西。每個(gè)工人一次制作一件商品,先后使用不同的工具將原材料變成成品。此順序轉(zhuǎn)換過(guò)程可能需要許多步驟,具體取決于任務(wù)的性質(zhì)。講習(xí)班是獨(dú)立的,工人都可以完成不同的任務(wù),而不會(huì)分散注意力或出現(xiàn)協(xié)調(diào)問(wèn)題。
GPU也有車間和工人,但其中有很多,工人也更專業(yè)。他們只能訪問(wèn)特定的工具,只能做更少的事情,但是他們做得非常有效。當(dāng)GPU工人重復(fù)執(zhí)行相同的幾個(gè)任務(wù),并且所有人都同時(shí)執(zhí)行相同的事情時(shí),它們的功能最佳。畢竟,在有這么多不同的工人的情況下,給他們所有相同的訂單會(huì)更有效率。
可編程設(shè)備使這個(gè)車間類似于工業(yè)時(shí)代。如果CPU和GPU是一組單獨(dú)的工人,并采取順序步驟將輸入轉(zhuǎn)換為輸出,則可編程設(shè)備是具有裝配線和傳送帶的工廠。沿組裝線分派的工人將原材料逐步轉(zhuǎn)變?yōu)橹瞥善?。每個(gè)工人重復(fù)執(zhí)行相同的任務(wù),并且部分成品在傳送帶上從一個(gè)工人轉(zhuǎn)移到另一個(gè)工人。這導(dǎo)致更高的生產(chǎn)吞吐量。
可編程設(shè)備的另一個(gè)主要區(qū)別是工廠和裝配線不存在,這與CPU和GPU的車間和工人不同。為了完善我們的類比,可編程設(shè)備就像是一批待開(kāi)發(fā)的空批。這意味著設(shè)備開(kāi)發(fā)人員可以建立工廠,裝配線和工作站,然后針對(duì)所需任務(wù)自定義它們,而不必使用通用工具。就像批量一樣,設(shè)備的房地產(chǎn)也不是無(wú)限的,這限制了可以在設(shè)備中建立工廠的數(shù)量和規(guī)模。因此,正確設(shè)計(jì)和配置這些工廠是設(shè)備編程過(guò)程的關(guān)鍵部分。
傳統(tǒng)的軟件開(kāi)發(fā)是關(guān)于在預(yù)定義的體系結(jié)構(gòu)上進(jìn)行編程的功能??删幊淘O(shè)備開(kāi)發(fā)是關(guān)于對(duì)體系結(jié)構(gòu)進(jìn)行編程以實(shí)現(xiàn)所需功能。
3.6.3 設(shè)計(jì)設(shè)備加速應(yīng)用程序的方法
在開(kāi)始開(kāi)發(fā)加速應(yīng)用程序之前,正確地架構(gòu)它很重要。在此階段,開(kāi)發(fā)人員將對(duì)應(yīng)用程序的體系結(jié)構(gòu)做出關(guān)鍵決策,并確定諸如應(yīng)將哪些軟件功能映射到設(shè)備內(nèi)核,需要多少并行性以及如何交付并行化等因素。
- 步驟1:建立基準(zhǔn)應(yīng)用程序性能并建立目標(biāo)
- 步驟2:確定要加速的功能
- 步驟3:確定設(shè)備并行化需求
- 步驟4:確定軟件應(yīng)用程序并行化需求
- 步驟5:細(xì)化建筑細(xì)節(jié)
3.6.4 開(kāi)發(fā)C / C ++內(nèi)核的方法論
Vitis軟件平臺(tái)支持建模內(nèi)核用C / C ++或RTL(的Verilog,VHDL,系統(tǒng)的Verilog)。本方法指南適用于C / C ++內(nèi)核。有關(guān)開(kāi)發(fā)RTL內(nèi)核的詳細(xì)信息,請(qǐng)參見(jiàn)RTL內(nèi)核。
關(guān)于高級(jí)綜合編譯器
在開(kāi)始內(nèi)核開(kāi)發(fā)過(guò)程之前,開(kāi)發(fā)人員應(yīng)該熟悉高級(jí)綜合(HLS)概念。HLS編譯器將C / C ++代碼轉(zhuǎn)換為RTL設(shè)計(jì),然后將其映射到設(shè)備結(jié)構(gòu)上。
HLS編譯器比標(biāo)準(zhǔn)軟件編譯器更具限制性。例如,存在不支持的構(gòu)造,包括:系統(tǒng)函數(shù)調(diào)用,動(dòng)態(tài)內(nèi)存分配和遞歸函數(shù)。有關(guān)更多信息,請(qǐng)參見(jiàn)《Vivado Design Suite用戶指南:高級(jí)綜合(UG902)》中的“不受支持的C構(gòu)造” 。
更重要的是,請(qǐng)始終牢記C / C ++源代碼的結(jié)構(gòu)會(huì)對(duì)所生成的硬件實(shí)現(xiàn)的性能產(chǎn)生重大影響。該方法指南將幫助您構(gòu)建代碼,以滿足應(yīng)用程序吞吐量的目標(biāo)。有關(guān)編程內(nèi)核的特定信息,請(qǐng)參見(jiàn)C / C ++內(nèi)核。
- 步驟1:將代碼劃分為負(fù)載計(jì)算-存儲(chǔ)模式
- 步驟2:將計(jì)算塊劃分為較小的函數(shù)
- 步驟3:確定需要優(yōu)化的循環(huán)
- 步驟4:改善循環(huán)延遲
- 步驟5:提高環(huán)路吞吐量





