chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

FPGA循環(huán)并行化應用于先前任務(wù)并行化的推理內(nèi)核

OpenFPGA ? 來源:OpenFPGA ? 2023-04-17 09:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在本文中,我們將循環(huán)并行化應用于先前任務(wù)并行化的推理內(nèi)核,并平衡層與層之間的執(zhí)行時間。

此外,當前內(nèi)核的外部內(nèi)存訪問效率低下,因此內(nèi)存訪問也是瓶頸。在這種狀態(tài)下,即使進行循環(huán)并行化,內(nèi)存訪問最終也會成為瓶頸。

當前內(nèi)核瓶頸

下面轉(zhuǎn)載上一篇文章中附上的內(nèi)核執(zhí)行時間報告。

運行時報告:

6ba95e54-dcbc-11ed-bfe3-dac502259ad0.png

實際時間:

6bc3c474-dcbc-11ed-bfe3-dac502259ad0.png

這里,每幅圖中的①、②、③分別對應第一個卷積層(conv1)、第二個卷積層(conv2)和第一個全連接層(fc1)。執(zhí)行時間報告顯示conv2、conv1、fc1的執(zhí)行時間比例為51。另一方面,在真機實踐上,conv2:conv1的比例約為5:3,但fc1層的執(zhí)行時間與它們相比非常短。整個推理過程的執(zhí)行時間也是 12.65 ms/image,明顯長于報告的吞吐量(504098 cycles / 300MHz = 1.68 ms/image)。

HLS 報告 <-> 實際機器的性能存在這種差異的原因是,HLS 報告是在假設(shè)可以在請求外部存儲器的時間立即提供數(shù)據(jù)的情況下創(chuàng)建的。由于在真機上訪問外部內(nèi)存不是那么快,所以在真機上性能明顯更差。

內(nèi)存訪問優(yōu)化

我們發(fā)現(xiàn)內(nèi)存訪問效率低下,將對其進行優(yōu)化。當前內(nèi)核為卷積層中的每個乘法累加運算從外部 DRAM 獲取系數(shù)數(shù)據(jù)。使用此配置,對 DRAM 的訪問以非常細的粒度進行操作,因此 DRAM 上的負載變得非常高。

Xilinx的FPGA內(nèi)部的內(nèi)存層次結(jié)構(gòu)如下圖所示,F(xiàn)PGA中存在分布式RAM(Distributed RAM)、BRAM(Block RAM)、URAM(Ultra RAM)三種。

這些 FPGA 內(nèi)部的存儲器可以比 DRAM 運行得更快,并且每個周期都可以穩(wěn)定地讀寫數(shù)據(jù)。因此,這次我們將圖像、權(quán)值大小等數(shù)據(jù)提前全部復制到FPGA中,并進行修改,讓每一層都從FPGA的內(nèi)存中讀取數(shù)據(jù)。在這種情況下,圖像和權(quán)重大小讀取時間足夠小,因此我將堅持使用 HLS 默認值(BRAM 或分布式 RAM)。

要創(chuàng)建的電路框圖如下所示。

6be2a7a4-dcbc-11ed-bfe3-dac502259ad0.png

添加一個新電路x,x_local臨時存儲來自本地內(nèi)存的 DRAM 輸入的數(shù)據(jù)。至于loadweight輸出,它也是將層的數(shù)據(jù)緩沖到本地內(nèi)存中,并從端口biasfc2y_localy輸出結(jié)果。

在此圖中,為簡單起見,假定本地緩沖區(qū)是單個緩沖區(qū)。對于上次解釋的任務(wù)并行化,這個緩沖區(qū)應該是乒乓緩沖區(qū)。

要在 HLS 中實現(xiàn)此電路,代碼中定義load一個store函數(shù)和一個本地storememcpy緩沖區(qū)。其實我們不需要自己定義這個函數(shù),如果我們使用C標準庫,load它會自動生成一個高效的電路,所以我們就用它。

代碼如下所示:

