国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HLS for循環優化

jf_78858299 ? 來源:傅里葉的貓 ? 作者:張大俠 ? 2023-05-05 15:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

FOR循環優化

基本概念

從下面的例子中來解釋for循環中的基本概念:

圖 4.1 for循環基本概念

由于N等于3,因此每次循環可以分成4個步驟來完成:

c0:讀取數據b和c;

c1:獲取數據xin 0處地址;

c2:讀取對應地址上的數據;

c3:計算yo[0]的值。

后面的計算都是三個時鐘周期計算出一個值,因此對一次循環來說,Loop Iteration Latency為3,Loop Iteration Interval也是3,Loop Latency是9,再加上前面讀b和c的值的一個周期,整個函數的Latency是10,函數間的Initial Interval是11.

Pipeline

對for循環常用的優化是pipeline,pipeline的原理如下圖4.2所示。

圖 4.2 pipeline優化原理

在優化結束后,Loop Iteration Latency為3,Loop Iteration Interval變成1,Loop Latency為5.

如果對函數做pipeline,那么會自動把函數下面的for循環都做unrolling處理;如果對外層的for循環做pipeline,那么會自動對內層的for循環做unrolling處理。

Unrolling

默認情況下for循環是折疊的,就是電路被時分復用。當展開后,資源增加。如下圖所示將for循環展開成3倍的情況,資源也擴大了3倍。

圖 4.3 展開成3倍

也可以部分展開,循環次數為6,但展開成3倍,程序如下所示:

展開后,程序被分成3部分,資源也復制了3份。

圖 4.4 Unroll的設置

Merge

當幾個for循環執行的內容很相似時,如下面的程序所示:

兩個for循環分別對兩個數據做加法和減法,在HLS綜合后,會先進行第一個for循環的計算,完成后再進行第二個for循環的計算。這樣綜合出的Latency為18,Interval為19。

圖 4.5 綜合后延遲

在HLS中提供了Merge的選項,合并的是for所作用的region,合并后綜合后的延遲如下圖4.6所示。

圖 4.6 Merge后的延遲

上面的例子中兩個循環的邊界相同,如果兩個循環的邊界不同,則以最大的作為合并后的邊界;如果一個邊界是變量,另一個是常量,則不能合并;如果兩個循環邊界都是變量,依然不能合并。

還可以將for循環封裝成一個函數,并在上一層中例化兩次,并對函數采用Allocation來使函數并行執行,在allocation中有limit選項,可以指定實例化的次數,該數據與程序中實際的數值應該是一樣的。

數據流

在下面的例子中,Task B依賴于Task A,Task C依賴于Task B,如圖4.7所示。

而且可以分析出,該結構不適合之前所講的pipeline和merge方式進行處理,在可以使用dataflow的方式。

從圖中可以看出,在使用DataFlow后,Loop B無需等待A執行完成后才開始執行,而且各個Loop之間也村在間隔。且延遲和資源都明顯減少。

DataFlow使用的限制:

1.一個輸出在多個Loop模塊中使用

2.被Bypass的模塊

3.帶反饋的模塊

4.帶條件的模塊

5.可變循環邊界的模塊

6.多個退出條件的模塊

下面分別對上面的限制條件進行說明。

1.din在Loop1中輸出的temp1同時賦給Loop2和Loop3使用,這時是不能使用dataflow的,如圖4.10所示。

通過對代碼進行適當的修改,將其結構進行變形,增加一個Loop_copy模塊,將其輸出一個送個Loop2,另一個輸出送給Loop3,但其實這兩個輸出的結果是相同的。就可以使用DataFlow來完成該函數。

且使用了DateFlow后,工程所占用的資源和延遲都相應減少。

  1. 被Bypass的模塊

如下圖4.12所示的例子中,temp1在Loop2中使用,但temp2沒有經過Loop2,直接在Loop3中使用,這種情況下也是不能使用DataFlow的。

同樣的,可以對代碼進行優化以達到可以使用DataFlow的目的,如下圖4.13所示。在Loop2中,增加一個輸出端口,使其輸出給Loop3,這樣就可以使用DataFlow了。

