本文轉(zhuǎn)載自: XILINX開發(fā)者社區(qū)微信公眾號
HLS 優(yōu)化設(shè)計的最關(guān)鍵指令有兩個:一個是流水線 (pipeline) 指令,一個是數(shù)據(jù)流(dataflow) 指令。正確地使用好這兩個指令能夠增強算法地并行性,提升吞吐量,降低延遲但是需要遵循一定的代碼風格。展開 (unroll) 指令是只針對 for 循環(huán)的展開指令,和流水線指令關(guān)系密切,所以我們放在一起首先我們來看一下這三個指令在 Xilinx 官方指南中的定義:
Unroll: Unroll for-loops to create multiple instances of the loop body and its instructions that can then be scheduled independently.
Pipeline:Reduces the initiation interval by allowing the overlapped execution of operations within a loop or function.
Dataflow:Enables task level pipelining, allowing functions and loops to execute concurrently. Used to optimize through output and/or latency.
Unroll 指令在 for 循環(huán)的代碼區(qū)域進行優(yōu)化,這個指令不包含流水線執(zhí)行的概念,單純地將循環(huán)體展開使用更多地硬件資源實現(xiàn),保證并行循環(huán)體在調(diào)度地過程中是彼此獨立的。
Pipeline 指令在循環(huán)和函數(shù)兩個層級都可以使用,通過增加重復的操作指令(如增加資源使用量等等)來減小初始化間隔。
Dataflow 指令是一個任務級別的流水線指令,從更高的任務層次使得循環(huán)或函數(shù)可以并行執(zhí)行,目的在于減小延遲增加吞吐量。
Unroll 和 Pipeline 指令相互重合的關(guān)系在于,當對函數(shù)進行流水線處理時,以下層次結(jié)構(gòu)中的所有循環(huán)都會自動展開,而使用展開指令的循環(huán)并沒有給定對II的約束。在最新版本的 Vitis HLS 工具中,工具會自動分析數(shù)據(jù)之間的流水線操作關(guān)系,以II=1為目標優(yōu)化,但是還是會受限于設(shè)計本身的算法和代碼風格。下圖非常清晰地闡明了Unroll 和 Pipeline 指令的關(guān)系,Pipeline 指令放置的循環(huán)層次越高,循環(huán)展開的層次也越高,最終會導致使用更大面積的資源去實現(xiàn),同時并行性也更高。

這里如果循環(huán)的邊界是變量的話,則無法展開。這將組織函數(shù)被流水線化,可以通過添加tripcount 等指令,指定循環(huán)在綜合時大概的最大最小邊界。
在循環(huán)流水線優(yōu)化的過程中,有一個完美循環(huán),半完美循環(huán)和非完美循環(huán)的代碼風格概念,只有當流水線循環(huán)完美或半完美時,才可以將嵌套循環(huán)徹底并行展開。
完美循環(huán):只有最里面的循環(huán)才具有主體內(nèi)容,在循環(huán)語句之間沒有指定邏輯,循環(huán)界限是恒定的。
半完美循環(huán):只有最里面的循環(huán)才具有主體 (內(nèi)容), 在循環(huán)語句之間沒有指定邏輯,只有最外面的循環(huán)邊界可以是可變的。
非完美循環(huán):循環(huán)的主體內(nèi)容分布在循環(huán)的各個層次或內(nèi)層循環(huán)的邊界是變量。

當我們要爭去最大流水線循環(huán)的成功執(zhí)行,就需要將非完美循環(huán)手動修改成完美或半完美循環(huán)。 以下代碼例子給出了完美循環(huán)(左邊)和非完美循環(huán)(右邊)在Vitis HLS 中的執(zhí)行結(jié)果。


綜合完畢后,我們可以在分析窗口和綜合報告中都很清晰的看出,完美循環(huán)在執(zhí)行的時候,工具自動將內(nèi)層循環(huán)LOOP_J和外層循環(huán)LOOP_I合并為一整個大循環(huán),并實現(xiàn)了整個大循環(huán)的流水線操作,延遲的周期數(shù)為: (400-1) *1+8-1 =406個周期數(shù),延遲大約為 408*2.5 = 1,020 ns
非完美循環(huán)中,內(nèi)層和外層循環(huán)沒有合并,只有內(nèi)層循環(huán)LOOP_J 實現(xiàn)了流水線執(zhí)行,進出內(nèi)循環(huán)的浪費的時鐘周期增加了整個循環(huán)的時鐘周期,同時還有一些命令行沒有辦法跨越循環(huán)的層級實現(xiàn)調(diào)度上的優(yōu)化,這些因素都導致了設(shè)計的延遲的增加。
本文關(guān)于pipeline 以及 unroll 指令的介紹到此結(jié)束,下篇文章我們將著重介紹 daraflow 指令。
審核編輯:何安
-
指令
+關(guān)注
關(guān)注
1文章
617瀏覽量
37256
發(fā)布評論請先 登錄
歐盟CE-RED指令介紹
關(guān)于協(xié)處理器自定義指令的實現(xiàn)
關(guān)于系統(tǒng)鏈接腳本的介紹
軟硬件協(xié)同技術(shù)分享 - 任務劃分 + 自定義指令集
利用蜂鳥內(nèi)核實現(xiàn)指令的仿真模擬
利用蜂鳥內(nèi)核來實現(xiàn)指令的仿真模擬
e203進行F指令擴展的具體實現(xiàn)
Jenkins Pipeline的高級應用技巧
使用k230,可以使用pipeline庫,將輸入的視頻流進行二值化處理嗎?
從技術(shù)到產(chǎn)品 | 士模Pipeline ADC
CPU的各種指令和執(zhí)行流程
AXI握手時序優(yōu)化—pipeline緩沖器
Erp指令能效

關(guān)于pipeline 以及 unroll 指令的介紹
評論