一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HLS for循環(huán)優(yōu)化

jf_78858299 ? 來源:傅里葉的貓 ? 作者:張大俠 ? 2023-05-05 15:48 ? 次閱讀

FOR循環(huán)優(yōu)化

基本概念

從下面的例子中來解釋for循環(huán)中的基本概念:

圖 4.1 for循環(huán)基本概念

由于N等于3,因此每次循環(huán)可以分成4個(gè)步驟來完成:

c0:讀取數(shù)據(jù)b和c;

c1:獲取數(shù)據(jù)xin 0處地址;

c2:讀取對(duì)應(yīng)地址上的數(shù)據(jù);

c3:計(jì)算yo[0]的值。

后面的計(jì)算都是三個(gè)時(shí)鐘周期計(jì)算出一個(gè)值,因此對(duì)一次循環(huán)來說,Loop Iteration Latency為3,Loop Iteration Interval也是3,Loop Latency是9,再加上前面讀b和c的值的一個(gè)周期,整個(gè)函數(shù)的Latency是10,函數(shù)間的Initial Interval是11.

Pipeline

對(duì)for循環(huán)常用的優(yōu)化是pipeline,pipeline的原理如下圖4.2所示。

圖 4.2 pipeline優(yōu)化原理

在優(yōu)化結(jié)束后,Loop Iteration Latency為3,Loop Iteration Interval變成1,Loop Latency為5.

如果對(duì)函數(shù)做pipeline,那么會(huì)自動(dòng)把函數(shù)下面的for循環(huán)都做unrolling處理;如果對(duì)外層的for循環(huán)做pipeline,那么會(huì)自動(dòng)對(duì)內(nèi)層的for循環(huán)做unrolling處理。

Unrolling

默認(rèn)情況下for循環(huán)是折疊的,就是電路被時(shí)分復(fù)用。當(dāng)展開后,資源增加。如下圖所示將for循環(huán)展開成3倍的情況,資源也擴(kuò)大了3倍。

圖 4.3 展開成3倍

也可以部分展開,循環(huán)次數(shù)為6,但展開成3倍,程序如下所示:

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

圖 4.4 Unroll的設(shè)置

Merge

當(dāng)幾個(gè)for循環(huán)執(zhí)行的內(nèi)容很相似時(shí),如下面的程序所示:

兩個(gè)for循環(huán)分別對(duì)兩個(gè)數(shù)據(jù)做加法和減法,在HLS綜合后,會(huì)先進(jìn)行第一個(gè)for循環(huán)的計(jì)算,完成后再進(jìn)行第二個(gè)for循環(huán)的計(jì)算。這樣綜合出的Latency為18,Interval為19。

圖 4.5 綜合后延遲

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

圖 4.6 Merge后的延遲

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

還可以將for循環(huán)封裝成一個(gè)函數(shù),并在上一層中例化兩次,并對(duì)函數(shù)采用Allocation來使函數(shù)并行執(zhí)行,在allocation中有l(wèi)imit選項(xiàng),可以指定實(shí)例化的次數(shù),該數(shù)據(jù)與程序中實(shí)際的數(shù)值應(yīng)該是一樣的。

數(shù)據(jù)流

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

而且可以分析出,該結(jié)構(gòu)不適合之前所講的pipeline和merge方式進(jìn)行處理,在可以使用dataflow的方式。

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

DataFlow使用的限制:

1.一個(gè)輸出在多個(gè)Loop模塊中使用

2.被Bypass的模塊

3.帶反饋的模塊

4.帶條件的模塊

5.可變循環(huán)邊界的模塊

6.多個(gè)退出條件的模塊

下面分別對(duì)上面的限制條件進(jìn)行說明。

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

通過對(duì)代碼進(jìn)行適當(dāng)?shù)男薷?,將其結(jié)構(gòu)進(jìn)行變形,增加一個(gè)Loop_copy模塊,將其輸出一個(gè)送個(gè)Loop2,另一個(gè)輸出送給Loop3,但其實(shí)這兩個(gè)輸出的結(jié)果是相同的。就可以使用DataFlow來完成該函數(shù)。

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

  1. 被Bypass的模塊

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

同樣的,可以對(duì)代碼進(jìn)行優(yōu)化以達(dá)到可以使用DataFlow的目的,如下圖4.13所示。在Loop2中,增加一個(gè)輸出端口,使其輸出給Loop3,這樣就可以使用DataFlow了。