在DataFlow的循環之間的存儲模塊,對于scalar、pointer和reference或者函數的返回值,HLS會綜合為FIFO;對于數組,結果可能是乒乓RAM或者FIFO:如果HLS可以判斷數據是流模式,就會綜合為FIFO,且深度為1,若不能判斷,就會綜合為乒乓RAM。我們也可以指定為FIFO或者乒乓RAM,但在指定為FIFO時,如果指定的深度不合適,綜合時就會出現錯誤。

嵌套for循環

三種嵌套循環:

對于Perfect Loop,對外邊的Loop做流水比對內循環做流水更加節省時間。

對于Imperfect Loop,我們總希望可以轉換為Perfect Loop或者Semi-Perfect Loop。如下的Imperfect Loop,如果對內層Product做流水,綜合結果如右側的圖所示。

如果對第二層即col的Loop做流水,則會提示信息,col下的循環會被展開。

從圖中的warning可以看出,a被綜合為一個雙端口的RAM,但第14行和第20行對a的操作有一個重疊的區域,意味著吞吐率受限。

如果對最外部的循環做流水,會把下面所有的循環都展開,延遲會減少,但資源會增加。

如果對整個函數做流水,那么函數下面的所有循環都會展開,能獲得最好的Latency,但資源也是最多的。

我們可以對代碼就行優化,具體代碼具體優化。

Rewind

我們在使用了pipeline后,循環之間仍然會有間隔,但使用rewind功能,可以消除該間隔,如下圖所示。

圖 4.16 rewind功能

但當函數中有多個循環時,rewind不能使用。

自動添加流水

在config_compile中,可以設置自動添加流水操作,如果循環次數小于我們設定的pipeline loops時,HLS就會自動為for循環添加流水。

在使用config_compile后,如果不想對某些for循環做流水,就可以在pipeline下面的選項中選中disable Loop pipeline。

變量邊界的解決方法

當循環邊界為變量時,通常可以采用下面的方式進行處理。

  1. 使用tripcount directive;
  2. 對于邊界變量的定義使用ap_int;
  3. 在C代碼中使用assert宏。

Tripcount directive不會對綜合有任何的影響,它只會對報告的顯示有影響。

使用ap_int和assert方法后,綜合后的資源會有明顯的減少。采用assert的方式的資源和延遲是最少的。