111voidinference_with_local_buffer(constfloatx[kMaxSize],
112constfloatweight0[kMaxSize],constfloatbias0[kMaxSize],
113constfloatweight1[kMaxSize],constfloatbias1[kMaxSize],
114constfloatweight2[kMaxSize],constfloatbias2[kMaxSize],
115constfloatweight3[kMaxSize],constfloatbias3[kMaxSize],
116floaty[kMaxSize]){
117#pragmaHLSdataflow
118#pragmaHLSinterfacem_axiport=xoffset=slavebundle=gmem0
...
151
152conststd::size_tx_size=1*28*28;
153conststd::size_tw0_size=4*1*3*3,b0_size=4;
...
157conststd::size_ty_size=10;
158
159floatx_local[x_size];
160floatw0_local[w0_size],b0_local[b0_size];
...
164floaty_local[y_size];
165
166//fetchtolocalbuffer
167std::memcpy(x_local,x,x_size*sizeof(float));
168std::memcpy(w0_local,weight0,w0_size*sizeof(float));
...
176
177//runinferencewithlocalbuffer
178dnnk::inference(x_local,
179w0_local,b0_local,
180w1_local,b1_local,
181w2_local,b2_local,
182w3_local,b3_local,
183y_local);
184
185//storetoglobalbuffer
186std::memcpy(y,y_local,y_size*sizeof(float));
187}

第167行,將DRAM上的內(nèi)存復制到xFPGAx_local內(nèi)部的內(nèi)存中。之后,我們用來運行x_local推理dnnk::inferencey_localmemcpy函數(shù),最終輸出到DRAM。

以下是綜合此電路并在真機上執(zhí)行的日志??梢钥闯?,原本需要 12.65 [ms/image] 的執(zhí)行時間已經(jīng)減少到 1.61 [ms/image]。

$./host/run_inference./host/inference_with_local_buffer_hw.xclbininference_with_local_buffer1
Elapsedtime:1.61029[ms/image]
accuracy:0.973

卷積層在這個內(nèi)核中的表現(xiàn)也稍好一些,因為原始內(nèi)核在卷積層內(nèi)部沒有 DRAM 訪問,將處理周期總數(shù)減少到 504898 -> 481378 個周期。481378個周期在300MHz轉(zhuǎn)換時為1.604 ms,與上述真機執(zhí)行時間(1.61 ms)相差無幾。因此,從inference_with_local_buffer可以看出,對于使用本地緩沖區(qū)進行緩存的函數(shù),內(nèi)存訪問時間不會對整體性能產(chǎn)生不利影響。

通過循環(huán)并行化加速卷積層

到此為止,HLS報告的執(zhí)行時間和真機差不多,所以本文的主題循環(huán)并行化將從以下開始。

在卷積函數(shù)的最內(nèi)層循環(huán)中,大致進行了以下三個過程。

像素,負載權(quán)重

像素,權(quán)重的乘積

將乘法結(jié)果添加到求和寄存器

這三個過程都是在下面的卷積函數(shù)的第31行完成的。

