郁 媛,李沛君,王光奇,張德兵,張 春
(清華大學(xué) 集成電路學(xué)院,北京 100084)
同步定位與建圖(VSLAM)系統(tǒng)主要由前端視覺(jué)里程計(jì)、后端優(yōu)化、回環(huán)檢測(cè)、建圖4個(gè)部分構(gòu)成。其中,視覺(jué)里程計(jì)和回環(huán)檢測(cè)部分都需要進(jìn)行特征提取與匹配。已經(jīng)有許多研究[1,2]結(jié)果表明,使用合適的卷積神經(jīng)網(wǎng)絡(luò)(CNN)特征提取代替?zhèn)鹘y(tǒng)方法在精度有明顯提升,因此在VLSAM特征提取部分采用CNN方法,并將其部署在FPGA平臺(tái)上。
當(dāng)前CNN加速器的相關(guān)研究主要從模型壓縮、架構(gòu)訪存優(yōu)化、計(jì)算單元設(shè)計(jì)等方向展開(kāi)。Guo K等提出了一種指令驅(qū)動(dòng)的CNN加速器,并對(duì)模型進(jìn)行了剪枝、量化和編碼,減少了模型的體積[3]。Han S等提出了一種新的編碼方法,并為其設(shè)計(jì)了新的處理單元,提高了處理速度[4]。Chen Y H等討論了調(diào)度策略與數(shù)據(jù)排列策略,充分利用片上數(shù)據(jù)提高了加速器的功耗效率[5]。Wei X等在FPGA上實(shí)現(xiàn)了脈動(dòng)陣列,并通過(guò)改變數(shù)據(jù)復(fù)用模式提高了計(jì)算單元的利用率[6]。Shi F等將Winograd算法運(yùn)用于小規(guī)模的脈動(dòng)陣列架構(gòu)以減少乘法數(shù)量,得到了明顯的性能提升[7]。Zhang C等將全連接層采用與卷積層統(tǒng)一的表示方法,提高了資源利用率[8]。Hasan I等將池化層運(yùn)算融入到卷積層中,增加了加速器的吞吐量[9]。Chen X等提出了動(dòng)態(tài)配置行緩沖區(qū)深度和塊緩沖區(qū)高度,提高了硬件資源效率[10]。
本文采用數(shù)據(jù)分塊與復(fù)用策略設(shè)計(jì)了加速器,基于不同延時(shí)情況設(shè)計(jì)了片上緩沖以減小總延時(shí),提出了Pack/Unpack模塊并對(duì)重新排列了權(quán)重參數(shù)以提高傳輸效率,最終部署在資源量較小的Ultra96開(kāi)發(fā)板上,實(shí)現(xiàn)了高效低能耗目標(biāo),為基于CNN的VSLAM系統(tǒng)加速提供了新的可能。
SuperPoint網(wǎng)絡(luò)[11]是Magic Leap團(tuán)隊(duì)提出的一種用于特征提取與匹配的卷積神經(jīng)網(wǎng)絡(luò),它采用傳統(tǒng)的編解碼(encode-decode)結(jié)構(gòu),網(wǎng)絡(luò)模型如圖1所示。相比著名的特征提取匹配方法包括傳統(tǒng)方法ORB、SIFT和深度學(xué)習(xí)方法LIFT,SuperPoint在特征提取上有著更高的精度,并且受天氣、光照變化影響小,適用于VSLAM系統(tǒng)。

