HLS 3for迴圈優化

2021-08-10 19:38:35 字數 2061 閱讀 4722

一、對迴圈體的展開

c語言的迴圈體都是摺疊起來的,當綜合後會順序執行,對映到rtl的話就相當於一套電路被分時復用;

進行展開的話就相當於是對電路的複製。

hls   directive editor->directive->unrool->factor=n(n就是要展開成幾份)。

二、for迴圈合併

loop regin:

sub:

for(int i=0;id[i]=a[i]+b[i];

}對於這種迴圈,我們所期望的是程式在執行加法的同時,也執行減法;但是預設情況下它是順序執行的,也就是執行完加法,再執行減法,這時我們可以將其進行合併(loop_merge)這樣add和sub可以同時進行。

合併的一些規則:a)邊界不同但都為常數的,合併和邊界為較大的那個。

b)邊界乙個為常數,另乙個為變數時,此時無法進行合併。

c)邊界都為變數時,合併後為乙個範圍。

三、資料流(data_flow)

a) loop_a:

for(i=0;i    loop_b:

for(i=0;i    loop_c:

for(i=0;i資料流動過程:d->taska->taskb->taskc->out

b)dataflow for "for_loop"

loopa->channel->loopb->channel->loopc channel中可以使用ping-pong,fifo,register

正常流程:loopa->loopb->loopc 使用dataflow之後:loopa|loopa|loopa

loopb|loopb|loopb

loopc|loopc|loopc

b)data_flow的限制

i)loop1:

for(i=0;itemp1[i]=din[i[*scale;

}loop2:

for(i=0;jdout1[j]=temp1[j]*2;

}loop3:

for(k=0;kdout2[k]=temp1[k]*4; }

對這種loop1中的結果在loop2和loop3中都被使用的情況(single-producer-consumer model)我們可以在loop1下面加個loop_copy將temp1複製乙份及:

loop1:

for(i=0;itemp1[i]=din[i[*scale;

}loop_copy:

for(m=0;mtemp2[m]=temp1[m];

te***[m]=temp1[m]; }

loop2:

for(i=0;jdout1[j]=temp2[j]*2;

}loop3:

for(k=0;kdout2[k]=te***[k]*4; }

ii)

loop1:

for(i=0;itemp1[i]=din[i[*scale;

temp2[i]=din[i]>>scale;

}loop2:

for(i=0;jte***[j]=temp1[j]*2;

}loop3:

for(k=0;kdout[k]=temp2[k]+te***[k]; }

對於這種,loop1產生2個結果,其中乙個經loop2到loop3,另乙個直接被loop3引用,可以在loop2中新增乙個temp4對temp2進行複製。

loop1:

for(i=0;itemp1[i]=din[i[*scale;

temp2[i]=din[i]>>scale;

loop2:

for(i=0;jte***[j]=temp1[j]*2;

temp4[j]=temp2[j];

loop3:

for(k=0;kdout[k]=temp4[k]+te***[k];

四、巢狀式的for迴圈

對於2層的巢狀,若對外部的for迴圈做流水,則其內部所有的for迴圈均會被開啟;一般對最內層的做流水。

五、其它的補充

a)rewind可以消除2個週期之間的間隔;

b)當迴圈邊界為變數的時候無法確定其latency,我們可以進行設定或者把值設定為任意精度的。

HLS巢狀for迴圈優化 以矩陣乘法為例 有問題

三種巢狀迴圈 根據邊界和迴圈體位置 對於 imperfect loop nest 可以通過 優化手段將其轉變為 semi perfect loop nest 或者 perfect loop nest。在外部迴圈做 pipeline 可以獲得最理想的 latency,但同時資源消耗也最多,因為做 pi...

HLS科普1 HLS和M3U8簡介

1.m3u8檔案概念2.m3u8檔案舉例 例如使用雲圖tv點播直播節目時,傳送請求 返回m3u8檔案,檔案內容如下 extm3u ext x media sequence 140651513 ext x targetduration 10 extinf 8,extinf 9,extinf 11,ex...

python優化迴圈 Python 優化迴圈

我希望優化一些由兩個巢狀迴圈組成的 python 我對numpy並不那麼熟悉,但據我所知,它應該能夠幫助我提高這項任務的效率.下面是我編寫的測試 它反映了實際 中發生的情況.目前使用numpy範圍和迭代器比通常的python更慢.我究竟做錯了什麼?這個問題的最佳解決方案是什麼?謝謝你的幫助!impo...