inline是針對函數,flatten是針對嵌套的循環。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67521
  • HLS
    HLS
    +關注

    關注

    1

    文章

    135

    瀏覽量

    25841
  • for循環
    +關注

    關注

    0

    文章

    61

    瀏覽量

    2885
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何使用AMD Vitis HLS創建HLS IP

    本文逐步演示了如何使用 AMD Vitis HLS 來創建一個 HLS IP,通過 AXI4 接口從存儲器讀取數據、執行簡單的數學運算,然后將數據寫回存儲器。接著會在 AMD Vivado Design Suite 設計中使用此 HLS
    的頭像 發表于 06-13 09:50 ?1878次閱讀
    如何使用AMD Vitis <b class='flag-5'>HLS</b>創建<b class='flag-5'>HLS</b> IP

    探索Vivado HLS設計流,Vivado HLS高層次綜合設計

    作者:Mculover666 1.實驗目的 通過例程探索Vivado HLS設計流 用圖形用戶界面和TCL腳本兩種方式創建Vivado HLS項目 用各種HLS指令綜合接口 優化Viv
    的頭像 發表于 12-21 16:27 ?4475次閱讀

    HLS優化設計中pipeline以及unroll指令:細粒度并行優化的完美循環

    HLS 優化設計的最關鍵指令有兩個:一個是流水線 (pipeline) 指令,一個是數據流(dataflow) 指令。正確地使用好這兩個指令能夠增強算法地并行性,提升吞吐量,降低延遲但是需要遵循一定
    發表于 01-08 10:26 ?9990次閱讀

    如何優化HLS仿真腳本運行時間

    需求:由于自己目前一個 HLS 仿真腳本需要運行 1個多小時,先打算通過打印時間戳的方式找出最耗時的部分,然后想辦法優化
    的頭像 發表于 02-23 09:29 ?1480次閱讀

    AMD-Xilinx的Vitis-HLS編譯指示小結

    。 含多個退出條件的循環 由于篇幅原因,這里就不細講了,詳情可以參考Vitis高層次綜合用戶指南 (UG1399) 陣列優化指令 pragma HLS array_partition
    發表于 12-31 21:20

    優化 FPGA HLS 設計

    優化 FPGA HLS 設計 用工具用 C 生成 RTL 的代碼基本不可讀。以下是如何在不更改任何 RTL 的情況下提高設計性能。 介紹 高級設計能夠以簡潔的方式捕獲設計,從而
    發表于 08-16 19:56

    怎么利用Synphony HLS為ASIC和FPGA架構生成最優化RTL代碼?

    相比,能夠為通信和多媒體應用提供高達10倍速的更高的設計和驗證能力。Synphony HLS為ASIC 和 FPGA的應用、架構和快速原型生成最優化的RTL。Synphony HLS解決方案架構圖
    發表于 08-13 08:21

    Vivado HLS設計流的相關資料分享

    1.實驗目的通過例程探索Vivado HLS設計流用圖形用戶界面和TCL腳本兩種方式創建Vivado HLS項目用各種HLS指令綜合接口優化Vivado
    發表于 11-11 07:09

    FPGA高層次綜合HLS之Vitis HLS知識庫簡析

    1、HLS最全知識庫介紹高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結構,自動轉換成低抽象級語言描述的電路模型的過程。對于AMD Xilinx而言
    發表于 09-07 15:21

    使用Vitis HLS創建屬于自己的IP相關資料分享

    1、使用Vitis HLS創建屬于自己的IP高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結構,自動轉換成低抽象級語言描述的電路模型的過程。對于AMD
    發表于 09-09 16:45

    HLS系列 – High Level Synthesis(HLS) 的一些基本概念1

    相信通過前面5篇fir濾波器的實現和優化過程,大家對HLS已經有了基本的認識。是時候提煉一些HLS的基本概念了。 HLS支持C,C++,和SystemC作為輸入,輸出為Verilog(
    發表于 02-08 05:23 ?1151次閱讀
    <b class='flag-5'>HLS</b>系列 – High Level Synthesis(<b class='flag-5'>HLS</b>) 的一些基本概念1

    HLS:lab3 采用了優化設計解決方案

    本實驗練習使用的設計是實驗1并對它進行優化。 步驟1:創建新項目 1.打開Vivado HLS 命令提示符 a.在windows系統中,采用Start>All Programs>Xilinx
    發表于 02-09 05:07 ?1156次閱讀
    <b class='flag-5'>HLS</b>:lab3 采用了<b class='flag-5'>優化</b>設計解決方案

    FPGA并行編程:基于HLS技術優化硬件設計

    作為集成電路設計領域現場可編程門陣列 (FPGA) 技術的創造者之一,賽靈思一直積極推廣高層次綜合 (HLS) 技術,通過這種能夠解讀所需行為的自動化設計流程打造出可實現此類行為的硬件。賽靈思剛剛推出了一本專著,清晰介紹了如何使用 HLS 技術來創建
    發表于 11-10 11:01 ?3226次閱讀

    for 循環并行執行的可能性

    我們將繼續介紹 Vivado HLS 所支持的 “for循環” 的優化方法。在默認情況下,Vivado HLS 并不會對順序執行的 for 循環
    的頭像 發表于 08-01 16:59 ?3353次閱讀

    HLS優化設計的最關鍵指令

    Unroll 指令在 for 循環的代碼區域進行優化,這個指令不包含流水線執行的概念,單純地將循環體展開使用更多地硬件資源實現,保證并行循環體在調度地過程中是彼此獨立的。
    的頭像 發表于 01-14 09:41 ?3367次閱讀