圖1 SuperPoint網(wǎng)絡(luò)模型
原CNN系統(tǒng)中采用32 bit浮點(diǎn)數(shù)的Pytorch架構(gòu),考慮到移動(dòng)平臺(tái)的面積需求與VLSAM系統(tǒng)的速度需求,采用SuperPoint網(wǎng)絡(luò)進(jìn)行特征提取時(shí),先對(duì)網(wǎng)絡(luò)參數(shù)進(jìn)行量化,這意味著可能需要犧牲一些精度,但由于VLSAM系統(tǒng)對(duì)物體追蹤的可靠性要求,在提升速度的同時(shí),必須保證一定的準(zhǔn)確性。
對(duì)于已經(jīng)訓(xùn)練好的權(quán)重和偏置參數(shù)以及第一層特征輸入圖,在網(wǎng)絡(luò)計(jì)算前分別采用Q表示法的定點(diǎn)量化。定點(diǎn)數(shù)xfixed表示的十進(jìn)制數(shù)為
(1)
其中,bw表示定點(diǎn)數(shù)位寬,q表示定點(diǎn)數(shù)階碼,Bi∈{0,1}。
浮點(diǎn)數(shù)xfloat轉(zhuǎn)換為定點(diǎn)數(shù)xfixed
xfixed=(int)(xfloat×2q)
(2)
定點(diǎn)數(shù)xfixed轉(zhuǎn)換回浮點(diǎn)數(shù)x′float
x′float=(float)(xfixed×2-q)
(3)
在給定位寬bw的條件下,求原浮點(diǎn)數(shù)和轉(zhuǎn)換后浮點(diǎn)數(shù)的絕對(duì)誤差和最小的階碼q
q=argminq∑|Xfloat-X′float|
(4)
對(duì)于第一層以外的特征圖參數(shù)則需要先經(jīng)過(guò)每一層運(yùn)算,再對(duì)計(jì)算得到的輸出特征圖量化。需要注意的是,無(wú)論是權(quán)重偏置參數(shù)還是特征圖參數(shù),由于層與層之間數(shù)據(jù)范圍差距較大,如果全部采用相同的Q值會(huì)造成較大的誤差,因此需要根據(jù)每層的結(jié)果動(dòng)態(tài)計(jì)算各自的最佳Q值。
文獻(xiàn)[12]中加速器采用8 bit位寬量化,取得了較高的吞吐量,但8 bit位寬量化的最大表示范圍為-127~128,SuperPoint網(wǎng)絡(luò)中權(quán)重參數(shù)取值范圍為-192.08~197.24,若采用8 bit量化會(huì)有很大誤差,而16 bit位寬量化的最大表示范圍為-32 768~32 767,可以滿足參數(shù)范圍需求。采用16 bit位寬對(duì)權(quán)重偏置以及各特征圖層動(dòng)態(tài)量化,量化系數(shù)見(jiàn)表1。可以看出采用16 bit量化產(chǎn)生的誤差不超過(guò)0.15%,幾乎不影響網(wǎng)絡(luò)描述子的準(zhǔn)確性,并且在滿足精度要求的前提下,將網(wǎng)絡(luò)參數(shù)空間壓縮了一半,同時(shí)可以提高計(jì)算效率,適用于對(duì)精度速度要求都很高的VSLAM系統(tǒng)。

