一種卷積神經(jīng)網(wǎng)絡(luò)硬件加速方法及其axi總線ip核的制作方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及卷積神經(jīng)網(wǎng)絡(luò)的硬件加速技術(shù),具體涉及一種卷積神經(jīng)網(wǎng)絡(luò)硬件加速 方法及其AXI總線IP核。
【背景技術(shù)】
[0002] 下一代智能設(shè)備處理器的核心挑戰(zhàn)是要能夠感知和理解人類的世界以提供增強(qiáng) 用戶體驗(yàn)和連接用戶喜好的生態(tài)環(huán)境、能和用戶進(jìn)行類似于人類的交互。卷積神經(jīng)網(wǎng)絡(luò) (Convolution Neural Network,CNN)就是一種代表當(dāng)前最先進(jìn)發(fā)展水平的感知模型之一, 該模型能夠?qū)⒃驾斎氲臄?shù)據(jù)逐層解析為符號(hào),提取出復(fù)雜的多層組合特征,在機(jī)器視覺 和聽覺系統(tǒng)方面取得了巨大的成功和廣泛的應(yīng)用,2013年MIT Technology Review雜志將 以卷積神經(jīng)網(wǎng)絡(luò)為代表的深度學(xué)習(xí)評(píng)為十大突破性技術(shù)之首。卷積神經(jīng)網(wǎng)絡(luò)算法是受到 人的視覺系統(tǒng)的啟發(fā),利用卷積操作來模擬真實(shí)神經(jīng)元的感受野。深度神經(jīng)網(wǎng)絡(luò)的計(jì)算非 常密集,在目標(biāo)檢測(cè)等應(yīng)用中(正向分類檢測(cè),而非訓(xùn)練),可以輕松突破Gops,達(dá)到數(shù)十 Gops-Tops的計(jì)算能力,因此利用深度神經(jīng)網(wǎng)絡(luò)進(jìn)行實(shí)時(shí)分類檢測(cè)都只能依靠高性能多核 CPU和GPU來完成,對(duì)受限于功耗的智能設(shè)備(例如機(jī)器人,UAV,消費(fèi)電子,智能汽車,智能 監(jiān)控系統(tǒng)等)而言,這些處理器能耗過于高昂而使得這些應(yīng)用幾乎是不可能任務(wù)。相比較 使用通用器件,構(gòu)建專用加速電路,是滿足卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用(CNN應(yīng)用)性能與功耗需求 的一條可行之路。通常硬件加速器部件在性能與功耗上均優(yōu)于通用處理器,約有IOOx以上 的能效提升。
[0003] 智能設(shè)備的核心多為片上系統(tǒng),片上系統(tǒng)(SoC, System on Chip)是指:Host處理 器、專用電路、外設(shè)控制器集成在一塊芯片上所構(gòu)成的異構(gòu)系統(tǒng),能夠根據(jù)用戶需求進(jìn)行定 制。隨著微電子技術(shù)的發(fā)展,一塊芯片內(nèi)部可以集成很多器件,這種在一塊可編程芯片上集 成的系統(tǒng)稱為SoC。由于SoC的規(guī)模非常龐大,涉及工作量很大,因此對(duì)已經(jīng)設(shè)計(jì)好的模塊 進(jìn)行重復(fù)使用十分必要,解決這個(gè)問題的一個(gè)方法是使用IP核(Intellectual Property Core)。IP核在集成電路領(lǐng)域指已經(jīng)過驗(yàn)證的、可重復(fù)利用的并具有確定功能的集成電路 模塊。IP核的使用可以大大降低設(shè)計(jì)時(shí)間、成本,提高設(shè)計(jì)效率。現(xiàn)有百萬門以上的芯片 70%的模塊是IP核的重復(fù)使用。通常,在普通智能設(shè)備中的SoC系統(tǒng)對(duì)計(jì)算量的要求并不 高,主要依靠 Host處理器,少量應(yīng)用還會(huì)用到集成的通用加速器,如向量單元,MGPU等。但 新興應(yīng)用對(duì)SoC的計(jì)算能力以及能耗要求日益增加,而通用微處理器的體系結(jié)構(gòu)已經(jīng)逐漸 不適合這類應(yīng)用了。
[0004] 由于CNN應(yīng)用對(duì)處理速度的要求較高,SoC中的通用微處理器并不能滿足其能效 要求,必須構(gòu)建專用加速電路IP核。若采用集成專用硬件加速器IP核的SoC設(shè)計(jì),目前 通常采用如下兩種方案:一是ASIC(專用集成電路,Application-Specific Integrated Circuit)投片;二是 FPGA(現(xiàn)場(chǎng)可編程門陣列,F(xiàn)ield Programmable Gate Array)。ASIC 投片需要大量的資金和人力資源,且不可修改。而采用FPGA既能獲得有關(guān)硬件實(shí)現(xiàn)的參數(shù) 又具有靈活性,并且克服了 ASIC設(shè)計(jì)周期長(zhǎng)和投資大的缺點(diǎn),是比較理想的選擇。近年來 FPGA業(yè)界龍頭廠商Altera及XiIinx均推出了基于ARM處理器的FPGA SoC解決方案。AXI 總線是目前基于ARM處理器的SoC總線標(biāo)準(zhǔn)。由于ARM處理器的廣泛使用,目前采用AXI 總線標(biāo)準(zhǔn)的IP核以其靈活易用性被廣泛采用。因此,構(gòu)建基于AXI總線的卷積神經(jīng)網(wǎng)絡(luò)加 速器IP核對(duì)于新興的嵌入式視覺應(yīng)用有著較大的意義。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明要解決的技術(shù)問題是:針對(duì)現(xiàn)有技術(shù)的上述問題,提供一種能夠支持各種 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)、計(jì)算效率和性能高、對(duì)片上存儲(chǔ)資源以及片外存儲(chǔ)帶寬需求較少、通信 開銷小、單元部件升級(jí)與改進(jìn)方便、通用性好的卷積神經(jīng)網(wǎng)絡(luò)硬件加速方法及其AXI總線 IP核。
[0006] 為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:
[0007] 本發(fā)明提供一種卷積神經(jīng)網(wǎng)絡(luò)硬件加速方法,步驟包括:
[0008] 1)預(yù)先將卷積運(yùn)算的輸入特征圖排列組成矩陣A,將卷積運(yùn)算的輸出特征圖對(duì)應(yīng) 的卷積核排列組成矩陣B,將卷積神經(jīng)網(wǎng)絡(luò)卷積層的卷積運(yùn)算轉(zhuǎn)換為m行K列的矩陣A、K行 η列的矩陣B的矩陣乘運(yùn)算;
[0009] 2)將矩陣乘運(yùn)算的矩陣結(jié)果C分為m行η列個(gè)矩陣子塊;
[0010] 3)啟動(dòng)和主處理器相連的矩陣乘法器來對(duì)所有矩陣子塊進(jìn)行計(jì)算;在對(duì)矩陣子 塊進(jìn)行計(jì)算時(shí),所述矩陣乘法器以數(shù)據(jù)驅(qū)動(dòng)的方式產(chǎn)生矩陣坐標(biāo)(Bx,By)形式的數(shù)據(jù)請(qǐng) 求,將矩陣坐標(biāo)(Bx,By)映射為操作數(shù)在輸入特征圖中的真實(shí)主存地址read_addr,從主存 中讀回操作數(shù);
[0011] 4)矩陣乘法器根據(jù)讀回的操作數(shù)執(zhí)行每一個(gè)矩陣子塊的并行計(jì)算,并將計(jì)算結(jié)果 寫回主存。
[0012] 優(yōu)選地,所述步驟1)中將卷積運(yùn)算的輸入特征圖排列組成矩陣A具體是指將卷積 運(yùn)算的每一個(gè)輸入特征圖的所有卷積窗口進(jìn)行橫向拼接,所述橫向拼接具體是指先將每一 個(gè)卷積窗口組織成一個(gè)列向量,再將這些列向量拼接成矩陣A的一個(gè)行分塊,然后將各個(gè) 特征圖的行分塊進(jìn)行縱向拼接成為A矩陣;將卷積運(yùn)算的輸出特征圖對(duì)應(yīng)的卷積核排列組 成矩陣B具體是指將卷積運(yùn)算的每一個(gè)輸出特征圖對(duì)應(yīng)的卷積核作為矩陣B的一行。
[0013] 優(yōu)選地,所述步驟2)具體是指根據(jù)式(1)將矩陣乘運(yùn)算的矩陣結(jié)果C分為m行η 列個(gè)矩陣子塊;
[0014]
(1)
[0015] 式(1)中,C表示矩陣乘運(yùn)算的矩陣結(jié)果,A表示m行K列的矩陣八,化表示矩陣A 中的第i行,B表示K行η列的矩陣B,81表示矩陣B中的第i行,C i;」表示矩陣乘運(yùn)算的矩 陣結(jié)果C的第i行j列個(gè)矩陣子塊。
[0016] 優(yōu)選地,所述步驟3)中將矩陣坐標(biāo)(Bx,By)映射為操作數(shù)在輸入特征圖中的真實(shí) 主存地址read_addr的步驟包括:
[0017] 3. 1)接收數(shù)據(jù)請(qǐng)求(Bx, By)以及參數(shù)卷積核尺寸Ksize、卷積窗口數(shù)目win_num、 卷積窗口偏移stride、特征圖大小image_size以及第一個(gè)輸入特征圖的首地址img_addr ; 將數(shù)據(jù)請(qǐng)求的行坐標(biāo)Bx對(duì)卷積核尺寸Ksize進(jìn)行除法運(yùn)算得到余數(shù)操作數(shù)在卷積窗口中 的列偏移〇fs_cwin_y和商temp ;同時(shí),將數(shù)據(jù)請(qǐng)求的列坐標(biāo)By除以卷積窗口數(shù)目win_num 得到商卷積窗口在特征圖中的行偏移cwin_x和余數(shù)卷積窗口在特征圖中的列偏移cwin_ y ;
[0018] 3. 2)將商temp除以卷積核尺寸Ksize得到商操作數(shù)在卷積窗口中所屬的特征圖 編號(hào)im_num和余數(shù)操作數(shù)在卷積窗口中的行偏移ofs_cwin_x ;同時(shí),將卷積窗口在特征圖 中的列偏移cwin_y乘以操作數(shù)在卷積窗口中的偏移stride、再加上操作數(shù)在卷積窗口中 的偏偏移〇fs_cwin_y得到操作數(shù)在特征圖像中的列偏移img_y ;
[0019] 3. 3)將操作數(shù)在卷積窗口中所屬的特征圖編號(hào)im_num乘以特征圖大小image_ size的平方得到所屬特征圖像的偏移ofs_im ;同時(shí),將卷積窗口在特征圖中的行偏移 cwin_x乘以操作數(shù)在卷積窗口中的偏移stride、再加上操作數(shù)在卷積窗口中的行偏移 ofs_cwin_x得到操作數(shù)在特征圖像中的行偏移img_x ;
[0020] 3. 4)將操作數(shù)在特征圖像中的行偏移img_x乘以特征圖大小image_size、再加上 操作數(shù)在特征圖像中的列偏移img_y得到操作數(shù)在特征圖像中的偏移ofs_pix ;
[0021] 3. 5)將操作數(shù)在特征圖像中的偏移ofs_pix加上第一個(gè)輸入特征圖的首地址 img_addr、再加上所屬特征圖像的偏移ofs_im得到操作數(shù)在主存中的真實(shí)存儲(chǔ)地址read_ addr〇
[0022] 優(yōu)選地,所述步驟4)中的詳細(xì)步驟包括:
[0023] 4. 1)初始化變量k為0 ;
[0024] 4. 2)將當(dāng)前矩陣子塊Cij對(duì)應(yīng)矩陣A的條狀分塊A i的當(dāng)前子列A ik以流的方式依 次傳給矩陣乘法器中的各個(gè)處理單元,每個(gè)處理單元緩存當(dāng)前子列Aik中自身編號(hào)對(duì)應(yīng)的 部分?jǐn)?shù)據(jù)Aik[n],其中η為處理單元的編號(hào);預(yù)取下一個(gè)子列Aik的數(shù)據(jù);
[0025] 4. 3)將當(dāng)前矩陣子塊Cij對(duì)應(yīng)矩陣B的條狀分塊B」的長(zhǎng)度為m的當(dāng)前子列B #以 流的方式依次傳給各個(gè)處理單元,每一個(gè)處理單元在接收到子列Bjk中的每一個(gè)數(shù)據(jù)Bjk[m] 時(shí),將收到的數(shù)據(jù)Bjk[m]和緩存的部分?jǐn)?shù)據(jù)Aik[n]通過乘法器相乘并與該處理單元的緩存 C_BUFF[m]中存儲(chǔ)的結(jié)果進(jìn)行累加并存回至緩#C_BUFF[m];
[0026] 4. 4)判斷變量k的值是否等于K-1,其中K為矩陣A的列數(shù);當(dāng)變量k的值等于 K-I時(shí),跳轉(zhuǎn)執(zhí)行下一步;否則,將變量k加1,并跳轉(zhuǎn)執(zhí)行步驟4. 2);
[0027] 4. 5)每一個(gè)處理單元將最后一次累加得到的計(jì)算結(jié)果依次輸出并最終寫回主存。
[0028] 優(yōu)選地,本發(fā)明還包括對(duì)卷積神經(jīng)網(wǎng)絡(luò)的全連接層加速的步驟,詳細(xì)步驟包括:將 卷積神經(jīng)網(wǎng)絡(luò)的全連接層的多個(gè)矩陣-向量乘轉(zhuǎn)換為矩陣-矩陣乘,將矩陣-矩陣乘通過 矩陣乘法器進(jìn)行合并運(yùn)算。
[0029] 本發(fā)明還提供一種卷積神經(jīng)網(wǎng)絡(luò)硬件加速AXI總線IP核,包括依次相連的AXI 總線接口模塊、流映射器及矩陣乘法器,所述矩陣乘法器包括鏈?zhǔn)紻M和處理單元陣列,所 述處理單元陣列由多個(gè)處理單元以鏈?zhǔn)浇Y(jié)構(gòu)排列組成,且鏈?zhǔn)椎奶幚韱卧玩準(zhǔn)紻MA相 連;在工作狀態(tài)時(shí)所述矩陣乘法器的鏈?zhǔn)紻M以數(shù)據(jù)驅(qū)動(dòng)的方式產(chǎn)生矩陣坐標(biāo)形式的數(shù)據(jù) 請(qǐng)求(Bx,By),所述流映射器將數(shù)據(jù)請(qǐng)求(Bx,By)映射為操作數(shù)在主存中的真實(shí)存儲(chǔ)地址 reacLaddr完成卷積神經(jīng)網(wǎng)絡(luò)卷積層卷積運(yùn)算的矩陣乘化,并從主存中讀回操作數(shù),所述鏈 式DMA將讀回的操作數(shù)通過鏈?zhǔn)椎奶幚韱卧来蝹鬟f給處理單元陣列中的多個(gè)處理單元, 通過處理單元陣列執(zhí)行每一個(gè)矩陣子塊的并行計(jì)算,并將計(jì)算結(jié)果依次傳遞給鏈?zhǔn)紻MA,所 述鏈?zhǔn)紻M最終將計(jì)算結(jié)果通過AXI總線接口模塊寫回主存。
[0030] 優(yōu)選地,所述流映射器包括第一級(jí)流水線、第二級(jí)流水線、第三級(jí)流水線、第四級(jí) 流水線、第五級(jí)流水線共五級(jí)流水線,相鄰級(jí)的流水線之間設(shè)有用于數(shù)據(jù)同步緩存的棧間 寄存器;在接收數(shù)據(jù)請(qǐng)求(Bx,By)以及參數(shù)卷積核尺寸Ksize、卷積窗口數(shù)目win_num、卷積 窗口偏移stride、特征圖大小image_size以及第一個(gè)輸入特征圖的首地址img_addr后,
[0031] 所述第一級(jí)流水線將數(shù)據(jù)請(qǐng)求的行坐標(biāo)Bx對(duì)卷積核尺寸Ksize進(jìn)行除法運(yùn)算得 到余數(shù)操作數(shù)在卷積窗口中的列偏移〇fs_cwin_y和商temp ;同時(shí),將數(shù)據(jù)請(qǐng)求的列坐標(biāo)By 除以卷積窗口數(shù)目win_num得到商卷積窗口在特征圖中的行偏移cwin_x和余數(shù)卷積窗口 在特征圖中的列偏移cwin_y ;
[0032] 所述第二級(jí)流水線將商temp除以卷積核尺寸Ksize得到商操作數(shù)在卷積窗口中 所屬的特征圖編號(hào)im_num和余數(shù)操作數(shù)在卷積窗口中的行偏移ofs_cwin_x ;同時(shí),將卷積 窗口在特征圖中的列偏移cwin_y乘以操作數(shù)在卷積窗口中的偏移stride、再加上操作數(shù) 在卷積窗口中的偏偏移〇f