HLS 優(yōu)化設(shè)計(jì)的最關(guān)鍵指令有兩個(gè):一個(gè)是流水線 (pipeline)指令,一個(gè)是數(shù)據(jù)流(dataflow)指令。正確地使用好這兩個(gè)指令能夠增強(qiáng)算法地并行性,提升吞吐量,降低延遲但是需要遵循一定的代碼風(fēng)格。展開(kāi) (unroll) 指令是只針對(duì) for 循環(huán)的展開(kāi)指令,和流水線指令關(guān)系密切,所以我們放在一起首先我們來(lái)看一下這三個(gè)指令在 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 循環(huán)的代碼區(qū)域進(jìn)行優(yōu)化,這個(gè)指令不包含流水線執(zhí)行的概念,單純地將循環(huán)體展開(kāi)使用更多地硬件資源實(shí)現(xiàn),保證并行循環(huán)體在調(diào)度地過(guò)程中是彼此獨(dú)立的。
Pipeline 指令在循環(huán)和函數(shù)兩個(gè)層級(jí)都可以使用,通過(guò)增加重復(fù)的操作指令(如增加資源使用量等等)來(lái)減小初始化間隔。
Dataflow 指令是一個(gè)任務(wù)級(jí)別的流水線指令,從更高的任務(wù)層次使得循環(huán)或函數(shù)可以并行執(zhí)行,目的在于減小延遲增加吞吐量。
Unroll 和 Pipeline 指令相互重合的關(guān)系在于,當(dāng)對(duì)函數(shù)進(jìn)行流水線處理時(shí),以下層次結(jié)構(gòu)中的所有循環(huán)都會(huì)自動(dòng)展開(kāi),而使用展開(kāi)指令的循環(huán)并沒(méi)有給定對(duì)II的約束。在最新版本的 Vitis HLS 工具中,工具會(huì)自動(dòng)分析數(shù)據(jù)之間的流水線操作關(guān)系,以II=1為目標(biāo)優(yōu)化,但是還是會(huì)受限于設(shè)計(jì)本身的算法和代碼風(fēng)格。下圖非常清晰地闡明了Unroll 和 Pipeline 指令的關(guān)系,Pipeline 指令放置的循環(huán)層次越高,循環(huán)展開(kāi)的層次也越高,最終會(huì)導(dǎo)致使用更大面積的資源去實(shí)現(xiàn),同時(shí)并行性也更高。

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

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




綜合完畢后,我們可以在分析窗口和綜合報(bào)告中都很清晰的看出,完美循環(huán)在執(zhí)行的時(shí)候,工具自動(dòng)將內(nèi)層循環(huán)LOOP_J和外層循環(huán)LOOP_I合并為一整個(gè)大循環(huán),并實(shí)現(xiàn)了整個(gè)大循環(huán)的流水線操作,延遲的周期數(shù)為: (400-1) *1+8-1 =406個(gè)周期數(shù),延遲大約為 408*2.5 = 1,020 ns
非完美循環(huán)中,內(nèi)層和外層循環(huán)沒(méi)有合并,只有內(nèi)層循環(huán)LOOP_J 實(shí)現(xiàn)了流水線執(zhí)行,進(jìn)出內(nèi)循環(huán)的浪費(fèi)的時(shí)鐘周期增加了整個(gè)循環(huán)的時(shí)鐘周期,同時(shí)還有一些命令行沒(méi)有辦法跨越循環(huán)的層級(jí)實(shí)現(xiàn)調(diào)度上的優(yōu)化,這些因素都導(dǎo)致了設(shè)計(jì)的延遲的增加。
責(zé)任編輯:lq
-
算法
+關(guān)注
關(guān)注
23文章
4784瀏覽量
98053 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67507 -
數(shù)據(jù)流
+關(guān)注
關(guān)注
0文章
129瀏覽量
16199
發(fā)布評(píng)論請(qǐng)先 登錄
HLS設(shè)計(jì)中的BRAM使用優(yōu)勢(shì)
通過(guò)vivado HLS設(shè)計(jì)一個(gè)FIR低通濾波器
從硬件設(shè)計(jì)優(yōu)化到可靠性的挑戰(zhàn)
請(qǐng)問(wèn)Keil的優(yōu)化等級(jí)到底該如何選擇?
詳解示波器的三大關(guān)鍵指標(biāo)
浮點(diǎn)運(yùn)算單元的設(shè)計(jì)和優(yōu)化
淺談合科泰MOS管的優(yōu)化策略
便攜式礦物地物光譜儀選購(gòu)指南:關(guān)鍵指標(biāo)與實(shí)用技巧揭秘
利用Arm i8mm指令優(yōu)化llama.cpp
如何在Unified IDE中創(chuàng)建視覺(jué)庫(kù)HLS組件
使用AMD Vitis Unified IDE創(chuàng)建HLS組件
如何使用AMD Vitis HLS創(chuàng)建HLS IP
激光器的多樣分類與選型關(guān)鍵指標(biāo)全解析
Vivado HLS設(shè)計(jì)流程
HLS優(yōu)化設(shè)計(jì)的最關(guān)鍵指令
評(píng)論