表1 網(wǎng)絡(luò)各層參數(shù)量化系數(shù)
FPGA上的主要資源包括BRAM、DSP、LUT和FF,應(yīng)用于CNN加速時(shí),BRAM主要用來(lái)存儲(chǔ)特征圖與權(quán)重參數(shù),DSP和LUT主要用于乘加單元計(jì)算,此外LUT還可以用于形成數(shù)據(jù)調(diào)度需要的簡(jiǎn)單邏輯如選擇器和累加器,而FF主要用于存儲(chǔ)一些中間結(jié)果。
然而無(wú)論是存儲(chǔ)資源還是計(jì)算資源,F(xiàn)PGA片上的資源都較為有限,難以滿足網(wǎng)絡(luò)計(jì)算需求,往往需要采用循環(huán)分塊、數(shù)據(jù)復(fù)用等手段高效利用FPGA資源。
卷積運(yùn)算是CNN網(wǎng)絡(luò)中計(jì)算量最大的部分,一般的三維卷積由六重循環(huán)構(gòu)成。但如前所述,不能把六重循環(huán)中數(shù)據(jù)全部放到BRAM當(dāng)中,因此需要在其中一些維度分塊。其中卷積核長(zhǎng)、寬兩個(gè)維度由于自身尺寸較小一般沒(méi)有分塊的必要,分塊主要在輸入特征圖通道維度、輸出特征圖通道維度、輸出特征圖長(zhǎng)、寬共4個(gè)維度進(jìn)行。外層循環(huán)需要按照分塊尺寸,分別讀入輸入特征圖、權(quán)重偏置參數(shù),以及傳出輸出特征圖。
為了減少片內(nèi)外訪存次數(shù),對(duì)輸出特征圖的中間結(jié)果進(jìn)行復(fù)用,將不同塊不同通道的中間結(jié)果累加后再輸出。
分塊后除了外層的四重循環(huán),在內(nèi)部還有針對(duì)圖塊卷積操作的六重循環(huán)。結(jié)合FPGA上計(jì)算資源數(shù)量,在輸入特征圖通道和輸出特征圖通道兩個(gè)維度展開(kāi)多個(gè)并行的乘加運(yùn)算。
在輸入特征圖通道維度以展開(kāi)度TChin展開(kāi)時(shí),需要TChin個(gè)乘法器、一個(gè)深度為log2(TChin) 的加法器;在輸出特征圖通道維度以TChout展開(kāi)時(shí),需要TChout個(gè)乘法器和TChout個(gè)累加器。綜上,在輸入和輸出特征圖通道兩個(gè)維度展開(kāi)時(shí),需要TChout×TChin個(gè)乘法器、TChout個(gè)log2(TChout) 深度的加法樹(shù)和TChout個(gè)2輸入選擇器和累加器,如圖2所示。

圖2 計(jì)算單元展開(kāi)
為了匹配片上計(jì)算速度與片內(nèi)外傳輸速度,在片上設(shè)置行緩沖區(qū)域,用于緩沖片內(nèi)外交互的數(shù)據(jù)。為了減少加速器總時(shí)延,可以采用雙緩沖方式將它們相互重疊。
若計(jì)算延時(shí)大于傳輸延時(shí),僅對(duì)塊緩沖采用雙緩沖策略,緩沖電路如圖3(a)所示,Buffer0參與計(jì)算陣列運(yùn)算的同時(shí),Buffer1從DRAM中讀取下一次計(jì)算需要的數(shù)據(jù),當(dāng)Buffer0的運(yùn)算完成,計(jì)算陣列無(wú)需等待直接處理Buffer1數(shù)據(jù),Buffer0讀取新的數(shù)據(jù)。
若傳輸延時(shí)大于計(jì)算延時(shí),則對(duì)塊緩沖和行緩沖同時(shí)采用雙緩沖策略,緩沖電路如圖3(b)所示,Tile_Buffer0參與計(jì)算陣列運(yùn)算時(shí),若DRAM到Line_Buffer1的片內(nèi)外傳輸完成,即進(jìn)行Line_Buffer1到Tile_Buffer1的片上傳輸,DRAM到Line_Buffer0的片內(nèi)外傳輸也并行開(kāi)展。
為了充分利用片上存儲(chǔ)資源,對(duì)于不同圖層,應(yīng)該能夠?qū)υO(shè)計(jì)的輸入輸出的塊緩沖及行緩沖實(shí)現(xiàn)分時(shí)復(fù)用。而當(dāng)輸出特征圖塊尺寸相同時(shí),卷積和池化層的輸入特征圖塊大小需求不同。
考慮卷積層的四周填充(padding),輸入特征圖的長(zhǎng)和寬應(yīng)該分別是輸出特征圖的長(zhǎng)和寬加2,而對(duì)于2x2的最大池化層,輸入特征圖的場(chǎng)和寬則應(yīng)該分別是輸出特征圖的長(zhǎng)和寬乘2。但復(fù)用的輸入特征圖尺寸不能是簡(jiǎn)單取二者最大值的關(guān)系,需要考慮實(shí)際讀取數(shù)據(jù)的初始位置,如圖4所示,輸入特征圖的長(zhǎng)寬應(yīng)分別設(shè)置為輸出特征圖的長(zhǎng)寬的2倍加1。