在DataFlow的循環(huán)之間的存儲(chǔ)模塊,對(duì)于scalar、pointer和reference或者函數(shù)的返回值,HLS會(huì)綜合為FIFO;對(duì)于數(shù)組,結(jié)果可能是乒乓RAM或者FIFO:如果HLS可以判斷數(shù)據(jù)是流模式,就會(huì)綜合為FIFO,且深度為1,若不能判斷,就會(huì)綜合為乒乓RAM。我們也可以指定為FIFO或者乒乓RAM,但在指定為FIFO時(shí),如果指定的深度不合適,綜合時(shí)就會(huì)出現(xiàn)錯(cuò)誤。

嵌套for循環(huán)

三種嵌套循環(huán):

對(duì)于Perfect Loop,對(duì)外邊的Loop做流水比對(duì)內(nèi)循環(huán)做流水更加節(jié)省時(shí)間。

對(duì)于Imperfect Loop,我們總希望可以轉(zhuǎn)換為Perfect Loop或者Semi-Perfect Loop。如下的Imperfect Loop,如果對(duì)內(nèi)層Product做流水,綜合結(jié)果如右側(cè)的圖所示。

如果對(duì)第二層即col的Loop做流水,則會(huì)提示信息,col下的循環(huán)會(huì)被展開。

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

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

如果對(duì)整個(gè)函數(shù)做流水,那么函數(shù)下面的所有循環(huán)都會(huì)展開,能獲得最好的Latency,但資源也是最多的。

我們可以對(duì)代碼就行優(yōu)化,具體代碼具體優(yōu)化。

Rewind

我們?cè)谑褂昧藀ipeline后,循環(huán)之間仍然會(huì)有間隔,但使用rewind功能,可以消除該間隔,如下圖所示。

圖 4.16 rewind功能

但當(dāng)函數(shù)中有多個(gè)循環(huán)時(shí),rewind不能使用。

自動(dòng)添加流水

在config_compile中,可以設(shè)置自動(dòng)添加流水操作,如果循環(huán)次數(shù)小于我們?cè)O(shè)定的pipeline loops時(shí),HLS就會(huì)自動(dòng)為for循環(huán)添加流水。

在使用config_compile后,如果不想對(duì)某些for循環(huán)做流水,就可以在pipeline下面的選項(xiàng)中選中disable Loop pipeline。

變量邊界的解決方法

當(dāng)循環(huán)邊界為變量時(shí),通??梢圆捎孟旅娴姆绞竭M(jìn)行處理。

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

Tripcount directive不會(huì)對(duì)綜合有任何的影響,它只會(huì)對(duì)報(bào)告的顯示有影響。

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

