Unroll & Pipeline | 細粒度並行優化的完美循環

2021-01-09 電子工程專輯



HLS 優化設計的最關鍵指令有兩個:一個是流水線 (pipeline) 指令,一個是數據流(dataflow) 指令。正確地使用好這兩個指令能夠增強算法地並行性,提升吞吐量,降低延遲但是需要遵循一定的代碼風格。展開 (unroll) 指令是只針對 for 循環的展開指令,和流水線指令關係密切,所以我們放在一起首先我們來看一下這三個指令在 Xilinx 官方指南中的定義: 


Unroll: Unroll for-loops to create multiple instances of the loop body and its instructions that can then be scheduled independently. 

Pipeline:Reduces the initiation interval by allowing the overlapped execution of operations within a loop or function. 

Dataflow:Enables task level pipelining, allowing functions and loops to execute concurrently. Used to optimize through output and/or latency. 

 

Unroll 指令在 for 循環的代碼區域進行優化,這個指令不包含流水線執行的概念,單純地將循環體展開使用更多地硬體資源實現,保證並行循環體在調度地過程中是彼此獨立的。

Pipeline 指令在循環和函數兩個層級都可以使用,通過增加重複的操作指令(如增加資源使用量等等)來減小初始化間隔。

Dataflow 指令是一個任務級別的流水線指令,從更高的任務層次使得循環或函數可以並行執行,目的在於減小延遲增加吞吐量。 

 

Unroll 和 Pipeline 指令相互重合的關係在於,當對函數進行流水線處理時,以下層次結構中的所有循環都會自動展開,而使用展開指令的循環並沒有給定對II的約束。在最新版本的 Vitis HLS 工具中,工具會自動分析數據之間的流水線操作關係,以II=1為目標優化,但是還是會受限於設計本身的算法和代碼風格。下圖非常清晰地闡明了Unroll 和 Pipeline 指令的關係,Pipeline 指令放置的循環層次越高,循環展開的層次也越高,最終會導致使用更大面積的資源去實現,同時並行性也更高。 

這裡如果循環的邊界是變量的話,則無法展開。這將組織函數被流水線化,可以通過添加tripcount 等指令,指定循環在綜合時大概的最大最小邊界。 

 

在循環流水線優化的過程中,有一個完美循環,半完美循環和非完美循環的代碼風格概念,只有當流水線循環完美或半完美時,才可以將嵌套循環徹底並行展開。

 

完美循環:只有最裡面的循環才具有主體內容,在循環語句之間沒有指定邏輯,循環界限是恆定的。 

半完美循環:只有最裡面的循環才具有主體 (內容), 在循環語句之間沒有指定邏輯,只有最外面的循環邊界可以是可變的。 

非完美循環:循環的主體內容分布在循環的各個層次或內層循環的邊界是變量。 


當我們要爭去最大流水線循環的成功執行,就需要將非完美循環手動修改成完美或半完美循環。 以下代碼例子給出了完美循環(左邊)和非完美循環(右邊)在Vitis HLS 中的執行結果。 


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; 

    } 


綜合完畢後,我們可以在分析窗口和綜合報告中都很清晰的看出,完美循環在執行的時候,工具自動將內層循環LOOP_J和外層循環LOOP_I合併為一整個大循環,並實現了整個大循環的流水線操作,延遲的周期數為: (400-1) *1+8-1 =406個周期數,延遲大約為 408*2.5 = 1,020 ns

非完美循環中,內層和外層循環沒有合併,只有內層循環LOOP_J 實現了流水線執行,進出內循環的浪費的時鐘周期增加了整個循環的時鐘周期,同時還有一些命令行沒有辦法跨越循環的層級實現調度上的優化,這些因素都導致了設計的延遲的增加。 

 

本文關於pipeline 以及 unroll 指令的介紹到此結束,下篇文章我們將著重介紹 daraflow 指令。 