圖4 特征圖塊尺寸
需要注意的是,運(yùn)算速度的提高未必能直接反映到系統(tǒng)整體處理速度上,因?yàn)橄到y(tǒng)處理速度還受到數(shù)據(jù)傳輸速度的影響,適當(dāng)增加傳輸帶寬、降低片外訪存的次數(shù)可以減少數(shù)據(jù)傳輸時(shí)間。
特征圖參數(shù)總參數(shù)量較大,各層輸入數(shù)據(jù)依賴于上層的輸出數(shù)據(jù),又由于片內(nèi)外數(shù)據(jù)傳輸與片內(nèi)計(jì)算并行開(kāi)展,不能直接令輸出數(shù)據(jù)覆蓋原輸入數(shù)據(jù)地址,否則可能導(dǎo)致錯(cuò)誤。
因此,特征圖存儲(chǔ)空間大小的確定應(yīng)該參考輸入特征圖加上輸出特征圖參數(shù)量最大的圖層,在此處應(yīng)該是表1中的Conv1b層。首先將初始輸入圖片存入存儲(chǔ)空間首部,并將經(jīng)過(guò)卷積的第一層輸出特征圖存入存儲(chǔ)空間尾部,其指針指向的位置取決于這一層輸出特征圖的數(shù)據(jù)量,而下一層輸入指針即為這一層的輸出指針,下一層的輸出指針重新指向存儲(chǔ)空間首部,之后的圖層指針則按照此規(guī)律在存儲(chǔ)空間首尾交替賦值,并結(jié)合各層的數(shù)據(jù)量確定。
需要注意的是ConvPa層與ConvDa層的輸入同為Conv4b層的輸出,因此Conv4b后的各層特征圖指針時(shí)應(yīng)避免覆蓋Conv4b層的輸出特征圖數(shù)據(jù),此外由于ConvPb層的輸出數(shù)據(jù)后續(xù)還要用于網(wǎng)絡(luò)特征點(diǎn)的計(jì)算,也應(yīng)避免被其它數(shù)據(jù)覆蓋。最終各層特征圖指針如圖5所示。

圖5 特征圖指針
特征圖數(shù)據(jù)與權(quán)重偏置數(shù)據(jù)的片內(nèi)外傳輸采取AXI4接口的突發(fā)傳輸機(jī)制。相比于AXI4-Lite接口,AXI4接口數(shù)據(jù)傳輸具有高效性、吞吐量大的優(yōu)點(diǎn)。
根據(jù)文獻(xiàn)[8]可知,在傳輸數(shù)據(jù)量相同的情況下,數(shù)據(jù)的連續(xù)性越強(qiáng),傳輸帶寬越大。不難得知在分塊之后,傳輸?shù)膮?shù)連續(xù)性變差,如權(quán)重參數(shù),在輸入特征圖通道維度的連續(xù)性從Chin變成TChin,并因此在輸出特征圖通道維度失去連續(xù)性。而權(quán)重參數(shù)作為已知參數(shù),可以在傳輸前重新排布增強(qiáng)其連續(xù)性,并且不占用加速器處理時(shí)間。
如圖6所示,圖左側(cè)為分塊后的權(quán)重參數(shù),其中Chin和TChin分別為分塊前后的輸入通道數(shù),Chout和TChout分別為分塊前后的輸出通道數(shù),圖右上側(cè)為未重排的權(quán)重參數(shù)排列,依次在權(quán)重長(zhǎng)寬維度K2、輸入通道維度Chin、輸出通道維度Chout排列,分塊導(dǎo)致連續(xù)數(shù)據(jù)數(shù)僅為K2×TChin。圖右下側(cè)為重排序后的權(quán)重參數(shù)排列,依次在輸入通道維度Chin、輸出通道維度Chout、權(quán)重長(zhǎng)寬維度K2排列,可以將分塊后一次傳輸?shù)倪B續(xù)數(shù)據(jù)從K2×TChin增加到K2×TChin×TChout,也就是連續(xù)性最大提高到原來(lái)的TChout倍,當(dāng)TChout取值較大時(shí),有著顯著的效果。當(dāng)然,連續(xù)傳輸?shù)臄?shù)據(jù)量不應(yīng)該超過(guò)AXI4總線數(shù)據(jù)傳輸允許的最大長(zhǎng)度256,如果超過(guò)則應(yīng)考慮分次突發(fā)傳輸。