17for(int32_tich=0;ich

粗略地說,上述內(nèi)核的處理流程如下圖所示。

6bf8bb84-dcbc-11ed-bfe3-dac502259ad0.png

這里,假設(shè)處理load需要1個周期,fmul處理需要3個周期,fadd處理需要4個周期。第一行是迭代(循環(huán)的迭代次數(shù))i,下一行是下一次迭代i+1,最后i+2是處理后的波形。在不提取循環(huán)并行度的情況下,每次迭代的處理完全不重疊,每次迭代需要8個周期的處理時間。

比如load2-9、10-17等周期,電路都沒有運行,一直運行可以進一步提高性能。load電路一直運行時的波形如下圖所示。

6c0ba654-dcbc-11ed-bfe3-dac502259ad0.png

到目前為止,下一次迭代每 8 個周期開始一次,但在本例中,下一次迭代每 1 個周期開始一次。以這種方式提取不同迭代之間的并行性稱為循環(huán)并行化??梢赃M行一次迭代的時間間隔稱為II(Iteration Interval),本例中寫為II=1。

在循環(huán)并行中,并行的抽象方式與之前的任務(wù)并行幾乎相同。然而,任務(wù)并行性提取幀之間的并行性,而循環(huán)并行性提取每一層內(nèi)處理迭代之間的并行性。此外,為了提取任務(wù)并行性,需要同時處理多個幀,因此存在需要將多個幀的輸入數(shù)據(jù)預先擴展到FPGA上的DRAM等限制。另一方面,由于循環(huán)并行僅在幀內(nèi)完成,因此可以沒有特別限制地提取并行。

循環(huán)并行化的方法很簡單,#pragma HLS pipeline II=1只需要在循環(huán)中添加符號,如下所示:這樣做kw可以優(yōu)化變量的循環(huán),以便它們可以一次處理一個循環(huán)。

17for(int32_tich=0;ich

僅通過添加#pragma HLS pipeline II=1就可以實現(xiàn)II=1,但即使對上述修改后的內(nèi)核進行綜合,也會輸出以下記錄:目標(Target)為II=1,但實際電路(Final)為II=4。

INFO:[v++204-61]Pipeliningloop'Loop1.1'.
INFO:[v++204-61]Pipeliningresult:TargetII=1,FinalII=4,Depth=12.

這是因為在第31行的處理中,下一次迭代的計算依賴于上一次迭代sum += ...的相加結(jié)果。另一方面,x[pix_idx]的加載處理和x[pix_idx]*weight[weight_idx]的乘法處理不依賴于前迭代的結(jié)果,因此可以先處理。

#pragma HLS pipeline應用后的波形大致如下。

6c23b2ee-dcbc-11ed-bfe3-dac502259ad0.png

load, fmul可以先運行,fadd但要等到上一次迭代完成后才能運行,所以整體faddII受到 4 個周期延遲的速率限制。

通過復制和寄存器提高性能

前面說了這個卷積不可能每個循環(huán)都做,因為i+1迭代的結(jié)果取決于迭代次數(shù)。i在這里,sum通過將 sum 寄存器復制成四個,我們改變了依賴關(guān)系,使得i迭代依賴于迭代的結(jié)果i-4。由于用文字難以理解,目標波形如下所示。

6c3ade74-dcbc-11ed-bfe3-dac502259ad0.png

fadd(橙色、藍色、水色和綠色)的顏色fadd代表輸出目標寄存器,輸出目標寄存器在每個循環(huán)中切換。這樣,從第5周期開始到第8周期結(jié)束的一次迭代i的計算結(jié)果將被fadd第9周期的迭代首次使用。

要創(chuàng)建的電路應該是上面描述的那種,但是從 Vivado HLS/Vitis 創(chuàng)建它需要稍微特殊的編寫方式。以下描述基于名為 shift_register_c 的 SDAccel 教程的內(nèi)容。

下面是使用移位寄存器的卷積函數(shù)的代碼。

82staticvoidconv2d_pipelined_v2(constfloat*x,constfloat*weight,constfloat*bias,int32_twidth,int32_theight,
83int32_tin_channels,int32_tout_channels,int32_tksize,float*y){
84staticconstintkShiftRegLength=4;
85
86for(int32_toch=0;och

主要有以下三個區(qū)別:

1、移位寄存器定義(L89-L90)

2、本地求和:重復求和寄存器(L111-L122)的求和

3、全局求和:重復求和寄存器(L130-L134)之間的求和處理

1的移位寄存器定義將4+1求和寄存器定義為FPGA上的寄存器。+1只是一個臨時寄存器,按照C語言語法只用來臨時存放加法的結(jié)果,在高級綜合時刪除。第90 行添加了一個新的 pragma(#pragma HLS array_partition)()以將移位寄存器定義為寄存器(完整),默認情況下將其推斷為 BRAM。pragma 本身可以做很多其他事情,但我將在下一個數(shù)據(jù)并行化中觸及細節(jié)。

2 的本地求和在四個求和寄存器上累加乘法結(jié)果 (mul)。這里,glob_idx是ich、kh、kw 3個循環(huán)的索引。通常情況下,shift_reg[glob_idx % 4] += mul可以復制我們這次正在做的輸出寄存器,但是這樣,高級綜合結(jié)果II=4就不會改變。因此,這里使用官方示例中也使用的移位處理(shift_reg[i] = shift_reg[i + 1])II=1來實現(xiàn)這一點。每次對這兩個寄存器進行shift_reg[0]加法mul運算shift_reg[0]時,它所包含的求和寄存器的數(shù)字(0 到 3)每個周期都會發(fā)生變化。

3 的全局求和對四個求和寄存器執(zhí)行求和運算。#pragma HLS pipeline我們也在這里指定,但fadd由于延遲,這里我們沒有 II=1。

此修改允許kw循環(huán)的 II 為 1,從而實現(xiàn)最有效的循環(huán)并行化。另一方面,此修復程序并沒有提供 4 倍的加速,因為它添加了另一個全局求和循環(huán)。

評估

檢查綜合結(jié)果

比較以下三種配置的性能。

內(nèi)存訪問優(yōu)化后(無循環(huán)并行)

#pragma HLS pipeline II=1

使用移位寄存器加速后

結(jié)果總結(jié)在下表中。

方法 卷積層 II 第二層卷積迭代(二) 整個推理過程的迭代區(qū)間(二)
無循環(huán)并行 8 481377 481378
pipeline 4 257153 257154
移位寄存器后 1 127009 172482

著眼于第2個卷積層,通過pipeline改變loop parallelism -> onlypipeline獲得了約1.87倍的性能提升,通過應用shift register -> 獲得了約2.02倍的性能提升。這里,本來是II = 4 -> II = 1,所以我們希望性能提升4倍左右,但實際上,上面描述的全局求和過程占用了很多時間,所以速度未獲得提升。

下面是應用移位寄存器后配置的 HLS 報告。

6c4e38b6-dcbc-11ed-bfe3-dac502259ad0.png

在前面的推理過程中,瓶頸是第二個卷積層(conv2d_pipelined_v2),但這里的瓶頸是第一個卷積層(conv2d_pipelined_v2_1)。這是因為第一個卷積層是 1ch,3×3 卷積,所以一開始每個像素只執(zhí)行九次操作。在這種情況下,由于能夠執(zhí)行 II=1 的局部求和而帶來的性能增益被添加全局求和循環(huán)所帶來的性能損失所抵消,反之性能下降。另一方面,隨著輸入通道數(shù)和內(nèi)核大小的增加,局部求和處理的性能提升變得更加明顯,因此這種優(yōu)化在大規(guī)模網(wǎng)絡(luò)中變得更加有效。

總結(jié)

到目前為止通過調(diào)整的加速率如下。

方法 執(zhí)行時間(毫秒/圖像) 比以前的實施提速 相對于基線的改進百分比
基線 20.81 1.00 1.00
任務(wù)并行化 12.65 1.65 1.65
通過本地緩沖區(qū)減少外部存儲器訪問 1.61 7.86 12.93
循環(huán)并行化(僅限卷積層) 0.61 2.64 34.11

盡管最初的實現(xiàn)根本不關(guān)心速度,但一些編譯指示添加和代碼修復產(chǎn)生了比基線快 34 倍的速度。

我在本文開頭所做的內(nèi)存訪問調(diào)優(yōu)目前特別有效。FPGA 的優(yōu)勢之一是其豐富的內(nèi)部 RAM 帶寬,因此隱藏對外部存儲器的訪問通常會產(chǎn)生顯著的性能提升,如本例所示。





審核編輯:劉清

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

    關(guān)注

    1660

    文章

    22383

    瀏覽量

    634131
  • DRAM
    +關(guān)注

    關(guān)注

    41

    文章

    2390

    瀏覽量

    188830
  • 存儲器
    +關(guān)注

    關(guān)注

    39

    文章

    7727

    瀏覽量

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

    關(guān)注

    1

    文章

    134

    瀏覽量

    25754

原文標題:從FPGA說起的深度學習(七)-循環(huán)并行化

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    基于HLS之任務(wù)并行編程

    ,用戶要手工添加DATAFLOWpragma,工具會在該pragma指定的區(qū)域內(nèi)判別任務(wù)之間的并行性,生成各進程之間的模塊級控制信號。對于數(shù)據(jù)驅(qū)動型,用于需要明確指定可并行執(zhí)行的
    的頭像 發(fā)表于 07-27 09:22 ?2004次閱讀
    基于HLS之<b class='flag-5'>任務(wù)</b>級<b class='flag-5'>并行</b>編程

    FPGA在人工智能中的應用有哪些?

    FPGA(現(xiàn)場可編程門陣列)在人工智能領(lǐng)域的應用非常廣泛,主要體現(xiàn)在以下幾個方面: 一、深度學習加速 訓練和推理過程加速:FPGA可以用來加速深度學習的訓練和推理過程。由于其高
    發(fā)表于 07-29 17:05

    利用NI LabVIEW的并行技術(shù)來提高測試的吞吐量

    的時候,他們必須理解不斷進步的技術(shù),如多核處理器、現(xiàn)場可編程門陣列(FPGA)和高速數(shù)據(jù)總線,如PCI Express等等。通過將這些技術(shù)與NI LabVIEW并行編程軟件及NI TestStand
    發(fā)表于 12-12 16:02

    fpga基礎(chǔ)篇(二):三大并行結(jié)構(gòu)

    并行語句是同時執(zhí)行的,想想怎么讓FPGA執(zhí)行,所以FPGA從語法層次上就不允許并行并行。我把實際編程中經(jīng)常用到的
    發(fā)表于 04-13 10:23

    擾碼器的并行問題

    如果一個擾碼器現(xiàn)在做并行,例如要求輸入位寬為32位,那么本原多項式如何確定?在實現(xiàn)的過程中,如果想使用并行,是不是需要將同移位寄存器長一致的周期后狀態(tài)機算出來呢?不很明白為什么可以實現(xiàn)并行
    發(fā)表于 05-07 16:53

    基于FPGA的嵌入式多核處理器及SUSAN算法并行

    基于FPGA的嵌入式多核處理器及SUSAN算法并行
    發(fā)表于 08-30 18:11 ?24次下載

    利用NI LabVIEW實現(xiàn)真正的并行化處理和并行測量

    多核處理器、FPGA和PCI Express正在改變現(xiàn)代PC機的版圖,并幫助LabVIEW圖形編程根據(jù)工程師應用邏輯的數(shù)據(jù)流向,實現(xiàn)真正的并行化處理和并行
    發(fā)表于 11-16 20:31 ?1.1w次閱讀
    利用NI LabVIEW實現(xiàn)真正的<b class='flag-5'>并行</b>化處理和<b class='flag-5'>并行</b><b class='flag-5'>化</b>測量

    JPEG壓縮算法并行設(shè)計

    方面并行性的優(yōu)勢,提出了基于OpenCL的JPEG壓縮算法并行設(shè)計方法。將JPEG算法功能分解為多個內(nèi)核程序,內(nèi)核之間通過事件信息傳遞進行
    發(fā)表于 11-21 16:57 ?4次下載
    JPEG壓縮算法<b class='flag-5'>并行</b><b class='flag-5'>化</b>設(shè)計

    基于Spark的BIRCH算法并行的設(shè)計與實現(xiàn)

    在分布式計算和內(nèi)存為王的時代,Spark作為基于內(nèi)存計算的分布式框架技術(shù)得到了前所未有的關(guān)注與應用。著重研究BIRCH算法在Spark上并行的設(shè)計和實現(xiàn),經(jīng)過理論性能分析得到并行
    發(fā)表于 11-23 11:24 ?0次下載
    基于Spark的BIRCH算法<b class='flag-5'>并行</b><b class='flag-5'>化</b>的設(shè)計與實現(xiàn)

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

    我們將繼續(xù)介紹 Vivado HLS 所支持的 “for循環(huán)” 的優(yōu)化方法。在默認情況下,Vivado HLS 并不會對順序執(zhí)行的 for 循環(huán)優(yōu)化為并行執(zhí)行,LOOP_MERGE 約束提供了這樣一種可能:for
    的頭像 發(fā)表于 08-01 16:59 ?3287次閱讀

    如何使用FPGA實現(xiàn)嵌入式多核處理器及SUSAN算法并行

    出了四核心嵌入式并行處理器FPEP的結(jié)構(gòu)設(shè)計并建立了FPGA驗證平臺.為了對多核處理器平臺性能進行評測,提出了基于OpenMP的3種可行的圖像處理領(lǐng)域的經(jīng)典算法SUSAN算法的并行
    發(fā)表于 02-03 16:26 ?8次下載
    如何使用<b class='flag-5'>FPGA</b>實現(xiàn)嵌入式多核處理器及SUSAN算法<b class='flag-5'>并行</b><b class='flag-5'>化</b>

    基于數(shù)據(jù)驅(qū)動的任務(wù)并行多重網(wǎng)格應用

    多重網(wǎng)格是數(shù)值計算領(lǐng)域中一種加速迭代收斂的重要技術(shù),被廣泛應用。近年來,大規(guī)模并行計算系統(tǒng)向多核、異構(gòu)眾核發(fā)展,多重網(wǎng)格應用也亟須適應新的并行計算平臺。文中采用一種數(shù)據(jù)驅(qū)動的
    發(fā)表于 05-13 10:41 ?8次下載

    如何使用FPGA驅(qū)動并行ADC和并行DAC芯片

    ADC和DAC是FPGA與外部信號的接口,從數(shù)據(jù)接口類型的角度劃分,有低速的串行接口和高速的并行接口。FPGA經(jīng)常用來采集中高頻信號,因此使用并行ADC和DAC居多。本文將介紹如何使用
    的頭像 發(fā)表于 04-21 08:55 ?8330次閱讀

    基于FPGA的ARM并行總線設(shè)計原理

    電子發(fā)燒友網(wǎng)站提供《基于FPGA的ARM并行總線設(shè)計原理.pdf》資料免費下載
    發(fā)表于 10-10 09:31 ?1次下載
    基于<b class='flag-5'>FPGA</b>的ARM<b class='flag-5'>并行</b>總線設(shè)計原理

    verilog中for循環(huán)是串行執(zhí)行還是并行執(zhí)行

    在Verilog中,for循環(huán)并行執(zhí)行的。Verilog是一種硬件描述語言,用于描述和設(shè)計數(shù)字電路和系統(tǒng)。在硬件系統(tǒng)中,各個電路模塊是同時運行的,并且可以并行執(zhí)行多個操作。因此,在V
    的頭像 發(fā)表于 02-22 16:06 ?4454次閱讀