1. 程式人生 > >SDSoC軟硬體協同設計流程系列——2.SDSoC使用

SDSoC軟硬體協同設計流程系列——2.SDSoC使用

SDSoC使用

初次使用SDSoC

儘管SDSoC支援在Windows主機上開發Linux應用,但是建立SDSoC Platform需要一臺Linux主機,本書會在其他部分介紹如何在Ubuntu系統上安裝SDSoC。在Windows上安裝SDSoC比較簡單,因此不做介紹。指定SDSoC工作區 第一次開啟SDSoC後會彈出一個介面要求指定工作區,SDx工作區是一個資料夾,用於儲存專案,原始檔和編譯時產生的中間結果。您可以為每個專案定義單獨的工作區,或者為不同型別的專案分配工作區。勾選Use this as the default and do not ask again指定當前的資料夾為SDSoC的預設工作區,日後可以在File ->Switch Workspace中更改

新建SDSoC工程

新建SDSoC工程 在Project Explorer的空白處右鍵New->SDx Project即可新建工程,SDx有三種工程型別:

  • Application Project:一個Software Application,可以將部分函式放進PL部分加速。
  • System Project:包含了多個Application Project以支援不同的應用和硬體加速器。
  • Platform Project:定義SDSoC的軟硬體平臺。

在這裡我們選擇Application Project點選Next,然後指定一個工程名稱,在這裡我們暫定為lab1,點選Next。下面我們就進入選擇Platform的對話方塊。 選擇SDSoC Platform

將我們提供的PYNQ的board_file資料夾複製到XILINX_VIVADO/data/boards/board_files路徑下,PYNQ的SDSoC Platform複製到XILINX_SDX/platforms/路徑下。一個SDSoC Platform包含DSA(Device Support Archive)檔案,定義了硬體平臺的設計、介面,以及軟體平臺,包括OS的boot檔案以及runtime檔案。在編譯過程中SDSoC會呼叫Vivado從dsa檔案讀取平臺資訊復現硬體平臺,因此需要提供板卡的board_file,後面會介紹如何自己搭建Platform。在這裡我們選擇PYNQ platform然後點選Next。 然後進入System Configuration對話方塊,下面有三個選項。

  • Software Platform:用來選擇應用執行在什麼作業系統上,是Linux,FreeRTOS還是standalone(裸機),工程使用的是什麼型別的程式碼(C/C++還是OpenCL)。
  • Domain用來選擇系統執行在哪個核心上,我們提供的PYNQ Platform搭載了Linux系統,執行在兩顆Cortex-A9核心上。有些板卡可能有其他核心,比如ZCU102上搭載的ZU9CG上除了四顆Cortex-A53核心,還有兩顆Cortex-R5核心,ZCU102的FreeRTOS系統就執行在兩顆R5核心上。
  • Additional Settings:有兩個選項,一個是Linux Root File System,後面會講到這個選項的作用。另一個是Output Type,選擇Executable,專案最終會生成一個可執行檔案,需要程式碼中有一個main函式,而選擇shared library,專案最終會生成一個.so檔案,具體如何使用後面會詳細介紹。這裡我們選擇Executable,點選Next。 現在進入了Templates對話方塊,目前PYNQ的Platform並沒有提供Example,點選Next,進入預設介面。專案被安排在一系列不同的視窗和編輯器檢視中,也稱為IDE中的介面。開啟SDx工具,如圖所示,預設介面上半部分從左至右,分別是專案資源管理器、專案編輯器、大綱,下半部分從左至右,分別是報告,控制檯以及目標連線,相信熟悉Eclipse的讀者看到這個介面並不陌生。 SDSoC預設介面

匯入原始碼

在SDSoC中開啟工程後,可以將原始碼匯入到工程中,右鍵src資料夾,點選Import。Import對話方塊允許您指定獲取檔案的來源,包括從壓縮包,已經存在的工程,檔案系統以及Git資料夾。我們在這裡選擇從檔案系統中匯入,點選File System,在From directory一欄輸入$XILINX_SDX /samples/mmultadd,注意不要匯入description.json和Makefile檔案,這兩個檔案工具可以自動生成。 從檔案系統中匯入原始碼

Profiling