圖6 權(quán)重參數(shù)重排
特征圖與權(quán)重偏置數(shù)據(jù)定點(diǎn)量化為16 bit數(shù)據(jù),根據(jù)AXI4接口突發(fā)傳輸?shù)奶匦钥芍绻麄鬏數(shù)臄?shù)據(jù)位寬小于總線允許位寬,總線不會(huì)自動(dòng)拼接數(shù)據(jù),而是屏蔽多余數(shù)據(jù)線,僅使用部分?jǐn)?shù)據(jù)線進(jìn)行傳輸。AXI4突發(fā)傳輸最大支持到1024 bit位寬,而實(shí)驗(yàn)選取的開(kāi)發(fā)板HP接口的物理數(shù)據(jù)位寬是128 bit,因此最大支持128 bit位寬的數(shù)據(jù)傳輸,如果直接傳輸此數(shù)據(jù)則浪費(fèi)了AXI總線與開(kāi)發(fā)板芯片HP接口所允許的最大傳輸位寬。
為了充分利用帶寬,提高帶寬利用率,理論上當(dāng)一次突發(fā)傳輸?shù)拈L(zhǎng)度與AXI4總線傳輸?shù)淖畲箝L(zhǎng)度保持一致、位寬與開(kāi)發(fā)板對(duì)應(yīng)芯片HP接口的物理位寬保持一致時(shí)可以達(dá)到最大的傳輸帶寬。而要實(shí)現(xiàn)更大的傳輸位寬,首先需要先對(duì)數(shù)據(jù)進(jìn)行拼接。
在實(shí)際應(yīng)用中,一方面,數(shù)據(jù)拼接需要考慮到對(duì)齊問(wèn)題,如果數(shù)據(jù)量不能被拼接個(gè)數(shù)整除,則會(huì)出現(xiàn)數(shù)據(jù)覆蓋導(dǎo)致的錯(cuò)誤;另一方面,數(shù)據(jù)傳輸?shù)膸拺?yīng)與加速器PE單元能達(dá)到的計(jì)算速度相匹配,否則這樣的帶寬提高就失去了意義。結(jié)合當(dāng)前加速器的分塊尺寸,將兩個(gè)16 bit數(shù)據(jù)拼接成32 bit數(shù)據(jù)進(jìn)行傳輸,在滿足數(shù)據(jù)對(duì)齊要求的前提下將原來(lái)的傳輸速度提高了兩倍。
為實(shí)現(xiàn)數(shù)據(jù)拼接,在讀寫(xiě)模塊里添加“pack”和“unpack”模塊。“pack”模塊用于將輸出緩沖中數(shù)據(jù)的截?cái)嗪蛢蓛善唇樱賯鬟f到輸出行緩沖中等待輸出數(shù)據(jù)的突發(fā)傳輸;“unpack”模塊則用于將輸入行緩沖中的每個(gè)數(shù)據(jù)分割成兩個(gè)數(shù)據(jù)存儲(chǔ)到輸入緩沖中的相應(yīng)位置,如圖7所示。

