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

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

當我們要爭去最大流水線循環的成功執行,就需要將非完美循環手動修改成完美或半完美循環。以下代碼例子給出了完美循環(左邊)和非完美循環(右邊)在Vitis HLS 中的執行結果。
Perfect_loop
#include "loop_perfect.h"
void loop_perfect (din_t A[N], dout_t B[N]) {
int i,j;
dint_t acc;
LOOP_I:for (i=0; i < 20; i++) {?
LOOP_J: for (j=0; j < 20; j++) {?
if(j==0) acc = 0;
acc += A[j] * j;
if(j==19) {
if (i%2 == 0)
B[i] = acc / 20;
else
B[i] = 0;
}
}
}
}
void loop_imperfect (din_t A[N], dout_t B[N]) {
int i,j;
dint_t acc;
LOOP_I:for(i=0; i < 20; i++){?
acc = 0;
LOOP_J: for (j=0; j < 20; j++) {?
acc += A[j] * j;
}
if (i%2 == 0)
B[i] = acc / 20;
else
B[i] = 0;
}
}




綜合完畢后,我們可以在分析窗口和綜合報告中都很清晰的看出,完美循環在執行的時候,工具自動將內層循環LOOP_J和外層循環LOOP_I合并為一整個大循環,并實現了整個大循環的流水線操作,延遲的周期數為: (400-1) *1+8-1 =406個周期數,延遲大約為 408*2.5 = 1,020 ns
非完美循環中,內層和外層循環沒有合并,只有內層循環LOOP_J 實現了流水線執行,進出內循環的浪費的時鐘周期增加了整個循環的時鐘周期,同時還有一些命令行沒有辦法跨越循環的層級實現調度上的優化,這些因素都導致了設計的延遲的增加。
責任編輯:lq
-
算法
+關注
關注
23文章
4784瀏覽量
98044 -
函數
+關注
關注
3文章
4417瀏覽量
67502 -
數據流
+關注
關注
0文章
129瀏覽量
16196
發布評論請先 登錄
HLS設計中的BRAM使用優勢
請問Keil的優化等級到底該如何選擇?
浮點運算單元的設計和優化
淺談合科泰MOS管的優化策略
便攜式礦物地物光譜儀選購指南:關鍵指標與實用技巧揭秘
利用Arm i8mm指令優化llama.cpp
如何在Unified IDE中創建視覺庫HLS組件
使用AMD Vitis Unified IDE創建HLS組件
如何使用AMD Vitis HLS創建HLS IP
激光器的多樣分類與選型關鍵指標全解析
Vivado HLS設計流程
HLS優化設計的最關鍵指令
評論