inline是針對(duì)函數(shù),flatten是針對(duì)嵌套的循環(huán)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63872
  • HLS
    HLS
    +關(guān)注

    關(guān)注

    1

    文章

    131

    瀏覽量

    24568
  • for循環(huán)
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    2655
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    探索Vivado HLS設(shè)計(jì)流,Vivado HLS高層次綜合設(shè)計(jì)

    作者:Mculover666 1.實(shí)驗(yàn)?zāi)康?通過例程探索Vivado HLS設(shè)計(jì)流 用圖形用戶界面和TCL腳本兩種方式創(chuàng)建Vivado HLS項(xiàng)目 用各種HLS指令綜合接口 優(yōu)化Viv
    的頭像 發(fā)表于 12-21 16:27 ?3867次閱讀

    HLS優(yōu)化設(shè)計(jì)中pipeline以及unroll指令:細(xì)粒度并行優(yōu)化的完美循環(huán)

    HLS 優(yōu)化設(shè)計(jì)的最關(guān)鍵指令有兩個(gè):一個(gè)是流水線 (pipeline) 指令,一個(gè)是數(shù)據(jù)流(dataflow) 指令。正確地使用好這兩個(gè)指令能夠增強(qiáng)算法地并行性,提升吞吐量,降低延遲但是需要遵循一定
    發(fā)表于 01-08 10:26 ?9317次閱讀

    如何優(yōu)化HLS仿真腳本運(yùn)行時(shí)間

    需求:由于自己目前一個(gè) HLS 仿真腳本需要運(yùn)行 1個(gè)多小時(shí),先打算通過打印時(shí)間戳的方式找出最耗時(shí)的部分,然后想辦法優(yōu)化。
    的頭像 發(fā)表于 02-23 09:29 ?923次閱讀

    AMD-Xilinx的Vitis-HLS編譯指示小結(jié)

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

    優(yōu)化 FPGA HLS 設(shè)計(jì)

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

    用vivado HLS優(yōu)化設(shè)計(jì)大規(guī)模矩陣相乘,求詳細(xì)具體的優(yōu)化策略

    設(shè)計(jì)一個(gè)高性能的HLS, 可以用任何優(yōu)化策略,在保持函數(shù)功能的同時(shí)盡可能提高性能。希望論壇里的大神給予具體優(yōu)化的指導(dǎo),最近幾天調(diào)試太費(fèi)勁了,希望大神給予保羅loop unroll, pipeline
    發(fā)表于 08-27 21:11

    怎么利用Synphony HLS為ASIC和FPGA架構(gòu)生成最優(yōu)化RTL代碼?

    相比,能夠?yàn)橥ㄐ藕投嗝襟w應(yīng)用提供高達(dá)10倍速的更高的設(shè)計(jì)和驗(yàn)證能力。Synphony HLS為ASIC 和 FPGA的應(yīng)用、架構(gòu)和快速原型生成最優(yōu)化的RTL。Synphony HLS解決方案架構(gòu)圖
    發(fā)表于 08-13 08:21

    Vivado HLS設(shè)計(jì)流的相關(guān)資料分享

    1.實(shí)驗(yàn)?zāi)康耐ㄟ^例程探索Vivado HLS設(shè)計(jì)流用圖形用戶界面和TCL腳本兩種方式創(chuàng)建Vivado HLS項(xiàng)目用各種HLS指令綜合接口優(yōu)化Vivado
    發(fā)表于 11-11 07:09

    FPGA高層次綜合HLS之Vitis HLS知識(shí)庫簡析

    1、HLS最全知識(shí)庫介紹高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結(jié)構(gòu),自動(dòng)轉(zhuǎn)換成低抽象級(jí)語言描述的電路模型的過程。對(duì)于AMD Xilinx而言
    發(fā)表于 09-07 15:21

    使用Vitis HLS創(chuàng)建屬于自己的IP相關(guān)資料分享

    1、使用Vitis HLS創(chuàng)建屬于自己的IP高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結(jié)構(gòu),自動(dòng)轉(zhuǎn)換成低抽象級(jí)語言描述的電路模型的過程。對(duì)于AMD
    發(fā)表于 09-09 16:45

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

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

    HLS:lab3 采用了優(yōu)化設(shè)計(jì)解決方案

    本實(shí)驗(yàn)練習(xí)使用的設(shè)計(jì)是實(shí)驗(yàn)1并對(duì)它進(jìn)行優(yōu)化。 步驟1:創(chuàng)建新項(xiàng)目 1.打開Vivado HLS 命令提示符 a.在windows系統(tǒng)中,采用Start>All Programs>Xilinx
    發(fā)表于 02-09 05:07 ?835次閱讀
    <b class='flag-5'>HLS</b>:lab3 采用了<b class='flag-5'>優(yōu)化</b>設(shè)計(jì)解決方案

    FPGA并行編程:基于HLS技術(shù)優(yōu)化硬件設(shè)計(jì)

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

    for 循環(huán)并行執(zhí)行的可能性

    我們將繼續(xù)介紹 Vivado HLS 所支持的 “for循環(huán)” 的優(yōu)化方法。在默認(rèn)情況下,Vivado HLS 并不會(huì)對(duì)順序執(zhí)行的 for 循環(huán)
    的頭像 發(fā)表于 08-01 16:59 ?2970次閱讀

    HLS優(yōu)化設(shè)計(jì)的最關(guān)鍵指令

    Unroll 指令在 for 循環(huán)的代碼區(qū)域進(jìn)行優(yōu)化,這個(gè)指令不包含流水線執(zhí)行的概念,單純地將循環(huán)體展開使用更多地硬件資源實(shí)現(xiàn),保證并行循環(huán)體在調(diào)度地過程中是彼此獨(dú)立的。
    的頭像 發(fā)表于 01-14 09:41 ?2727次閱讀