圖7 輸出特征圖數(shù)據(jù)通路
圖7為輸出特征圖數(shù)據(jù)通路,其中output buffer為經(jīng)過(guò)片上計(jì)算單元得到的輸出特征圖數(shù)據(jù),數(shù)據(jù)位寬為32 bit,是由多個(gè)16 bit輸入數(shù)據(jù)經(jīng)過(guò)乘累加運(yùn)算的結(jié)果。為了保持下一層輸入數(shù)據(jù)仍為16 bit定點(diǎn)數(shù),Pack模塊需要將32 bit輸出數(shù)據(jù)截?cái)酁?6 bit數(shù)據(jù),為了增加片內(nèi)外數(shù)據(jù)交互位寬,Pack需要將兩個(gè)經(jīng)過(guò)截?cái)嗟?6 bit數(shù)據(jù)再次拼接為新的32 bit數(shù)據(jù),并將它們分發(fā)到輸出行緩沖line buffer中。當(dāng)行緩沖的數(shù)據(jù)全部收集完畢,將根據(jù)計(jì)算的片外指針地址進(jìn)行一次突發(fā)傳輸,將行緩沖數(shù)據(jù)存儲(chǔ)到片外DRAM相應(yīng)的位置。此外圖中的兩個(gè)通道為多通道數(shù)據(jù)傳輸,它們可以并行進(jìn)行片內(nèi)數(shù)據(jù)截?cái)嗪推唇右约巴话l(fā)傳輸過(guò)程,多通道傳輸將在下一小節(jié)詳述。
如上文所述,在開(kāi)發(fā)板上資源被較好利用的情況下,假設(shè)計(jì)算效率保持在一定的水平,最可能影響到加速器效率的關(guān)鍵因素則為片內(nèi)外傳輸效率。因此需要合理提高帶寬利用率,使得數(shù)據(jù)傳輸速度與計(jì)算速度盡可能地匹配。
如果在輸出與輸入特征圖數(shù)維度分別以TChout和TChin為展開(kāi)因子展開(kāi),則加速器至少需要TChout×TChin個(gè)乘加單元用于卷積運(yùn)算。當(dāng)TChout=32,TChin=4時(shí),乘加單元個(gè)數(shù)為128。
根據(jù)式(5),當(dāng)加速器工作頻率為150 M時(shí),128個(gè)乘加單元每秒能處理19.2 G個(gè)16位定點(diǎn)數(shù),即計(jì)算速率達(dá)到了38.4 GB/s
Scompute=f×NMAC×wcompute
(5)
其中,f為加速器工作頻率,NMAC為乘加單元數(shù),wcompute為計(jì)算數(shù)據(jù)位寬。
但需要注意的是這些計(jì)算單元中有大量相同數(shù)據(jù),其中,相同的輸入特征圖數(shù)據(jù)同時(shí)進(jìn)行了TChout次運(yùn)算,因此為了讓傳輸速率與計(jì)算速率相匹配,實(shí)際輸入特征圖的帶寬需求為38.4GB/s ÷32=1.2GB/s。
根據(jù)式(6),對(duì)于150 M頻率下32 bit位寬傳輸?shù)囊粋€(gè)AXI接口最高所能達(dá)到的帶寬為32bit/8bit*150M=0.6 GB/s,至少需要兩個(gè)AXI接口,但考慮到突發(fā)傳輸長(zhǎng)度有限,實(shí)際能達(dá)到的帶寬僅為計(jì)算帶寬的60%,因此這里采用4個(gè)AXI接口
BWtrans=f×wtrans
(6)
其中,f為加速器工作頻率,wtrans為傳輸數(shù)據(jù)位寬。
綜上,加速器合適的數(shù)據(jù)傳輸?shù)耐ǖ纻€(gè)數(shù)計(jì)算如下式
(7)
其中,uBW為帶寬利用率,TChout為輸出特征圖通道展開(kāi)度。
圖8為包括PS(processing system)和PL(progarmmable logic)端的SoC系統(tǒng)架構(gòu),DRAM為片外主要存儲(chǔ)單元,BRAM為片上主要存儲(chǔ)單元。CPU需要從DDR中讀取數(shù)據(jù)并將其傳遞給PL端。SuperPoint加速器對(duì)外有5個(gè)AXI4 Master接口和一個(gè)AXI-Lite Slave接口,分別對(duì)應(yīng)于PS端的4個(gè)AXI HP Slave接口和一個(gè)AXI HPM Master接口,當(dāng)PS端的Slave接口與SuperPoint加速IP的Master接口數(shù)不匹配時(shí)可以采用AXI互聯(lián)模塊拓展接口。AXI4總線接口用于輸入特征圖、權(quán)重參數(shù)的讀取,由于AXI4接口讀寫(xiě)通道獨(dú)立,輸出特征圖的寫(xiě)回也采用其中兩個(gè)AXI4接口完成,AXI-Lite接口主要用于傳輸一些狀態(tài)和控制信號(hào)。加速器內(nèi)部主要由各數(shù)據(jù)的行緩沖、塊緩沖、計(jì)算陣列以及Pack和Unpack模塊構(gòu)成。

