HLS高階綜合能夠實現軟體程式碼的硬體加速,主要是因為其對程式碼中的迴圈體(for,while)等進行了並行性優化,採用流水,展開,合併,巢狀,資料流等方法,將軟體中需要一步步執行的迴圈體,在硬體電路中實現並行化處理,從而大幅提高計算速度,正好應對當下這種高計算量的需求。
本部落格講解一下回圈體優化的一些方法,以及一些特殊迴圈體的優化(巢狀for迴圈,變數邊界迴圈體),參考b站賽靈思官方HLS介紹視訊。
綜合報告參考的指標引數,較為重要,如下圖:
Loop Trip Count:迴圈總次數
Loop Iteration Latency:每次迴圈佔用時鐘週期
Loop Iteration Interval(Loop II):兩次迴圈之間的間隔
Loop Latency:整個迴圈的時鐘週期
Function Latency:函數的時鐘週期
Function Iteration Interval:函數總共佔用時鐘週期
不同次數的迴圈進行流水線操作提高並行性改善Latency和Interval,流水操作的前提是不同迴圈次數之間沒有資料依賴。
展開真個迴圈體,等於複製迴圈,同步進行以增加並行性
通過程式碼優化將後兩種巢狀轉化成前兩種
①rewind:縮短迴圈多次執行的間隔,僅適用單迴圈
②迴圈邊界是變數的問題:
1.使用tripcount directive:手動設定迴圈邊界的最大值最小值。
2.把迴圈邊界的資料型別宣告成ap_int<W>。
3.使用assert macro。
上述三種方法優化效果比較: