HLS(High-Level Synthesis)詳解——迴圈體並行優化

2020-09-30 15:00:40

HLS高階綜合能夠實現軟體程式碼的硬體加速,主要是因為其對程式碼中的迴圈體(for,while)等進行了並行性優化,採用流水,展開,合併,巢狀,資料流等方法,將軟體中需要一步步執行的迴圈體,在硬體電路中實現並行化處理,從而大幅提高計算速度,正好應對當下這種高計算量的需求。

本部落格講解一下回圈體優化的一些方法,以及一些特殊迴圈體的優化(巢狀for迴圈,變數邊界迴圈體),參考b站賽靈思官方HLS介紹視訊。

引數指標

綜合報告參考的指標引數,較為重要,如下圖:

Loop Trip Count:迴圈總次數

Loop Iteration Latency:每次迴圈佔用時鐘週期

Loop Iteration Interval(Loop II):兩次迴圈之間的間隔

Loop Latency:整個迴圈的時鐘週期

Function Latency:函數的時鐘週期

Function Iteration Interval:函數總共佔用時鐘週期

 

優化方法

1. Pipeline:

不同次數的迴圈進行流水線操作提高並行性改善Latency和Interval,流水操作的前提是不同迴圈次數之間沒有資料依賴。

 

2. Unroll:

展開真個迴圈體,等於複製迴圈,同步進行以增加並行性

3. for迴圈的合併

  • 邊界都為常數的兩個迴圈合併取最大的邊界
  • 當for迴圈合併的兩個迴圈邊界一個是常數,另一個無法確定的時候無法合併。
  • 上述兩個邊界都是不確定邊界時可以把邊界範圍大的拆分,使其一部分邊界相等

4.巢狀for迴圈

通過程式碼優化將後兩種巢狀轉化成前兩種

  1. 對上級迴圈pipeline會將下級所有迴圈unroll(資源利用率成倍(迴圈展開後的總次數)增加)。
  2. 建議對內部巢狀迴圈展開,達到時延和資源的中和。

5.  其他優化

①rewind:縮短迴圈多次執行的間隔,僅適用單迴圈

②迴圈邊界是變數的問題:

    1.使用tripcount directive:手動設定迴圈邊界的最大值最小值。

    2.把迴圈邊界的資料型別宣告成ap_int<W>。

    3.使用assert macro。

上述三種方法優化效果比較: