三種巢狀迴圈
根據邊界和迴圈體位置
對於 imperfect loop nest 可以通過**優化手段將其轉變為 semi-perfect loop nest 或者 perfect loop nest。
在外部迴圈做 pipeline 可以獲得最理想的 latency,但同時資源消耗也最多,因為做 pipeline的時候其內部所有的迴圈都會被 unroll,而其本身以及外層迴圈會被 flatten,
(思考:為什麼上述外部迴圈展開後消耗的 4 個乘法器?這裡的 4 是否和內層迴圈次數有關?這時的 trip count 是否為 2?)
如果對內部迴圈 pipeline,則會自動對迴圈做 loop_flatten 優化,即把所有的巢狀迴圈展開(flatten)為乙個大迴圈。上述例子中就會被展開為乙個 trip count 為 8 的大迴圈,前提是 perfect loop nest。
unroll 展開和 flatten 展開是不一樣的概念。unroll 是將迴圈體展開為並行操作,而flatten 是將巢狀迴圈展開為單一迴圈。
只對最內層迴圈(即 product 迴圈)做 pipeline。 可以看出這樣只對外層的兩個迴圈展開(flatten)了,最內層 trip count 仍然是 3,這是因為在 col 迴圈裡面 product 迴圈外面有迴圈體(紅色部分),所以無法應用 loop_flatten。
如果只對第二層即 col 迴圈做 pipeline,可以看出最內層的product 迴圈被 unroll 了。而外面的兩層迴圈被 flatten 了。
如果對最外層的 row 迴圈做 pipeline,可以看出這個結果符合上面的描述,即:做 pipeline 的時候其內部所有的迴圈都會被 unroll,而其本身以及外層迴圈會被 flatten。
對整個函式做流水,全部unroll
建議對最內部的作流水,尋求乙個平衡
優化方式,增加快取
(這樣減少對原陣列的訪問)
q:這樣不會對cache的訪問也增加了嗎??
HLS 3for迴圈優化
一 對迴圈體的展開 c語言的迴圈體都是摺疊起來的,當綜合後會順序執行,對映到rtl的話就相當於一套電路被分時復用 進行展開的話就相當於是對電路的複製。hls directive editor directive unrool factor n n就是要展開成幾份 二 for迴圈合併 loop reg...
迴圈巢狀優化!!
第一部分說明 1 將大的迴圈放到內測,小的迴圈放到外側,確實能提高效率 全面測試巢狀多層for迴圈的效能。author 老紫竹的家 laozizhu.com public class testforloop system.out.println system.currenttimemillis t ...
迴圈的巢狀,以for迴圈為例
include int main putchar 10 內迴圈執行一次後換行 return0 列印結果 注 1 一重迴圈解決線性問題 二重迴圈解決平面問題 三重迴圈解決立體問題。2 建議for語句的迴圈控制變數的取值採用 左閉右開 的寫法,因為這樣的做法跟後面的陣列下標,是完全吻合的。3 多重迴圈中...