圖8 SoC系統(tǒng)架構(gòu)
采用Avnet Ultra96-V2作為SoC系統(tǒng)驗(yàn)證平臺(tái),如圖9所示。Ultra96-V2采用Xilinx Zynq UltraScale+ MPSoC ZU3EG A484芯片,PS部分搭載ARM Cortex-A53處理器,工作頻率為1.5 GHz;PL端為基于16 nm FinFET+工藝的可編程邏輯陣列。開(kāi)發(fā)板大小為85mm×54mm,相比于其它FPGA平臺(tái)具有面積小、便攜的優(yōu)勢(shì),平臺(tái)資源包括有2 GB的LPDDR4存儲(chǔ)、7.6 Mbit的BRAM存儲(chǔ)、1.8 Mbit分布式存儲(chǔ)、360個(gè)DSP資源。通過(guò)J1-USB3 Device接口連接開(kāi)發(fā)板與計(jì)算機(jī),計(jì)算機(jī)即可采用串口連接方式訪問(wèn)開(kāi)發(fā)板系統(tǒng)終端,或采用Jupyter界面訪問(wèn)系統(tǒng)。

圖9 Avnet Ultra96-V2 FPGA平臺(tái)
為了提高開(kāi)發(fā)效率,本文采用了相比傳統(tǒng)設(shè)計(jì)更加自動(dòng)化的高層次綜合工具。首先采用C++語(yǔ)言實(shí)現(xiàn)SuperPoint網(wǎng)絡(luò)并在軟件端驗(yàn)證其功能,然后添加編譯指令以約束硬件結(jié)構(gòu),采用Vivado HLS平臺(tái)將其綜合為RTL級(jí)硬件代碼,并將其打包為一個(gè)IP。將加速器模塊IP與Zynq開(kāi)發(fā)板添加到vivado平臺(tái)的Block Design界面,設(shè)置開(kāi)發(fā)板的HP接口參數(shù)并連接到加速器模塊的相應(yīng)數(shù)據(jù)和控制信號(hào)接口,添加時(shí)鐘復(fù)位模塊、AXI互聯(lián)模塊等。如圖10為SoC系統(tǒng)連接示意圖,在Vivado平臺(tái)連接好SoC系統(tǒng)后,再依次進(jìn)行綜合與布局布線,最后生成整個(gè)系統(tǒng)的比特流文件。