在選擇硬體加速函式之前,我們需要大致瞭解整個演算法各部分消耗多少時間,SDSoC工具提供了Profiling工具,可以自動分析演算法各部分消耗了多少時間。首先新建一個Application工程命名為profiling,將我們提供的程式碼匯入到src資料夾下,在Debug模式下編譯程式碼。 將PYNQ與電腦連線在同一個路由器下,並將PYNQ的MicroUSB介面連線到電腦。點選SDx介面右下角的Target Connection->Linux TCF Agent-> Linux Agent [default],彈出Target Connection對話方塊,Host一欄輸入PYNQ的IP地址,點選Test Connection,如果看到Connection Successful對話方塊則說明連線成功。 配置Linux TCF 右鍵小蜘蛛,選擇System Debugger using Debug_Profiling.elf on Linux Agent,點選OK進入Debug模式。 啟動Debug 使能TCF Profiler,Windows->Show View->Other->Debug->TCF Profiler 使能TCF Profiler 點選TCF下綠色三角箭頭,彈出TCF Profiler啟動介面,勾選Enable stack tracing,點選OK,按F8啟動程式 啟動TCF Profiler 等待程式執行一段時間,可以看到Profiler顯示各函式執行的時間: TCF Profiler顯示各程式執行時間

選擇硬體加速函式

建立硬體加速SoC的第一項主要任務是確定應用程式的哪些部分適合在硬體中實現,即將這部分程式碼放在PL中執行將顯著提升整體效能,在上一小節我們介紹瞭如何找到演算法中計算量最大的部分。當您已經決定哪個函式放到硬體進行加速之後,有兩種方法指定用於硬體加速函式。

  • 方法1 雙擊project.sdx檔案進入Application Project Settings如下圖所示。點選Hardware Func-tion一欄最右側的橙色閃電按鈕,可以顯示當前工程中的候選函式(可能被用來硬體加速的函式),按住ctrl鍵選擇madd和mmult兩個函式作為硬體加速函式。 新增硬體加速函式對話方塊
  • 方法2 切換硬體/軟體 點選硬體加速函式所在的.cpp檔案左側的小箭頭,找到用於硬體加速的函式,右鍵點選Toggle HW/SW,這一步是切換某函式是放在軟體中執行還是硬體中執行。指定硬體加速函式後的使用者介面如上圖所示。注意,用於硬體加速的函式需要特定的寫法,並不是所有函式都可以被指定為硬體加速函式。硬體加速函式應該編寫如何並不是本書的主要內容,會在後面簡要介紹。這部分內容請參考UG871,UG902以及Xilinx大學計劃翻譯的HLS手冊https://github.com/xupsh/pp4fpgas-cn-hls

選擇硬體加速函式的頻率

選擇硬體功能後,還需要選擇硬體加速函式和資料傳輸網路的時鐘頻率。硬體加速函式需要通過CPU從DDR中讀取資料,這項工作由專門的硬體——DMA來完成,因此也要指定這部分的頻率。每個平臺都有一個或多個由SDSoC Platform開發人員定義的時鐘源,在開發SDSoC Plaform的時候會指定一個預設時鐘源,但是無論是硬體加速函式還是資料傳輸網路,都可以自由選擇時鐘而不是限定為預設時鐘,此外硬體加速函式和資料傳輸網路可以使用不同的時鐘頻率,這部分內容會在之後介紹。 選擇硬體加速函式和資料傳輸網路的時鐘頻率選擇硬體加速函式和資料傳輸網路的時鐘頻率

編譯並測試

