張雲(yún)軻 劉丹
摘 要:針對TINY YOLO車輛檢測算法計算量過大,且在小型嵌入式系統(tǒng)中難以達到實時檢測要求的問題。利用小型Zynq SoC系統(tǒng)的架構優(yōu)勢以及TINY YOLO的網(wǎng)絡權值中存在大量接近零的權值參數(shù)這一特點,提出硬件并行加速的改進算法,稱為濃縮小型深度網(wǎng)絡(Xerantic-TINY YOLO, X-TINY YOLO)車輛檢測算法。首先對TINY YOLO中網(wǎng)絡結構進行壓縮;其次采用高效多級流水線、流水線內(nèi)全并行的方式對卷積計算部分進行算法加速;最后提出與網(wǎng)絡結構相配合的數(shù)據(jù)切割和傳輸方案。實驗結果表明,X-TINY YOLO僅消耗50%的片內(nèi)硬件資源,可在相對于GPU和CPU性價比更高更適合嵌入式場景的Zynq SoC系統(tǒng)上實現(xiàn),且其檢測速度達到24幀/s,滿足車輛檢測的實時性要求。
關鍵詞:車輛檢測;機器視覺;TINY YOLO;Zynq-7020;硬件加速
中圖分類號: TP389.1; TP391.413
文獻標志碼:A
Abstract: TINY YOLO (TINY You Only Look Once) vehicle detection algorithm requires much amount of calculation which makes it difficult to achieve real-time detection in small embedded systems. Because plenty of zero values exist in a network weight matrix which makes the network a sparse structure, an improved version of TINY YOLO vehicle detection algorithm, called Xerantic-TINY YOLO (X-TINY YOLO), was proposed and accelerated in parallel way using architectural advantages of small Zynq SoC system. Original network structure of TINY YOLO was compressed and the operations of convolution steps were accelerated in parallel by using high efficient multistage pipeline. All multiply-add operations were concurrently executed within each stage of pipeline. By matching network structure, a method of data segmentation and transfer was also proposed. The experimental results show that, X-TINY YOLO only consumes 50% hardware resources on chip, and it can be implemented on small Zynq SoC systems which have higher performance-price ratio than GPU and CPU and is suitable for embedded implementation scenes. Its detection speed reaches 24 frames per second, which meets the requirement of real-time vehicle detection.
Key words: vehicle detection; machine vision; TINY You Only Look Once (TINY YOLO); Zynq-7020; hardware acceleration
0 引言
實時車輛檢測算法主要分為三類:基于先驗知識的車輛檢測算法[1-2]、基于淺層機器的學習車輛檢測算法以及基于深度學習的車輛檢測算法[3]?;谙闰炛R的檢測算法是根據(jù)車身所帶有的線條、陰影或邊緣特征對前方車輛進行識別。文獻[4]通過對車輛尾部特定水平直線(如保險杠、后車窗下邊沿等)的檢測達到車輛檢測目的。該算法易將車身周邊環(huán)境中存在的類似直線誤判為車輛,且對處于轉彎狀態(tài)的車輛會出現(xiàn)檢測丟失現(xiàn)象。文獻[5]中提出對剎車燈進行檢測的方法實現(xiàn)車輛夜間檢測,效果較好但無法應用于外部光強較好的白天或地下停車場等環(huán)境。行駛中車輛周邊環(huán)境的多樣性常常會以噪聲形式干擾此類檢測方法準確率,故此類方法難以在環(huán)境變化劇烈的使用場景中適用?;跍\層機器學習的車輛檢測算法以先驗知識類算法中提取的車輛特征為基礎,結合機器學習算法實現(xiàn)車輛的檢測。文獻[6]中提出Haar-like與Online Boosting相結合的方式,使用大量特征集對網(wǎng)絡進行訓練使其能檢測車輛,與單純的先驗知識檢測相比該算法在各種環(huán)境中的魯棒性有了顯著提高。文獻[7]對Haar-like特征進行了優(yōu)化,提升了該特征對環(huán)境中光強變化的適應性。該類算法特點是檢測效率高、復雜度低,但依然嚴重依賴特征選取,使得其在復雜且變化的路況場景下重建模工程量大?;谏疃葘W習的車輛檢測算法多以卷積神經(jīng)網(wǎng)絡為基礎加以改進,文獻[8]中提出的Faster R-CNN(Faster Region proposal Convolutional Neural Network請補充Faster R-CNN的英文全稱)通過聚類方式對車輛尺寸進行分類,隨后使用高分辨率圖片作為網(wǎng)絡輸入,最后在KITTI數(shù)據(jù)集上獲得了較高的車輛檢測精度,但其卷積層數(shù)過多導致網(wǎng)絡計算復雜度過大而難以實現(xiàn)實時性檢測。在網(wǎng)絡模型的小型化方向上,F(xiàn)acebook的人工智能實驗室設計了更輕巧的模型YOLO(You Only Look Once)[9],其最快版本的TINY YOLO在GPU上的測試速度可以達到每秒200幀。各版本YOLO算法的出現(xiàn)為深度學習類的目標檢測算法在實際運用場景的實時性檢測提供了可能。
深度學習算法的硬件加速方案主要有以下四種:圖形處理器(Graphic Processing Unit, GPU)、專用集成電路(Application-Specific Integrated Circuit, ASIC)、粒度可重構陣列和現(xiàn)場可編程門陣列(Field-Programmable Gate Array, FPGA)。
利用GPU數(shù)千個計算核心并行計算的優(yōu)勢,文獻[10-12]中提出的GPU加速方案,相比CPU上實現(xiàn)的深度學習算法在運算速度和功耗方面均有較大提升,然而中低端GPU多核之間共享存儲(share memory)資源少難以完成算法移植,而高端GPU芯片昂貴的價格難以在短時間內(nèi)為工業(yè)級應用所接受。文獻[13]基于深度神經(jīng)網(wǎng)絡結構特點設計的由64塊ASIC芯片組成的超級加速器DaDianNao在加速性能方面是GPU的450.65倍,功耗僅為CPU的0.67%,性能達到極致;然而各版本神經(jīng)網(wǎng)絡的網(wǎng)絡結構間存在較大差異,而ASIC專用芯片的可變性較差,故其較適用于作為某些結構固定的網(wǎng)絡的專用加速器。文獻[14]基于單指令多數(shù)據(jù)流(Single Instruction Multiple Data, SIMD)架構,引入FPGA可編程邏輯電路,實現(xiàn)了可重構硬件的神經(jīng)網(wǎng)絡加速方案。其與文獻[15-16]中提出的基于FPGA架構的加速器均可提供多種神經(jīng)網(wǎng)絡的實現(xiàn)方案,然而其缺少核心處理器,在實現(xiàn)較復雜的分支任務繁多的算法上有一定難度。
使用Zynq SoC架構對深度神經(jīng)網(wǎng)絡算法進行加速的研究還較少。Zynq SoC在架構方面結合了ARM(Acorn RISC Machine)嵌入式處理核心和FPGA可編程邏輯電路兩方面的優(yōu)勢,提供較強的流程控制的同時可實現(xiàn)多個高速并行的乘加運算,而卷積神經(jīng)網(wǎng)絡的主要計算量集中于卷積層中的矩陣乘加運算,故其非常適用于卷積神經(jīng)網(wǎng)絡的檢測算法加速,且該系列芯片在價格上相比FPGA和GPU均有較大優(yōu)勢。
綜上所述,本文針對實際應用場景中車輛檢測算法對實時性要求高這一特點,選擇YOLO算法的快速版本TINY YOLO作為算法基礎,并對網(wǎng)絡作出裁剪優(yōu)化進一步降低算法復雜度;再選擇相比GPU等硬件平臺性價比更高的小型Zynq SoC平臺作為加速算法的硬件平臺;通過Zynq SoC平臺內(nèi)的數(shù)字信號處理(Digital Signal Processing, DSP)并行計算資源和流水線技術,最終在千元以內(nèi)的硬件平臺上實現(xiàn)車輛實時檢測算法。
1.1 網(wǎng)絡結構壓縮
TINY YOLO檢測算法是YOLO V2目標檢測算法的簡化網(wǎng)絡,相比原YOLO V2算法而言,其運算量減少,伴隨著精度的降低,但作為在系統(tǒng)內(nèi)部硬件資源極度有限的小型Zynq SoC中實現(xiàn)的嵌入式算法,TINY YOLO依然存在著網(wǎng)絡規(guī)模過大導致計算量過大的缺點,從而使得其在實際應用場景下檢測的實時性無法得到滿足,故算法中首先需考慮對TINY YOLO網(wǎng)絡進行裁剪。
TINY YOLO網(wǎng)絡中包含三種傳遞結構:卷積層、全連接層和最大池化層。卷積層的計算過程如圖1所示。
feature map是每一層的輸入特征矩陣,由圖1可見卷積運算中存在大量的矩陣乘加運算,所以耗時最多。又因為Zynq SoC系統(tǒng)中有可用于乘加運算加速的專用數(shù)字信號處理單元DSP48E硬IP核資源,可對乘加運算進行并行計算加速,故考慮利用FPGA(簡稱為PL端)資源對卷積層進行并行計算加速。最大池化層是滑動地取2×2網(wǎng)格中的最大值,可以緊接在卷積乘加運算之后而無需耗費更多的硬件資源。對于全連接層,雖然計算量較大,但在TINY YOLO的16層網(wǎng)絡結構中只有最后一層是全連接層,若移植至FPGA端(PL端)將占用較多資源且對速度提升不明顯,故選擇將全連接層直接放在ARM端(簡稱為PS端)串行運行。
通過以上分析發(fā)現(xiàn),對TINY YOLO網(wǎng)絡進行移植時的主要計算量源于卷積層中的大量乘加運算,故考慮裁剪卷積層從而減少計算規(guī)模。通過觀察TINY YOLO網(wǎng)絡訓練后的卷積核中的權值發(fā)現(xiàn),該網(wǎng)絡第3到第9層卷積層中存在著大量接近0的權值。通過對比實驗發(fā)現(xiàn),這樣的網(wǎng)絡稀疏性會帶來少量的網(wǎng)絡性能提升,但伴隨著成倍的計算量的增加(表1)。故嘗試在性能不會有過大減小的情況下,在網(wǎng)絡訓練前對TINY YOLO第3到第9層卷積層的輸入卷積核個數(shù)進行裁剪,從而使得重新訓練后得到的新網(wǎng)絡(X-TINY YOLO)中接近于0的權值個數(shù)減少,最后得出縮小規(guī)模后的網(wǎng)絡權值用于嵌入式移植。
裁剪后X-TINY YOLO網(wǎng)絡結構下新網(wǎng)絡權值的訓練方法是先用ImageNet數(shù)據(jù)集和MS COCO2007+2012數(shù)據(jù)集對網(wǎng)絡進行預訓練,待網(wǎng)絡參數(shù)穩(wěn)定后再用收集和標定的2000張圖片集(行駛車輛前方的路況圖片),對網(wǎng)絡后3層負責分類的網(wǎng)絡進行再訓練,從而進一步提升網(wǎng)絡對具體的車輛檢測任務數(shù)據(jù)的擬合效果。訓練后得出的X-TINY YOLO網(wǎng)絡與原TINY YOLO網(wǎng)絡的各卷積層輸入feature map的結構的對比如圖2。
如圖2所示,在訓練時對上述層的輸入卷積核數(shù)量進行了控制,從而減少了對相應卷積層輸入的feature map通道個數(shù),其中第二卷積層的訓練所用卷積核個數(shù)由原來的32個減小為24個,之后每一個卷積層訓練所用卷積核個數(shù)減半。網(wǎng)絡理論總計算量如式(1):
其中:w、h和in_c分別表示單層卷積層輸入feature map的寬、高和通道數(shù),k_sizek_size如何能有兩種含義,即是寬,又是高,是否少了一個變更,請明確表示輸入卷積核的寬和高k_size2 表示卷積核二維尺寸面積,out_c表示卷積核數(shù)量。
訓練后的網(wǎng)絡性能及計算量對比統(tǒng)計如表1,其中mAP(mean Average Precision)為平均精度指標。
TINY YOLO網(wǎng)絡中引入了Batch Normalization(BN)的操作來解決訓練中的梯度爆炸和收斂速度慢等問題,故在Zynq SoC平臺實現(xiàn)檢測網(wǎng)絡的前向傳播時,每一層的卷積運算之后還需要進行BN操作,其輸出output的具體公式如式(2)所示:
其中:w為該層的權值矩陣,d為該層輸入的feature map矩陣,m為單張feature map均值,v為單張feature map方差,b為偏移向量(bias),s為縮放系數(shù)向量(scale)。若每一次的結果都進行這樣的運算,將在檢測環(huán)節(jié)耗費過多時間,而這些參數(shù)中,w、m、v、s、b通過網(wǎng)絡訓練后都成為已知參數(shù),即在網(wǎng)絡初始化時已知且不會再改變的數(shù)值,僅d需要用到上一層的計算結果。故對式(2)進行化簡得到式(3):
按照式(3)在網(wǎng)絡初始化時提前對參數(shù)進行處理,之后網(wǎng)絡前向傳播時用新生成的和b替代原權值矩陣w和偏移b進行運算。通過這種方法,用網(wǎng)絡初始化時間增加的成本換取了實時檢測計算時間的縮減。
1.2 數(shù)據(jù)分割算法
由于X-TINY YOLO算法中存在大量卷積運算,即矩陣乘法運算(如圖1),若將大量乘加運算放置在Zynq SoC平臺的FPGA端(PL端)進行,就可利用多片數(shù)字信號處理單元——DSP48E內(nèi)核對多個乘加運算并行從而提升計算效率,但小型SoC平臺包含的DSP48E和塊隨機存儲單元(Block RAM, BRAM)的數(shù)量有限,遠遠小于X-TINY YOLO每一層的計算及存儲所需要的資源數(shù)量,例如圖2中第一層卷積層的輸入圖片尺寸是224×224×3,輸入權值規(guī)模是3×3×3×16,若一次性傳入PL端則共需要150960個BRAM存儲單元,之后進行224×224×16×3×3×3(共21676032)次乘加運算,而以Xilinx公司旗下Zynq-7020系列中的XC7Z020芯片為例,其PL端僅僅有4.9MB(最多可分為280片)BRAM存儲單元和220個DSP48E片上IP核,只可同時并行220個25×18位的乘加運算,遠遠小于該層卷積計算全并行所需資源。
故考慮根據(jù)每一層的網(wǎng)絡結構,將單層卷積分解為多次進行,即將無法在PL端一次性完成的大矩陣乘法運算進行運算拆分后分多步完成。該方法首先需要對存儲于PS端的第三代雙倍數(shù)據(jù)率同步動態(tài)隨機存取存儲器DDR3 SDRAM(Double-Data-Rate Three Synchronous Dynamic Random Access Memory)中的單層網(wǎng)絡的權值矩陣和該層圖片像素矩陣(第二層后稱為feature map矩陣)進行拆分。拆分后的單個小矩陣尺寸由X-TINY YOLO網(wǎng)絡結構和PL端硬件資源允許的單次最大并行計算量共同決定。單層卷積中上述二矩陣未拆分前在PS端DDR3中的存儲示意圖如圖3~4所示。
圖3和圖4中的(a)圖分別表示兩矩陣在PS端DDR3中的存儲方式,而圖(b)分別展示兩矩陣在X-TINY YOLO中的邏輯對照模型??梢钥闯?,單層卷積運算中權重矩陣需要傳入PL端的數(shù)據(jù)總量weights_trans計算如式(4):
由式(3)知,還需要傳入偏移向量(bias),它只用保存在權值矩陣的最后一行并隨其一同傳輸即可,其傳輸大小為bias_trans計算如式(5):
其中:in_c、w、h分別為輸入的feature map的通道數(shù)量、寬度和高度;out_c為輸出feature map的通道數(shù)量,也是輸入的權重矩陣中卷積核的個數(shù);k_size為卷積核尺寸,除最后一層卷積使用1×1卷積核之外,其他各層卷積核尺寸都是3×3。
以下根據(jù)網(wǎng)絡結構核硬件平臺資源設計權值矩陣的分割方法,觀察式(4)發(fā)現(xiàn),k_size除第9層外始終是3,而in_c除第1,3層外,隨層數(shù)增加以16為基數(shù)成倍增加,weights_trans都有公約數(shù)3×3×16,即144。故決定對DDR3中權值矩陣(圖4(a))進行按列切割,切割后每列寬度為144或144的倍數(shù)(取決于硬件資源限制),單次傳入的分割后權值矩陣大?。╓eights_trans_once)為如式(7)所示:
其中:m為Zynq SoC平臺的PL端允許的單次最大并行乘加運算個數(shù),n為雙端口BRAM存儲單元個數(shù),實際小型Zynq SoC平臺各系列芯片的n是略大于m的,m約為n的66%~90%,故m成為計算瓶頸。
對應模型中的邏輯意義為:在本層所有卷積核的相同位置截斷,每次運算同時向PL端傳入out_c個卷積核在相同位置的144·m/144」個數(shù)據(jù),即截取該層所有卷積核的連續(xù)16·m/144」個通道的所有權值。其中的特殊情況為第1,3,9層,由于通道數(shù)小于16或k_size為1導致列數(shù)不足144。采取的措施是在初始化時,依然按單次傳入144×out_c個值,不足144按的列數(shù)在DDR3端存儲時先補0。例如,圖4中若DDR3端存儲的是第一層卷積層的權值矩陣,即16行3×3×3列的數(shù)據(jù),則在每一行末尾補144-3×3×3個0,使得每行的個數(shù)為144。
feature map矩陣的切割方式需要與權值矩陣的切割方式相匹配以適應計算需要。在權值矩陣切割時選擇按列切割,即對in_c切割,而計算時需要傳入將會與切割后的權值矩陣作卷積運算的feature map對應部分,故對其in_c按行切割,在DDR3(圖5(a))中表現(xiàn)為按行切割,切割后每份的行數(shù)為144/k_size2·m/144」。單次傳入的分割后feature map矩陣大小(feature_map_trans_once)如式(8)所示:
對應模型中的邏輯意義為一次性傳入多個大小為w×h的完整的通道數(shù)據(jù),但由于前三層的w,h過大導致整行數(shù)據(jù)無法一次性傳入,故需要對前三層按行切割后再按列切割。對于第1、2層,因為in_c很小不需要按行切割,只需對其矩陣按列切割。第3層需要同時按行和列切割,而之后的4~9層只需要按行切割,但按列切割操作會使得一次傳入的單通道數(shù)據(jù)不完整,而進行卷積運算時又需要用到feature map中一個單元及周邊的3×3個數(shù)據(jù),使得在對邊緣數(shù)據(jù)卷積時缺少w列數(shù)據(jù)(也缺少w行,但這部分是補零操作而非用到feature map矩陣中的數(shù)據(jù),將放在PL端補零)。故為滿足邊緣部分卷積對數(shù)據(jù)的要求,對于feature map中進行過按列切割的1,2,3層數(shù)據(jù)進行補傳操作:若是該列切割中傳入的第一塊數(shù)據(jù)或最后一塊數(shù)據(jù),則在執(zhí)行卷積操作時需要額外傳入w列;若是非首尾塊,則需額外傳入2×w列。具體切割方式的示意圖如圖5所示,圖中mul=m/144」。
按照上述方式拆分后的兩個大矩陣被分割為存在計算匹配關系的若干小矩陣,之后成對傳入一個權值小矩陣和一個feature map小矩陣供PL端計算單元使用,單次計算完成后立即傳回PS端存儲,所有小矩陣乘加計算結束后,結果將按照X-TINY YOLO該層通道順序存儲于DDR3中,組成下一層卷積運算的feature map輸入。
1.3 數(shù)據(jù)傳輸、在PL端的存儲和計算
數(shù)據(jù)傳輸時采用加速一致性接口(AXI-Accelerator Coherency Port,AXI_ACP)結合分散—集中型直接內(nèi)存讀取模式(Scatter-Gather Direct Memory Access,DMA_SG)進行數(shù)據(jù)搬移,將切割后小矩陣組從PS端的DDR3中分多次搬運至PL端的BRAM中。DMA_SG方式適合傳輸數(shù)據(jù)量大于300B的連續(xù)或非連續(xù)數(shù)據(jù)塊的搬運,高效且靈活。高速一致性AXI_ACP接口使得PL端可直接讀取L1和L2兩級cache中緩存的PS端數(shù)據(jù),降低傳輸延遲。
由于AXI_ACP口的位寬限制,分配4個8bit的AXI_ACP端口給權值矩陣的傳輸,保證在同一傳輸周期PL端可同時從PS端DDR3內(nèi)搬移4組char類型的權值矩陣數(shù)據(jù)到BRAM,并存入4個不同的BRAM中,直至單次權值小矩陣傳輸完成。單次小矩陣共需傳輸數(shù)據(jù)量計算公式如式(7),結合以上分析知,單次權值小矩陣傳輸消耗時鐘周期(weight_trans_clock)如式(9):
分配1個8bit的AXI_ACP對feature map數(shù)據(jù)傳輸,單個feature map小矩陣共需傳輸數(shù)據(jù)量如式(8),單次feature map小矩陣傳輸消耗時鐘周期(weight_trans_clock)如式(10):
但對于第一到第三層卷積,傳入計算的是非完整通道數(shù)據(jù)(如圖5),計算時還需要用到上一次硬件函數(shù)輸出的部分卷積運算結果,故分配4個8bit的AXI_ACP用于傳入上一個小矩陣運算后的部分結果。最后剩下的位寬留給生成的新feature map矩陣的傳回PS端使用最后剩下1個8bit位寬AXI_ACP用于在PL端單次計算得到的新feature map 矩陣傳回PS端使用此句不通順,請作相應調整,因為結果的傳輸過程是緊跟在計算完成之后放在計算流水線之內(nèi)的,每完成一次計算傳回一個結果,只會增加單級流水線的延遲,并不會增加流水線級數(shù),而當啟動間隔(Initiation Interval, II)為1且流水線級數(shù)遠遠大于單級延遲時,因此增加的少量額外時間可忽略。
PL端的數(shù)據(jù)存儲使用BRAM存儲單元,Zynq SoC平臺允許對BRAM進行分割,每一個分割后的小BRAM都具有雙端口讀寫功能,故考慮傳入一對乘數(shù)(即一對feature map和權值數(shù)據(jù))存入分割后同一個BRAM單元,以保證可在同一時鐘周期內(nèi)同時讀寫多組數(shù)據(jù),從而極大提高了數(shù)據(jù)吞吐量。BRAM分割個數(shù)應取值為最大單次允許并行乘加個數(shù),并留出富余的2個BRAM供最大池化操作使用。
計算時采用多級流水線、單級流水線內(nèi)全并行的方式。因為該流水線的每一級均是從不同的BRAM中取數(shù)據(jù)并使用不同的DSP48E運算單元計算(或相同DSP48E中不同級單元),故流水線不存在結構冒險和數(shù)據(jù)冒險,故可實現(xiàn)流水線II=1的高效流水線。單個卷積層乘加運算消耗總時鐘周期為:
2 算法實現(xiàn)
2.1 系統(tǒng)總體設計
硬件結構如圖6所示,Zynq SoC平臺主要由ARM(簡稱PS端)和FPGA(簡稱PL端)兩部分構成,PL和PS端分別有各自的存儲單元BRAM和DDR3。
PL端的并行攝像頭接口逐幀接收攝像頭傳入的圖像數(shù)據(jù)并傳輸給PS端的DDR3中存儲。PL端的多路并行計算單元由多片DSP48E IP核構成,用于并行地加速乘加運算。
算法現(xiàn)實的物理平臺核心為Zynq-7020的XC7Z020芯片,其片內(nèi)只有220個DSP48E Slice,每片規(guī)格為18×25的乘法器。片內(nèi)有140片雙端口BRAM,每片存儲空間為36Kb,實際可分為280片18Kb存儲,其中每片系統(tǒng)預留2Kb不可用空間,故每片可用16Kb,即2KB空間。總可用空間為280×2KB,共可存儲280×2048個8bit數(shù)據(jù)。
2.2 數(shù)據(jù)切割、存儲、傳輸和計算
由第1章分析知,單次傳入計算的矩陣規(guī)模上限將受限于PL端硬件存儲資源(BRAM請補充BRAM的英文全稱。前面有全稱)和計算資源(DSP48E)數(shù)量。故需按照式(7)、(8)矩陣切割方法,對feature map矩陣和權值矩陣進行切割,由硬件資源知公式m=220,m/144」=1中,單次最多并行計算144個乘加運算。故單次傳入權值小矩陣大小為144·out_c,單次傳入feature map小矩陣大小為144/k_size2·w·h。X-TINY YOLO所有卷積層傳入PL端的分割后矩陣規(guī)模及傳入次數(shù)統(tǒng)計如表2。
表2中,k_step、n_step分別為feature map和權值矩陣分割后需分多次傳入PL端的小矩陣數(shù)目。需要注意的是權值矩陣在傳輸當前層最后一個小矩陣時會多增加一行bias數(shù)據(jù),而feature map矩陣在第3和第9次傳入時,因為in_c無法被16整除,最后一次會傳入規(guī)模比表格中數(shù)值更小的矩陣。以上兩點未體現(xiàn)在表格中。
數(shù)據(jù)在PL端的存儲方面,定義一個大小為146×2048的BRAM,并對第一個維度進行分割,分割為146個小BRAM,其中144個BRAM存儲兩個計算所用矩陣,2個BRAM用于最大池化操作。按照1.3節(jié)的存儲方法,在每個BRAM的前w×h個單元中存入一個通道的feature map數(shù)據(jù),從w×h開始之后的單元內(nèi)存入out_c個單元的權值數(shù)據(jù),在每個乘法計算周期內(nèi)同時從144個BRAM中讀出144對feature map和權值數(shù)據(jù)并分別送入144片DSP48E計算(綜合后電路實際只使用了110片)。DSP48E只有144片,按上述方式單個計算周期內(nèi)只能實現(xiàn)144·(16·k_size2)個乘加運算并行,乘加總量為in_c·out_c·k_size2·w·h,多個計算周期間通過#pipeline方式實現(xiàn)II=1的流水線(表75本文無表7,指代哪個表格,請明確。回復:表7改為表5)。由圖2結合式(9)、(10)和(11)得到,各層卷積運算理論耗時,如表2的最后一列所示。