|
MicroZed專欄:統一軟體平台 Vitis 示例應用詳解
編者註:本內容轉載自MicroZed 發展歷程記錄,得到作者和 Hackster.io的許可。
上個星期我們完成了用於 Ultra96 的 Vitis 加速平台的創建工作,並為講解開發流程創建了一個示例應用。
創建的示例應用是一個相當簡單的向量加法。編譯完成後,Vitis 將運行應用所需的所有文件提供在硬體構建結構下的 sd_card 目錄中。
在這個目錄中,用戶將會看到加載到可編程邏輯中的 boot.bin、內核鏡像、向量加法應用和二進制容器,以及我們在硬體上運行示例應用所需的一切。
應用本身的運行十分簡單。首先是從 SD_Card 目錄將文件複製到 SD 卡,然後啟動 Ultra96 V2。

圖文:SD 卡内容
在 Ultra96 成功啟動後,我們需要更改目錄,才能訪問 SD 卡上的文件,以運行示例應用。
將目錄更改為如下路徑:

現在,我們在正確的目錄下,在運行示例應用前,我們需要導出賽靈思運行時的位置。

要運行示例應用,我們接下來只需將程序名稱定義為 argv0 並提供 XCLBIN 的名稱。

設置並運行向量加法示例

圖文:設置並運行向量加法示例
下面我們略為詳細地了解一下示例應用的構成。
該示例應用由兩個源文件構成:
• vadd.cpp — 包含主機應用,運行在 MPSoC 中的 Arm Cortex A53 核心上。
• krnl_vadd.cpp — 包含可在可編程邏輯中實現的內核。內核使用高層次綜合(HLS)實現。
主機應用
主機應用的作用是配置內核,並對內核進行生命週期管理。
生命週期管理的第一步是確保找到平台與器件:

在完成平台與器件的定位後,接下來是加載 XCLBIN 文件。
這個階段的第一步是為目標器件創建 OpenCL 環境並建立命令隊列。命令隊列有助於實現主機與器件之間的通信。這樣主機就能向 OpenCL 器件發布需要執行的命令。

命令隊列創建完成後,下一步是加載 XCLBIN 文件。
使用 OpenCL 存儲模型與內核接口連接。針對器件定義指令,如 buffer_a 和 buffer_b 對內核只讀,buffer_result 對內核只寫。

這些緩存在全局存儲器內進行分配。如果不太熟悉,OpenCL 存儲器的結構組成如下:
• 主機存儲器 — 僅主機能夠訪問。
• 全局存儲器 — 主機和內核均能訪問,是主機和內核間傳輸數據的主要媒介。
• 恆定全局存儲器 — 主機和內核均能訪問。但僅有主機能讀寫,內核僅為只讀。
• 本地存儲器 — 內核用於計算與存儲,主機不能直接訪問。
• 專用存儲器 — 供內核內部的任務使用,其他任務不能訪問該存儲區。也不支持主機直接訪問。
緩存創建完成後,需要對它們進行映射,以便主機應用訪問緩存。

最後在輸入數據設置完畢後,我們就可以運行內核。要運行內核,我們需要將輸入數據傳遞給緩存,啟動內核,然後從緩存傳遞出輸出數據。

在內核運行完成後,執行工作的下一步是清理軟體,釋放分配的緩存。
內核實現方案
仔細查看內核實現方案,您會發現它與正常的高層次綜合設計非常相似。
首先要注意的是接口。內核有四路輸入,其中兩個是輸入向量、一個是結果向量、還有一個輸入定義的是待處理的向量數量。

定義輸入和輸出向量數據的目的是方便實現使用 HLS INTERFACE 編譯指示的 AXI 存儲器映射端口等,同時對 IP 塊控制與向量大小進行配置,以實現在 AXI Lite 接口內。
代碼主體相當簡單,使用嵌套for循環讀取數據輸入,完成相加並寫回結果。
為了在可編程邏輯中優化內核的性能,這些循環被流水線化,讓初始間距為 1。也就是處理新輸入數據需等待一個時鐘週期。

現在我們已經了解了平台的創建過程,並知曉了主機和內核源代碼的相關內容,我們需要進一步了解 Vitis 流程,才能創建屬於我們自己的應用。
接下來我們將向您介紹如何為各種應用創建 Vitis 加速應用,因為我們已經了解到創建工作有多麼簡單!
如您對本項目感興趣,需要查看我的 FPGA/SoC 項目,獲取代碼,訪問 MicroZed 發展歷程記錄檔案,其中有 300 多篇有關 FPGA/Zynq/Zynq MpSoC 的文章
閱讀原文
|