圖10 SoC系統(tǒng)連接
實(shí)驗(yàn)采用TUM RGB-D數(shù)據(jù)集進(jìn)行網(wǎng)絡(luò)推理,由于SuperPoint網(wǎng)絡(luò)的輸入是單通道圖片,因此對(duì)于非灰度圖片如RGB三通道圖片需要首先轉(zhuǎn)換成灰度圖。其次,對(duì)于不同的初始輸入圖像尺寸,應(yīng)調(diào)整到某一固定尺寸,經(jīng)過(guò)軟件端測(cè)試,將尺寸固定為1*480*320,此時(shí)的系統(tǒng)精度以及速度達(dá)到了較好的平衡,完成一張圖片的推理計(jì)算量為26.063 GOPs。為了方便網(wǎng)絡(luò)各層不同尺寸的特征圖在FPGA上同一空間存儲(chǔ),將三維特征圖轉(zhuǎn)換成一維數(shù)組。
將Vivado生成的比特流文件燒錄到FPGA開(kāi)發(fā)板上,編寫(xiě)PS端控制程序以載入加速器IP,完成圖片預(yù)處理與數(shù)據(jù)量化,即可調(diào)用IP計(jì)算完成網(wǎng)絡(luò)推理。
表2是加速器在不同平臺(tái)的性能比較,包括Intel I5的CPU平臺(tái)、U96開(kāi)發(fā)板上的ARM A53 CPU平臺(tái)以及U96異構(gòu)平臺(tái),其中,在僅使用CPU運(yùn)行的兩個(gè)平臺(tái)上,采用了最優(yōu)編譯選項(xiàng)-O3。可以看到,U96異構(gòu)平臺(tái)上的加速器延時(shí)要遠(yuǎn)低于這兩個(gè)CPU平臺(tái),性能達(dá)到了每秒25.63 G次運(yùn)算,約為ARM-A53的100倍、Intel Core的15倍。

表2 不同設(shè)備性能對(duì)比
表3是本文提出的加速器與其它相似工作的比較。由于不同F(xiàn)PGA平臺(tái)的計(jì)算資源與存儲(chǔ)資源有較大差異,這里采取了常用的結(jié)合相應(yīng)資源的性能指標(biāo)。其中,BRAM效率被定義為每個(gè)BRAM塊的平均吞吐量,DSP效率被定義為每個(gè)DSP單元的平均吞吐量,功耗效率被定義為每單位功耗的平均吞吐量。性能密度被定義為FPGA上每面積單元(SLICE)的平均吞吐量,可以代表與FPGA平臺(tái)無(wú)關(guān)的加速器設(shè)計(jì)效率。

表3 與其它工作的性能對(duì)比
由于本文采用的FPGA板上資源數(shù)較少,加速器的吞吐量低于表中前兩項(xiàng)工作,但從表中的最后4行可以看出,無(wú)論是BRAM效率、DSP效率、性能密度還是功耗效率,本文都明顯優(yōu)于其它工作,并且滿足了低功耗的需求。
本文針對(duì)VSLAM系統(tǒng)中的SuperPoint模型,提出了一種基于16位動(dòng)態(tài)定點(diǎn)量化的CNN加速器并構(gòu)建了包含ARM處理器在內(nèi)的SoC系統(tǒng)。通過(guò)循環(huán)分塊、數(shù)據(jù)復(fù)用、計(jì)算單元展開(kāi)、雙緩沖策略提高了片上資源利用率,并提出了在不同類型圖層間復(fù)用片上緩存。為提高突發(fā)傳輸帶寬,采用了多個(gè)通道傳輸,提出了Pack模塊和Unpack模塊,并預(yù)先重排數(shù)據(jù)增加了突發(fā)傳輸長(zhǎng)度。整個(gè)SoC系統(tǒng)部署在Ultra96-V2平臺(tái)上達(dá)到了可觀的吞吐量,并滿足了低功耗需求,為VLSAM系統(tǒng)在FPGA上的部署提供了新的思路。