相關焦點

  • Mac OS補丁優化4K 支持1080p並行縮放
    Mac OS補丁優化4K 支持1080p並行縮放 2014年03月11日 00:05作者:bolvar編輯:張偉(編輯)     泡泡網液晶顯示器頻道3月11日 日前蘋果面向開發者發布了OS X Mavericks 10.9.3測試版,已經加入了原生4K支持,優化了Retina屏幕效果,4K可以並行縮放到1920x1080解析度顯示。
  • ARM平臺NEON指令的編譯和優化
    HWCAP_NEON bit (4096).另外如Ubuntu的發布在路徑/lib/neon/vfp下包含lib的NEON優化版本。告訴編譯器循環信息如循環是否某個整數的整數倍,以方便向量化;如下表明循環次數是4的整數倍:for(i=0 ; i < (len & ~3) ; i++){。。。}for (i=0; i{。。。
  • pipeline什麼意思
    pipeline什麼意思pipe,管子、管道,管中有液體或氣體,能夠從一個地方流到另一個地方。你知道鍵盤上的這個符號:| 英文就是pipe嗎?linespipeline,一根非常長的管道,管中有液體或氣體,可以傳輸很遠的距離,而且這根管道通常鋪設在地下。
  • ARM高效C編程和優化--編譯器,內存和Cache優化以及功耗管理
    ,下節則主要介紹編譯器的使用規則,如何指導編譯器進行合理的優化,以及系統級的NEON優化,從cache使用到系統功耗控制等。例如如果你知道某一特定循環將總是至少執行一次,那麼do-while循環將會是比for(;;)是一個更好的選擇。這是因為對C語言的for循環在第一次迭代循環前需要測試是否終止。編譯器會因此被迫在兩個地方重複測試for的起始和結束,以保證功能的正確。也會你會說現代的分支預測硬體支持會減少這些循環前後的複雜的分支調整,但是總體上最好的還是通過給編譯器更多的指導來減少這些不必要的分支。
  • 推薦:二代測序數據常用的4種pipeline淺談
    下面就介紹下目前用於二代數據分析常用的pipeline:1. Mothur (http://www.mothur.org/)由密西根大學(University of Michigan) 的Dr. Patrick Schloss領銜的團隊開發的,其團隊還開發有DOTUR和SONS軟體。
  • 網易AI Lab問鼎ACCV 2020細粒度網絡圖像識別賽
    近日,第十五屆亞洲計算機視覺學術會議ACCV 2020(Asian Conference on Computer Vision)國際細粒度網絡圖像識別賽公布最終成績,網易AI Lab以71.4%的準確率擊敗了來自全球的569個頂尖計算機視覺團隊,從超過1000份方案中脫穎而出
  • 7600字帶你學會 Redis 性能優化點,建議收藏!
    最後,在上面的介紹中沒有提到的是,Redis 大多數時候是單線程運行[2]的(single-threaded),即同一時間只佔用一個 CPU,只能有一個指令在運行,並行讀寫是不存在的。很多操作帶來的延遲問題,都可以在這裡找到答案。
  • CVPR 2020滿分論文 | FineGym:面向細粒度動作分析的層級化高質量...
    2、作為目前最全面的結構化細粒度動作數據集,FineGym 開闢了新的研究土壤,為原有領域注入新的活力。3、基於 FineGym, 我們從粗粒度到細粒度對現有的 SOTA 方法進行了多角度分析,體現了粗粒度和細粒度動作理解的區別,研究了採樣方法、時域信息整合、模型預訓練等在細粒度動作理解方面的問題和特性,開放性地指出了現有方法的局限性和未來可能的研究方向。總而言之,對於視頻動作識別、檢測、生成等感興趣的研究者來說,這項研究絕對值得關注。
  • 陳丹琦新作:關係抽取新SOTA,用pipeline方式挫敗joint模型
    論文連結:https://arxiv.org/pdf/2010.12812.pdfpipeline 方法重回巔峰?從非結構化文本中抽取實體及其關係是信息抽取中的基本問題。這個問題可以分解為兩個子任務:命名實體識別和關係抽取。
  • 一種簡單高效的pipeline方法,在多個基準上獲得了新的SOTA結果
    早期研究採用 pipeline 方法:訓練一個模型來抽取實體,另一個模型對實體之間的關係進行分類。而近期,端到端關係抽取任務已經成為聯合建模子任務系統的天下。大家普遍認為,這種 joint 模型可以更好地捕獲實體與關係之間的交互,並有助於緩解誤差傳播問題。  然而,這一局面似乎被一項新研究打破。
  • 如何對神經網絡人工智慧硬體進行優化設計?
    Single Instruction Multiple Data話接上回《窺腦究竟,結網造芯(三)》我們說到,有三種方式,可以在傳統體系結構的基礎上面向神經網絡人工智慧硬體進行優化設計。這次,我們先來提第一種——在簡單指令集(RISC)中增加指令的方式來達到性能的優化。我們將著重介紹如何加速卷積核的計算(忘了(一)和(二)?點這裡!)這次的故事,要從並行計算機體系結構講起。說到並行計算機體系結構,就要掉一個書袋——
  • 《近匠》小魚天氣,中國風與細粒度空氣品質檢測
    與一般天氣類App不同,小魚天氣主打細粒度空氣品質監測,其完全中國風的設計也頗合國內用戶的胃口。本期《近匠》,我們就對廖勤櫻進行了專訪,請她談一談微軟車庫,以及小魚天氣背後的故事。 廖勤櫻:首先我們把細粒度的空氣品質監測和預報作為我們的一個重點,使天氣預報跟空氣品質預報相結合。通過微軟研究院的大數據技術,我們可以為用戶提供精確到1平方公裡範圍的實時PM2.5數值以及未來48小時的預測值。這一點,是其他天氣app做不到的。第二是我們希望小魚天氣更加個性化而不是大而全。
  • 6月30日起,香山路沿線並行公交線路優化整合
    為高效配置運力資源,提升地面公交整體運營效率,6月30日首車起,調整331路,優化整合香山路沿線並行線路,削減香山路沿線重複路由及設站。331路調整後首末站為新街口豁口-西苑北站,增設「西苑北站」站,取消頤和園-香泉環島沿線各站。營業時間:新街口豁口5時10分至23時,西苑北站5時30分至23時。
  • 打擊違規與優化服務並行 即有分期開啟「雙軌模式」
    而擁有著700萬用戶的即有分期不滿足於僅對現狀進行「修修補補」,選擇了一條客戶服務改革與打擊金融欺詐「雙軌並行」的道路。 轉變客戶管理思維 成立智能客戶服務中心 在客戶數量從百萬級向千萬級增長的過程中,即有分期不可避免的遇到了如何提升客戶服務質量的問題。
  • 用好KANO模型,完美應對多需求並行
    一個人的精力是有限的,事事做到完美,那只會把自己累死。產品經理工作中,面對多方需求,該如何確定優先級?本文作者認為KANO模型是一個不錯的方法,並對其進行了闡述說明,與大家分享。一、產生多需求並行的原因有很多需求,這個先得恭喜下。為什麼?因為意味著貴司,至少還有很多活要做,發展得不錯,大概率上至少今年不會倒閉。不信問問那些撐不下去的企業們,現在員工都在幹啥?嗯,別問閣主是怎麼知道的,因為都是過來人。發展得好的公司,會累死你,發展得不好的公司,大家都得搶活做。看你願意選哪種?
  • Jenkins Pipeline結合github拉取請求自動進行項目發布(CI/CD)
    點擊New item,輸入item名稱,選擇pipeline類型。2) 填寫基本的通用標籤頁的欄位,如下圖所示:3) 為pipeline添加一個VERSION_BUMP構建參數自動構建通過PATCH(x.x.1)提升版本。擁有此參數將允許MINOR x.1.x版本增加手動構建。
  • 【像訓練CNN一樣快速訓練RNN】全新RNN實現,比優化後的LSTM快10倍
    例如,的前向計算要到的計算完成後才能開始,這構成了並行計算的主要瓶頸。在這項工作中,我們提出了一種RNN的替代實現,簡化了狀態計算過程,展現更多的並行性。我們所提出的循環單元,運行速度與卷積層一樣快,比cuDNN優化的LSTM快5-10倍。我們展示了這種循環單元在廣泛應用中的有效性,包括分類、問答、語言建模、翻譯和語音識別。我們開源了在PyTorch和CNTK中的實現。