指定硬體加速函式和它們的執行頻率之後我們就可以編譯工程了。預設介面左上角可以選擇當前的編譯模式,Release還是Debug,二者的優化級別不同,我們這裡選擇Release,注意更改編譯模式後要重新新增硬體加速函式。右鍵lab1資料夾選擇build project,或點選圖片中的小錘子按鈕。編譯過程根據電腦配置會持續二十分鐘到六十分鐘不定。編譯的過程中SDSoC首先呼叫Vivado HLS工具將硬體加速函式中的程式碼轉化成RTL程式碼並打包成IP核,在Release/_sds/iprepo/repo資料夾中可以看到硬體加速函式生成的HLS IP核。 硬體加速函式生成的IP核 然後呼叫Vivado IP Integrator自動新增DMA模組生成Data motion Network並生成系統的Block Diagram,可以點選Release/_sds/p0/_vpl/ipi/syn/syn.xpr開啟Vivado工程,然後Open block diagram檢視,不同的SDx生成的Vivado工程路徑可能會不同。 SDSoC 呼叫Vivado IP Integrator自動生成Block Diagram SDSoC會呼叫Vivado生成位元流,同時自動生成Data motion network的驅動程式,並將生成的bitstream與fsbl.elf,u-boot.elf打包在一起生成BOOT.bin檔案。每一次編譯工程SDSoC都會完整地進行一遍Vivado HLS->Vivado IPI->Vivado的流程,Vivado HLS正常情況下只要幾分鐘就可以完成,HLS執行時間過長說明程式碼編寫有問題,整個流程中最費時間的是Vivado綜合佈局佈線生成位元流的過程。 將sd_card目錄下的lab1.elf,BOOT.BIN,image.ub檔案拷貝到FAT32的SD卡中。有兩種方法連線到PYNQ板卡。將PYNQ的MicroUSB連線到PC,PC會自動安裝驅動。然後找到SDx Terminal右側的“+”,選擇合適的埠。需要注意以上操作的順序:先上電,然後開啟串列埠,波特率保持預設,埠選擇COM4。 連線PYNQ板卡 啟動之後會列印核心啟動資訊,直到輸出PYNQ login,輸入使用者名稱root,密碼root。 SDSoC自帶的Terminal

$ mount /dev/mmcblk0p1 /mnt  //進入系統後掛載SD卡
$ cd /mnt
$ ./lab1.elf

效能預測模式

SDSoC完整地編譯一次工程少則二十分鐘,多則幾個小時,因此Xilinx提供了效能預測模式可以讓開發者快速地評估系統性能。勾選Estimate performance選項然後點選編譯按鈕,這個模式下SDSoC只會進行HLS的流程,並不會產生Block Diagram並呼叫Vivado產生位元流,整個編譯過程不會持續超過10分鐘。 勾選Estimate Performance 編譯完成後會彈出一個性能評估報告,包含了資源利用情況以及預測的執行一次硬體加速函式消耗的CPU時鐘週期數。 效能預測報告 還有一種辦法可以得到在CPU上執行程式的實測週期數。設定好TCF Agent後(在10.2.4節有提到)點選上圖中的Click Here就會執行lab1.elf檔案,得到實測的CPU週期數,並給出效能對比。 通過Linux TCF Agent得到的效能對比

分析和優化

在執行演算法優化時需要考慮兩個不同的方向:應用程式程式碼優化和硬體功能優化。大多數應用程式開發人員都熟悉針對CPU優化軟體。這通常要求程式設計師分析演算法的複雜性,總體系統效能和資料區域性性。有許多方法指南和軟體工具來指導開發者定位效能瓶頸,這些技能在優化針對SDSoC環境中的硬體加速函式時同樣適用。 首先,開發者應該分別優化整個工程中每一個函式的效能,在SDSoC環境下進行優化與傳統軟體開發的最大不同是有一些演算法會被放進PL中進行加速,這要求開發者必須考慮到演算法的並行性,資料傳輸,記憶體使用以及PL的存在。然後,開發者需要指定硬體加速函式,並儘可能地讓硬體加速器在資料傳輸時保持工作,也就是說要儘可能讓硬體加速器計算跟通訊同時進行。 SDSoC可以在編譯過程中自動生成報告,幫助開發者詳細地分析軟體應用和硬體加速函式,這些報告在Report檢視下可以看到,如下圖所示 報告檢視 雙擊Data Motion Network Report,我們可以看到Data Motion Network的報告,包含了每個硬體加速函式與PS之間的連線資訊,如使用了哪種埠(S_AXI_ACP or S_AXI_HP),哪種Datamover(DMA_SIMPLE or DMA_SG),每次運算的資料搬運量,以及用來儲存資料的記憶體是否連續,這些名詞的含義會在後面介紹。 Data Motion Network報告 雙擊HLS Report,可以看到HLS的詳細資訊,包括資源利用率,時鐘頻率以及週期數等資訊,開發者要根據這些資訊來優化設計。需要注意的是這裡估算出來的時鐘週期數與HLS估算出來的時鐘週期數是有差別的。CPU端的時鐘週期數=PL端時鐘週期數×(CPU頻率/PL頻率),而且HLS估算資料載入的時間與實際資料傳輸時間是有區別的,因此Estimate performance裡預測的CPU時鐘週期數與實際情況會有一些區別,但是整體來看預測結果還是比較準確的,可以作為參考。 HLS報告