唐勵(lì)勤,刁節(jié)濤,陳長(zhǎng)林,駱暢航,劉 彪,劉思彤,張宇飛,王 琴
(國防科技大學(xué) 電子科學(xué)學(xué)院, 湖南 長(zhǎng)沙 410073)
在人工智能時(shí)代的大背景下,深度神經(jīng)網(wǎng)絡(luò)受到市場(chǎng)和學(xué)術(shù)界的廣泛關(guān)注,特別是其中的卷積神經(jīng)網(wǎng)絡(luò),在圖像識(shí)別、數(shù)據(jù)處理和語音分析等多個(gè)領(lǐng)域取得了巨大的成功。為了加速卷積神經(jīng)網(wǎng)絡(luò)的推理過程,業(yè)界設(shè)計(jì)了多款神經(jīng)網(wǎng)絡(luò)加速器,例如DaDianNao[1]、TPU[2]等。其中絕大多數(shù)是采用了存算分離的馮·諾依曼架構(gòu)的加速器,在卷積網(wǎng)絡(luò)推理計(jì)算過程中,特征圖像數(shù)據(jù)和網(wǎng)絡(luò)權(quán)重?cái)?shù)據(jù)需要在存儲(chǔ)單元與運(yùn)算單元之間頻繁移動(dòng),從而導(dǎo)致較大的計(jì)算延遲與功耗,目前這一問題已經(jīng)成為限制神經(jīng)網(wǎng)絡(luò)加速器性能提升的瓶頸[3]。模仿生物神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),將突觸連接強(qiáng)度(網(wǎng)絡(luò)權(quán)重)存儲(chǔ)和神經(jīng)沖動(dòng)傳導(dǎo)(特征圖像數(shù)據(jù)與權(quán)重相乘)在同一位置實(shí)現(xiàn),則可大大提高計(jì)算速度和能效。然而基于CMOS工藝實(shí)現(xiàn)權(quán)重存儲(chǔ)和乘加運(yùn)算需要較多的晶體管,進(jìn)而導(dǎo)致較大的芯片面積和功耗。同時(shí)隨著摩爾定律的延續(xù)即將受到物理層面的問題約束,在提高晶體管的集成度方面的發(fā)展也遇到了困難。在能效與集成度兩方面的制約下,尋找新的高能效計(jì)算方式與計(jì)算器件是當(dāng)前重要的研究方向。
憶阻器[4]作為一種新興的信息器件,由于其阻值可調(diào)、非易失[5]、集成密度高[6]、生產(chǎn)工藝與CMOS工藝兼容[7]等特點(diǎn),在近年來吸引了大量的關(guān)注與研究。憶阻器陣列在完成卷積運(yùn)算時(shí),權(quán)重以電導(dǎo)形式存儲(chǔ)在憶阻器上,輸入信號(hào)以電壓形式加載到憶阻器兩端,使得憶阻器在實(shí)現(xiàn)存儲(chǔ)權(quán)重功能的同時(shí)又完成了計(jì)算,實(shí)現(xiàn)了“存算一體”[8],避免了計(jì)算中的數(shù)據(jù)搬移,節(jié)省了大量的功耗;同時(shí)由于其阻值變化的機(jī)制與人腦神經(jīng)突觸鏈接的可塑性機(jī)制相類似,非常適合用于類腦計(jì)算的推理過程。因此,憶阻器被認(rèn)為是順應(yīng)人工智能時(shí)代、完成類腦計(jì)算的最有希望的候選器件之一。
在使用憶阻器陣列實(shí)現(xiàn)大規(guī)模深度神經(jīng)網(wǎng)絡(luò)時(shí)需要多個(gè)陣列協(xié)同工作,主要原因在于:① 在考慮憶阻器陣列的阻值波動(dòng)、阻值開關(guān)比有限等非理想因素的影響下[9],為保證計(jì)算精度,通常需要限制參與乘累加運(yùn)算的陣列規(guī)模[10];②為提高計(jì)算精度,目前單個(gè)網(wǎng)絡(luò)權(quán)重需要由多個(gè)憶阻器來表示,在映射較大規(guī)模的卷積核時(shí),單個(gè)憶阻器陣列無法滿足需求;③由于憶阻器陣列的乘累加特性,不同卷積層之間的數(shù)據(jù)無法在同一陣列中完成運(yùn)算,因此在實(shí)現(xiàn)多層卷積層時(shí),需要多個(gè)陣列來實(shí)現(xiàn)。
已有多款基于憶阻器的卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)公布,如ISAAC[11]、Prime[12]、PipeLayer[13]、MAX2[14]等。上述設(shè)計(jì)大多由通過片上網(wǎng)絡(luò)互聯(lián)的多個(gè)計(jì)算瓦片組成。計(jì)算瓦片(tile)是指可以整體掛載到片上網(wǎng)絡(luò)或獨(dú)立完成多個(gè)處理任務(wù)的一個(gè)單元,在處理數(shù)據(jù)的過程中無須與其他計(jì)算瓦片進(jìn)行數(shù)據(jù)交互,其中通常集成了多個(gè)憶阻器陣列以及驅(qū)動(dòng)陣列完成乘累加運(yùn)算的外圍電路?,F(xiàn)有設(shè)計(jì)在乘累加運(yùn)算電路實(shí)現(xiàn)方案、層間流水處理方案、權(quán)重映射策略等方面做出了創(chuàng)新型設(shè)計(jì),然而仍然存在數(shù)據(jù)復(fù)用方式單一、多陣列協(xié)同靈活性差等問題。
針對(duì)上述問題,本文提出一種面向大規(guī)模卷積運(yùn)算的高效率、高靈活度多陣列互連架構(gòu),該結(jié)構(gòu)通過共享輸入總線與定制讀出網(wǎng)絡(luò)實(shí)現(xiàn)了多個(gè)處理單元(processing elements)的互連。本文工作中設(shè)計(jì)了處理單元計(jì)算結(jié)果條件累加電路,支持多個(gè)處理單元的計(jì)算結(jié)果快速靈活累加與輸出,使得瓦片內(nèi)相鄰處理單元可以組合實(shí)現(xiàn)多種規(guī)模的卷積核,以滿足不同權(quán)重映射方式的需要;并優(yōu)化了數(shù)據(jù)加載電路以支持各陣列之間的數(shù)據(jù)流動(dòng),在多種網(wǎng)絡(luò)權(quán)重映射模式下均可實(shí)現(xiàn)數(shù)據(jù)復(fù)用。
卷積運(yùn)算的本質(zhì)仍然是乘累加運(yùn)算,而憶阻器交叉陣列結(jié)構(gòu)實(shí)現(xiàn)乘累加運(yùn)算具有極高的計(jì)算效率。如何通過多個(gè)陣列協(xié)同高效實(shí)現(xiàn)多層卷積運(yùn)算是當(dāng)前基于憶阻器的神經(jīng)網(wǎng)絡(luò)加速器需要解決的重點(diǎn)問題。
卷積運(yùn)算過程中,卷積窗口內(nèi)的特征圖像數(shù)據(jù)與卷積核對(duì)應(yīng)位相乘后進(jìn)行累加,因此卷積運(yùn)算的本質(zhì)仍然是乘累加運(yùn)算。如圖1所示,在使用憶阻器陣列完成乘累加運(yùn)算時(shí),權(quán)重以電導(dǎo)形式存儲(chǔ)在憶阻器中,并將陣列列線箝位到參考電平,然后由陣列的左側(cè)方向向陣列中輸入電壓形式的待處理數(shù)據(jù),與憶阻器作用產(chǎn)生電流并在列線上匯集,列電流大小對(duì)應(yīng)待處理數(shù)據(jù)與權(quán)重之間的乘累加運(yùn)算結(jié)果。圖中V1~Vi代表輸入電壓,G1~Gi代表陣列上的憶阻器,I1~I(xiàn)i代表各憶阻器的運(yùn)算結(jié)果。列線上匯集的電流可通過ADC和敏感放大器轉(zhuǎn)換為數(shù)字形式。
圖1 憶阻器完成乘累加運(yùn)算Fig.1 Multiplication and accumulation of memristor array
Shafiee等[11]提出了首個(gè)集成多個(gè)憶阻器陣列的神經(jīng)網(wǎng)絡(luò)加速器ISAAC,根據(jù)每一層運(yùn)算的需要,每個(gè)計(jì)算瓦片中含有多個(gè)128×128規(guī)模的憶阻器陣列來完成運(yùn)算,神經(jīng)網(wǎng)絡(luò)中的每一層運(yùn)算交付給不同的陣列來以流水處理方式提高整體的工作效率,降低了對(duì)數(shù)據(jù)緩沖空間的要求并增加了吞吐量。但計(jì)算瓦片中各陣列雖然共享ADC模塊,但實(shí)際上各陣列相對(duì)對(duì)立,待處理數(shù)據(jù)加載和處理結(jié)果的讀出均需單獨(dú)進(jìn)行;同時(shí)該結(jié)構(gòu)并未充分考慮在神經(jīng)網(wǎng)絡(luò)運(yùn)算中存在的數(shù)據(jù)和權(quán)重的復(fù)用特性。
PRIME[12]設(shè)計(jì)了基于憶阻器的全功能陣列和存儲(chǔ)單元,其中全功能單元既可用于數(shù)據(jù)存儲(chǔ),又可配置成神經(jīng)網(wǎng)絡(luò)計(jì)算加速模塊,顯著地降低了面積的開銷。在實(shí)現(xiàn)大規(guī)模神經(jīng)網(wǎng)絡(luò)時(shí),它使用了數(shù)據(jù)總線來實(shí)現(xiàn)各個(gè)塊之間的數(shù)據(jù)移動(dòng)。該設(shè)計(jì)同樣未考慮數(shù)據(jù)復(fù)用與多陣列協(xié)同工作需求。
PipeLayer[13]重現(xiàn)了PRIME全功能陣列的設(shè)計(jì),并在ISAAC的基礎(chǔ)上做出了改進(jìn),使得各個(gè)陣列上的運(yùn)算負(fù)載相對(duì)均衡。其逐層地計(jì)算輸出圖像數(shù)據(jù),并且將輸入特征圖像廣播到子陣列中以提高層內(nèi)計(jì)算速度。但是與ISAAC同樣未考慮各陣列計(jì)算結(jié)果的合并問題,每個(gè)陣列所完成的工作相對(duì)獨(dú)立。
Mao等[14]提出的MAX2神經(jīng)網(wǎng)絡(luò)加速器,每個(gè)計(jì)算瓦片中含有排列成3×3陣列的9個(gè)處理單元,每個(gè)卷積核的所有通道中處于同一位置的權(quán)重映射到憶阻器陣列的一列上。同一行的三個(gè)處理單元形成一個(gè)一維的脈動(dòng)陣列,以此實(shí)現(xiàn)待處理圖像的數(shù)據(jù)復(fù)用。但是該權(quán)重映射方式在此硬件架構(gòu)下僅支持大小為3×3的卷積核映射,難以靈活適用于不同的卷積核規(guī)模;并且該數(shù)據(jù)復(fù)用策略僅能應(yīng)用于文中卷積核映射在9個(gè)處理單元中的情況,其復(fù)用方式單一。
總的來說,當(dāng)前基于憶阻器陣列的神經(jīng)網(wǎng)絡(luò)加速器受到了廣大研究人員的關(guān)注,在基本計(jì)算架構(gòu)、層間流水實(shí)現(xiàn)、權(quán)重映射等方面進(jìn)行了優(yōu)化設(shè)計(jì)。但目前仍存在數(shù)據(jù)復(fù)用方式單一以及多陣列協(xié)同工作靈活性差等問題。本文架構(gòu)通過優(yōu)化數(shù)據(jù)加載方式,實(shí)現(xiàn)了對(duì)多種權(quán)重映射策略下的數(shù)據(jù)復(fù)用;采用定制設(shè)計(jì)的讀出電路,使得多個(gè)處理單元之間能夠靈活組合實(shí)現(xiàn)不同規(guī)模的卷積運(yùn)算。
本文工作所設(shè)計(jì)的計(jì)算瓦片架構(gòu)能夠靈活支持多種權(quán)重映射方案。如圖2所示,根據(jù)憶阻器陣列規(guī)模和卷積核規(guī)模,網(wǎng)絡(luò)權(quán)重可以按照全展開、按位置展開或按行/列展開的方式進(jìn)行映射,以充分利用憶阻器陣列中的憶阻器單元。對(duì)于N個(gè)規(guī)模為K×K×C的卷積核,不同映射模式實(shí)現(xiàn)方式如下:
圖2 三種映射方式Fig.2 Three types of weight mapping
在進(jìn)行全展開映射時(shí)[11-13],每個(gè)卷積核展開為一個(gè)長(zhǎng)度為K×K×C的向量并映射到憶阻器陣列的一列中,N個(gè)卷積核則會(huì)占據(jù)陣列的N列。
在進(jìn)行按位置展開時(shí)[14],即將卷積核中相同位置上所有通道內(nèi)的權(quán)重展開并映射到憶阻器陣列的一列中,完成所有權(quán)重映射需要K×K個(gè)憶阻器陣列,并且占用每個(gè)陣列中的C行、N列。
按行/列展開[15]可以看作全展開與按位置展開方式的折中,即將卷積核中屬于同一行或列的所有權(quán)重展開為向量并映射在憶阻器陣列的一列中,映射上述規(guī)模的卷積核需要K個(gè)憶阻器陣列,并占用每個(gè)陣列中的K×C行、N列。
在上述映射方式中,所需的憶阻器陣列行數(shù)較多或單個(gè)卷積核需要映射在多個(gè)陣列上時(shí),均需要將多個(gè)憶阻器陣列對(duì)應(yīng)的列結(jié)果進(jìn)行累加。
在某些應(yīng)用場(chǎng)景下(如嵌入式應(yīng)用),其神經(jīng)網(wǎng)絡(luò)采用的卷積核通常較小,此時(shí)可采用傳統(tǒng)全展開的映射方式,并將卷積核在陣列內(nèi)多次錯(cuò)位重復(fù)映射,增加計(jì)算的并行度,提高計(jì)算效率;而在映射較大規(guī)模的卷積核時(shí)即可采用按位置展開的方式進(jìn)行映射,使得陣列中憶阻器利用率更高。
在滑窗卷積運(yùn)算過程中,相鄰卷積窗口間存在較多的數(shù)據(jù)復(fù)用,充分利用這一特性,可大幅減少片外訪存需求。
為便于實(shí)現(xiàn)不同權(quán)重映射模式下的數(shù)據(jù)復(fù)用,如圖3所示,本設(shè)計(jì)所采用的電路使得處理單元中的數(shù)據(jù)寄存器除能夠接收來自數(shù)據(jù)總線上的數(shù)據(jù)以外,還能夠接收來自右側(cè)陣列同一行與下方相鄰行的數(shù)據(jù)寄存器中的數(shù)據(jù)。
圖3 數(shù)據(jù)寄存器數(shù)據(jù)加載電路Fig.3 Data register data loading circuit
在實(shí)現(xiàn)數(shù)據(jù)復(fù)用時(shí),首先以在單個(gè)處理單元內(nèi)將卷積核全映射展開的方案為例,如圖4(a)所示。卷積窗口垂直滑動(dòng)時(shí),在第一個(gè)視野里計(jì)算的數(shù)據(jù)中6~8、12~14仍會(huì)參與下一個(gè)窗口內(nèi)的計(jì)算,在滑動(dòng)中由數(shù)據(jù)加載電路實(shí)現(xiàn)下方陣列數(shù)據(jù)向上加載并向上加載更新三次,即原本的數(shù)據(jù)0、1、2被丟棄,數(shù)據(jù)6、7、8存儲(chǔ)到原本數(shù)據(jù)0、1、2所在的寄存器,數(shù)據(jù)12、13、14存儲(chǔ)到原本數(shù)據(jù)6、7、8所在的寄存器,之后向末端三個(gè)寄存器加載新的圖像數(shù)據(jù),從而完成卷積窗口的滑動(dòng),并實(shí)現(xiàn)了待處理數(shù)據(jù)在垂直滑窗時(shí)的復(fù)用。
(a) 全展開映射數(shù)據(jù)復(fù)用策略(a) Fully expanded data reuse strategy
(b) 處理單元間數(shù)據(jù)移動(dòng)(b) Horizontal data multiplexing between processing units圖4 支持的數(shù)據(jù)復(fù)用方式Fig.4 Supported data multiplexing methods
在實(shí)現(xiàn)水平卷積上的數(shù)據(jù)復(fù)用時(shí),仍以圖4中的待處理圖像數(shù)據(jù)為例,在第一個(gè)視野窗口中的1、2、7、8、13與14仍會(huì)參與下一個(gè)窗口內(nèi)的計(jì)算,在由數(shù)據(jù)加載電路將下方陣列數(shù)據(jù)向上更新一次之后,最上方三個(gè)數(shù)據(jù)由0、1、2變?yōu)?、2、6傳入數(shù)據(jù)3將數(shù)據(jù)6替換即可完成視野里第一行的更新,以此類推完成整個(gè)視野的更新,實(shí)現(xiàn)了待處理數(shù)據(jù)在水平滑窗時(shí)的復(fù)用。
在本架構(gòu)下考慮按位置展開的權(quán)重映射方案時(shí),可依靠數(shù)據(jù)加載電路中能夠加載相鄰陣列數(shù)據(jù)的功能完成對(duì)輸入圖像數(shù)據(jù)的復(fù)用。如圖4(b)所示,相鄰的9個(gè)處理單元加載了輸入特征圖像中一個(gè)3×3卷積視野的數(shù)據(jù),當(dāng)卷積窗口滑動(dòng)時(shí),通過上述功能將右方處理單元存儲(chǔ)的數(shù)據(jù)依次向左進(jìn)行移動(dòng)更新,然后向最右方處理單元中加載新的待處理數(shù)據(jù),即可完成數(shù)據(jù)的復(fù)用。為便于舉例僅在圖4(b)中展示單通道下的數(shù)據(jù)。
實(shí)現(xiàn)按行展開權(quán)重映射方案,當(dāng)卷積窗口垂直滑動(dòng)時(shí),需要由數(shù)據(jù)加載電路將相鄰陣列的數(shù)據(jù)加載至左側(cè)陣列進(jìn)行更新,同時(shí)向最右側(cè)陣列加載新的待處理數(shù)據(jù);當(dāng)卷積窗口水平滑動(dòng)時(shí),則需要將下方陣列數(shù)據(jù)向上更新C次(C為卷積核通道數(shù)),之后向末端的C個(gè)寄存器加載新的圖像數(shù)據(jù)。憑借上述兩種數(shù)據(jù)加載模式能夠完成整個(gè)視野的更新,并分別實(shí)現(xiàn)了待處理數(shù)據(jù)在垂直與水平滑窗時(shí)的復(fù)用。
當(dāng)卷積核規(guī)模較大時(shí),需要由多個(gè)處理單元來完成映射,相應(yīng)地,在每個(gè)處理單元計(jì)算得出結(jié)果后,需要將輸出整合累加以獲得完整卷積計(jì)算的結(jié)果。為適應(yīng)這一需求,本文設(shè)計(jì)了定制化的結(jié)果讀出電路,如圖5所示。
圖5 計(jì)算結(jié)果條件累加Fig.5 Calculation of conditional accumulation of results
為了支持計(jì)算瓦片中處理單元靈活組合實(shí)現(xiàn)不同規(guī)模卷積運(yùn)算,設(shè)計(jì)了行、列累加標(biāo)志用于判斷該陣列計(jì)算結(jié)果是否需要同相鄰陣列相累加。每個(gè)處理單元的計(jì)算結(jié)果輸出時(shí)附帶行、列累加標(biāo)志。當(dāng)列累加標(biāo)志位為1時(shí),則代表該處理單元的計(jì)算結(jié)果需要同上方處理單元的計(jì)算結(jié)果相累加,若為0則不累加;當(dāng)行累加標(biāo)志位為1時(shí),則代表該處理單元的計(jì)算結(jié)果需要同左上方處理單元的計(jì)算結(jié)果相累加,若為0則不累加。
在進(jìn)行累加時(shí),由列累加模塊通過多路選擇器自上而下依次讀取各處理單元的計(jì)算結(jié)果,并根據(jù)列累加標(biāo)志位判斷是否需要與之前暫存在模塊內(nèi)寄存器的值累加,累加結(jié)果存入模塊內(nèi)部的寄存器中。所有列中的列累加模塊同步讀取計(jì)算結(jié)果,并將當(dāng)前周期讀取的列累加標(biāo)志與上一周期獲得的行累加標(biāo)志同步傳輸至行累加模塊。
列累加模塊每讀取一個(gè)處理單元結(jié)果,行累加模塊即查看一次各列結(jié)果中的列累加標(biāo)志。將列累加標(biāo)志連續(xù)為1的結(jié)果進(jìn)行累加,若為0則無須再與上方結(jié)果累加。行條件累加模塊將行累加標(biāo)志連續(xù)為1的列的計(jì)算結(jié)果進(jìn)行累加,遇到某一列的行累加標(biāo)志為0時(shí),代表著所需的累加已經(jīng)完成,可以將累加結(jié)果送入計(jì)算瓦片緩存內(nèi),以備輸出至計(jì)算瓦片外或再次送入其他處理單元中進(jìn)行下一層卷積運(yùn)算。
電纜導(dǎo)體的截面積主要由導(dǎo)線絕緣材料的允許溫升及導(dǎo)線上允許的電壓降確定。一般儀表電纜的信號(hào)是弱電信號(hào),不考慮溫升和允許壓降的問題,主要根據(jù)導(dǎo)線的機(jī)械強(qiáng)度和檢測(cè)及控制回路對(duì)線路阻抗匹配的要求來決定導(dǎo)體的截面積[8]。根據(jù)不同的使用場(chǎng)合,化工裝置中常用儀表導(dǎo)體截面積為0.75~2.50 mm2。在部分歐美地區(qū),常使用美國線規(guī)(AWG)來區(qū)分導(dǎo)體的外徑,每種AWG的實(shí)際截面積的計(jì)算如式(1)所示:
圖6展示了幾種通過設(shè)置行、列累加標(biāo)志來實(shí)現(xiàn)不同處理單元結(jié)果組合的示例,計(jì)算瓦片內(nèi)各處理單元的計(jì)算結(jié)果可根據(jù)累加標(biāo)志完成不同情況的組合。以圖6(c)為例進(jìn)行說明,列累加模塊從上至下讀取處理單元的累加標(biāo)志位,在第四行讀取到0時(shí),則該行內(nèi)結(jié)果無須再參與累加;此時(shí)行累加模塊從左至右讀取其行累加標(biāo)志位,在讀取至第四列的0時(shí)停止累加。至此淺綠色模塊內(nèi)處理單元的計(jì)算結(jié)果完成累加合并,以此類推該計(jì)算瓦片能夠?qū)\綠、深綠、藍(lán)色和黃色四個(gè)模塊內(nèi)的處理單元分別進(jìn)行結(jié)果的累加合并。需要注意的是,參與結(jié)果合并的處理單元需要能夠組成一個(gè)矩形。憑借該結(jié)果讀出策略,本架構(gòu)得以完成多陣列的協(xié)同工作,靈活完成多種規(guī)模的卷積運(yùn)算。
(a) 實(shí)現(xiàn)一組卷積核(a) Implementation of one set of convolutional kernels
(b) 實(shí)現(xiàn)三組卷積核(b) Implementation of three sets of convolutional kernels
(c) 實(shí)現(xiàn)四組卷積核(c) Implementation of four sets of convolutional kernels
(d) 實(shí)現(xiàn)六組卷積核(d) Implementation of six sets of convolutional kernels圖6 多處理單元實(shí)現(xiàn)多規(guī)模卷積核Fig.6 Multi-processing elements for multi-scale convolutional kernels
如圖7所示,芯片中包含多個(gè)計(jì)算瓦片,1個(gè)全局緩存、激活函數(shù)單元和池化單元,片上的所有單元與計(jì)算瓦片由H樹總線完成互連,根據(jù)每一層的卷積核大小將其分配給一個(gè)或者多個(gè)計(jì)算瓦片來完成計(jì)算。計(jì)算過程:從全局緩存中提取各層的輸入特征圖像數(shù)據(jù),通過數(shù)據(jù)總線傳入相應(yīng)的計(jì)算瓦片中進(jìn)行處理。計(jì)算完成后,計(jì)算瓦片將得到的計(jì)算結(jié)果傳入累加單元與其余結(jié)果完成累加,之后結(jié)果再被送入外部的激活函數(shù)單元、池化單元、全局緩存或是在需要的情況下作為下一層的輸入再次傳入計(jì)算瓦片。
圖7 芯片總體架構(gòu)Fig.7 Chip-level architecture
每個(gè)計(jì)算瓦片由256個(gè)處理單元構(gòu)成,其排列成16×16的陣列,另外包含1個(gè)計(jì)算瓦片緩存與17個(gè)條件累加單元。各個(gè)處理單元之間由定制化的數(shù)據(jù)總線完成互連,每一列處理單元末端設(shè)置一個(gè)列累加單元來完成該列上處理單元計(jì)算結(jié)果的累加,由一個(gè)行累加單元與所有的列累加單元相連。借由以上的互連設(shè)計(jì)實(shí)現(xiàn)了處理單元之間計(jì)算結(jié)果的合并,以獲得多通道下合并的輸出特征圖像數(shù)據(jù)。
以下舉例說明單個(gè)計(jì)算瓦片在完成一層卷積運(yùn)算時(shí),其相關(guān)的數(shù)據(jù)流情況。例如使用該計(jì)算瓦片完成特征圖像與16個(gè)大小為3×3×16的卷積核的卷積運(yùn)算,瓦片內(nèi)單個(gè)處理單元的憶阻器規(guī)模為64×64,在采用全展開映射方案時(shí)需要將單個(gè)卷積核映射在3個(gè)處理單元上,如圖8中處理單元PE1~PE3所示。在進(jìn)行運(yùn)算時(shí)其狀態(tài)轉(zhuǎn)移過程如圖9所示。
圖8 計(jì)算瓦片內(nèi)總架構(gòu)Fig.8 Tile-level architecture
圖9 實(shí)現(xiàn)卷積運(yùn)算的狀態(tài)轉(zhuǎn)移圖Fig.9 Finite state machine for implementing convolutional operations
步驟1:將第一個(gè)卷積窗口內(nèi)的輸入特征圖像數(shù)據(jù)通過總線加載到處理單元的各個(gè)數(shù)據(jù)寄存器上;
步驟2:由外圍電路驅(qū)動(dòng)將寄存器中的數(shù)據(jù)加載至憶阻器陣列上并完成乘累加運(yùn)算,隨后相關(guān)的DAC電路將輸出電流轉(zhuǎn)換為數(shù)字信號(hào)緩存在處理單元配備的緩存中;
步驟3:在計(jì)算結(jié)果讀出時(shí),列累加模塊讀取到處理單元PE1~PE3的累加標(biāo)志位為1,將上述三個(gè)處理單元的計(jì)算結(jié)果累加合并后向外讀出;
步驟4:將處理單元中的各數(shù)據(jù)寄存器根據(jù)卷積窗口的滑動(dòng)進(jìn)行垂直方向上的移位更新;
步驟5:從外部通過總線加載新的圖像數(shù)據(jù)到數(shù)據(jù)寄存器中以完成卷積窗口的滑動(dòng)。
完成更新后再次啟動(dòng)計(jì)算,重復(fù)步驟2~5直至完成該層的卷積運(yùn)算。在一塊計(jì)算瓦片中包含多個(gè)處理單元,將卷積核在不同的處理單元上多次例化,能夠?qū)崿F(xiàn)多路并行,提高計(jì)算效率。
每個(gè)處理單元內(nèi)含有一個(gè)64×64規(guī)模的憶阻器陣列,以及搭配工作的外圍電路如讀出電路、多路選擇器、移位累加器、數(shù)據(jù)寄存器、控制寄存器與輸出寄存器。其中控制寄存器中包含自動(dòng)更新使能與更新標(biāo)志位。每8列憶阻器共享一個(gè)讀出電路,讀出電路的讀出精度為5 bit,這足以避免顯著的精度損失[9]。在運(yùn)行VGG-8網(wǎng)絡(luò)時(shí),考慮到單個(gè)子陣列的陣列行數(shù)為64,在每個(gè)處理單元內(nèi)部均設(shè)置了64個(gè)數(shù)據(jù)寄存器用于每一行憶阻器的輸入圖像數(shù)據(jù)暫存。計(jì)算過程:從計(jì)算瓦片緩存中取得待處理圖像數(shù)據(jù)首先存入處理單元的64個(gè)數(shù)據(jù)寄存器中,每個(gè)寄存器的大小為8 bit,即所有寄存器總?cè)萘繛?12 bit,運(yùn)算開始后向憶阻器陣列輸入電壓數(shù)據(jù)。經(jīng)過憶阻器計(jì)算后由讀出電路將結(jié)果電流讀出并在移位累加器中完成對(duì)整列結(jié)果的累加,每列結(jié)果均為64個(gè)8 bit數(shù)據(jù)相加,需要由14 bit的輸出寄存器進(jìn)行寄存。
通過總線對(duì)待處理數(shù)據(jù)進(jìn)行加載時(shí),可對(duì)指定處理單元的地址進(jìn)行單個(gè)處理單元的寫入,同時(shí)為降低數(shù)據(jù)總線的負(fù)載,設(shè)計(jì)了共享標(biāo)志位用于數(shù)據(jù)多播,在該標(biāo)志位為高電平時(shí),可向多個(gè)處理單元設(shè)置為同一地址ID以完成單次數(shù)據(jù)加載到多個(gè)處理單元的功能。處理單元中各數(shù)據(jù)寄存器帶有更新標(biāo)志位,當(dāng)標(biāo)志位為低電平時(shí)該數(shù)據(jù)寄存器才接受寫入新的數(shù)據(jù)。
基于NeuroSim平臺(tái)對(duì)以本文架構(gòu)為原型的加速器進(jìn)行了仿真,以更好體現(xiàn)其在實(shí)際應(yīng)用中的意義,并將其與相關(guān)的神經(jīng)網(wǎng)絡(luò)加速器進(jìn)行比較,評(píng)估其優(yōu)劣勢(shì)。
使用DNN+NeuroSim框架來評(píng)估在32 nm工藝節(jié)點(diǎn)下本文所提出的互連架構(gòu),修改相關(guān)的NeuroSim代碼來反映該互連架構(gòu)的權(quán)重映射方式與數(shù)據(jù)流??紤]到運(yùn)行的神經(jīng)網(wǎng)絡(luò)需要能夠覆蓋使用瓦片級(jí)與芯片級(jí)上的各項(xiàng)處理性能,在對(duì)比評(píng)估工作中采用了處理CIFAR-10數(shù)據(jù)集的VGG-8網(wǎng)絡(luò)來評(píng)估性能與能效,其中網(wǎng)絡(luò)的權(quán)重位寬設(shè)置為5 bit,單個(gè)憶阻器的存儲(chǔ)狀態(tài)數(shù)為32,數(shù)字電路的工作頻率為1 GHz。在這項(xiàng)對(duì)比工作中,對(duì)比對(duì)象使用MAX2的映射方式與數(shù)據(jù)流,兩種體系結(jié)構(gòu)使用總規(guī)模大小相同的可變電阻式存儲(chǔ)器(resistive random access memory, ReRAM)陣列來運(yùn)行VGG-8網(wǎng)絡(luò)。
在對(duì)比對(duì)象中,使用了128×128規(guī)模大小的ReRAM陣列作為子陣列,每個(gè)處理單元的規(guī)模為512×512,即單個(gè)處理單元包含了4×4規(guī)模的子陣列,每個(gè)計(jì)算瓦片由4個(gè)處理單元組成。在本文的互連結(jié)構(gòu)中,由小陣列互連組成大規(guī)模陣列,采用了64×64規(guī)模大小的子陣列作為單個(gè)處理單元內(nèi)部的憶阻器計(jì)算陣列,每個(gè)計(jì)算瓦片由16*16個(gè)處理單元組成,單個(gè)計(jì)算瓦片含有的ReRAM陣列數(shù)量與對(duì)比對(duì)象相同,均為1 024×1 024。
在NeuroSim下仿真得到基于本文工作所提出架構(gòu)的加速器的各項(xiàng)參數(shù),如表1所示。在處理單元層級(jí),陣列的上方與左方配置有字線/位線的開關(guān)矩陣以控制電壓的加載,每個(gè)讀出電路負(fù)責(zé)完成8列憶阻器的結(jié)果電流讀出,子陣列中移位加法器完成了處理單元所需要的累加功能,將所有列電流結(jié)果的移位累加并存入14 bit的基于D觸發(fā)器的處理單元緩存中,輸入緩存同樣是基于D觸發(fā)器。單個(gè)處理單元面積為6.081×103μm2,其中讀取電路所占面積為78.9%。在計(jì)算瓦片層級(jí),共含有16×16個(gè)處理單元,配置的基于靜態(tài)隨機(jī)存儲(chǔ)器(static random access memory, SRAM)的緩存面積為2.64×104μm2,每讀出1 bit的數(shù)據(jù)消耗能量為0.002 74 pJ,所用于完成累加功能的電路單元共有17個(gè),每個(gè)累加單元進(jìn)行一次累加操作消耗的能量為0.080 pJ,總的面積為1.64×104μm2。在芯片層級(jí),由16個(gè)計(jì)算瓦片完成1至6層的卷積層運(yùn)算,由9個(gè)計(jì)算瓦片完成層7與層8的全連接層運(yùn)算,基于SRAM的全局緩存大小為128 KB,最大池化單元所占面積為3.17×104μm2,在運(yùn)行VGG-8處理CIFAR-10數(shù)據(jù)集時(shí),整個(gè)芯片的動(dòng)態(tài)功耗為2.414 52×107pJ。
表1 架構(gòu)參數(shù)Tab.1 Architecture parameters
圖10列出了本文工作與MAX2架構(gòu)在運(yùn)行VGG-8網(wǎng)絡(luò)的2~6層時(shí)的緩存與內(nèi)部互連的能耗與計(jì)算延遲,所有數(shù)據(jù)均以本文工作中第5層的數(shù)據(jù)為量化指標(biāo)。2~6層其輸入特征圖像逐層減小、卷積核數(shù)量逐層增加,可見由于第2層的輸入特征圖像數(shù)據(jù)最大,其需要向緩存訪問數(shù)據(jù)的次數(shù)最大并且數(shù)據(jù)的移動(dòng)量最大,故第2層的相關(guān)功耗與延遲均最大,而第5層的結(jié)果最小正是因?yàn)槠漭斎胩卣鲌D像最小。在第4層與第6層的結(jié)果呈現(xiàn)上升趨勢(shì)的原因是其計(jì)算后需要通過最大池化層的計(jì)算。并且在第6層時(shí),其卷積運(yùn)算所需要的卷積核數(shù)量達(dá)到最大值,參與計(jì)算的處理單元數(shù)量最多,故在第6層的緩存功耗開銷僅次于第2層,借助于憶阻器陣列計(jì)算時(shí)的高并行度,其計(jì)算延遲并未受到影響。而在內(nèi)部互連方面,盡管數(shù)據(jù)復(fù)用減少了總線的使用次數(shù),但是由于需要完成小陣列之間計(jì)算結(jié)果的合并增加了總線負(fù)載。
(a) 緩存功耗對(duì)比(a) Cache power comparison
(b) 緩存延遲對(duì)比(b) Cache latency comparison
(c) 內(nèi)部互連功耗對(duì)比(b) Internal interconnect power comparison
(d) 內(nèi)部互連延遲對(duì)比(b) Internal interconnect latency comparison圖10 緩存與內(nèi)部互連的指標(biāo)對(duì)比Fig.10 Comparison of metrics in cache and internal interconnect
總的來說,在內(nèi)部互連的延遲與功耗相差無幾的情況下,本文提出的方案相比于基準(zhǔn)在緩沖區(qū)減少了40.2%的動(dòng)態(tài)功耗與57%的延遲。本文工作能夠取得上述優(yōu)勢(shì),主要得益于陣列實(shí)現(xiàn)了在處理單元層級(jí)上的數(shù)據(jù)復(fù)用減少了數(shù)據(jù)的遠(yuǎn)程移動(dòng)量以及定制化的數(shù)據(jù)總線降低了從全局緩存中取出數(shù)據(jù)的訪問次數(shù)。
表2對(duì)比了本文工作與基準(zhǔn)的芯片面積、延遲與能效。同基準(zhǔn)相比,本文工作在采用新的數(shù)據(jù)流策略的情況下,僅增加6%的面積開銷,取得了146%的處理速度提升。主要原因在于本文工作提高了片內(nèi)數(shù)據(jù)的復(fù)用率以及減少了數(shù)據(jù)向片外的搬移次數(shù),同時(shí)在外圍電路上單個(gè)處理單元所配置的更小更快的外圍電路提供了更高的計(jì)算速率。超額的面積資源主要在于實(shí)現(xiàn)該設(shè)計(jì)時(shí)需要較多子陣列的外圍電路,能效的下降同樣也是由于總的外圍電路的功耗開銷稍高。
表2 評(píng)估結(jié)果Tab.2 Assessment results
本文提出了一個(gè)新型的基于憶阻器陣列的互連架構(gòu),高效地實(shí)現(xiàn)了陣列數(shù)據(jù)加載、輸入與多個(gè)陣列結(jié)果的合并。使用了DNN+NeuroSim架構(gòu)來評(píng)估了這項(xiàng)工作在32 nm工藝節(jié)點(diǎn)下運(yùn)行VGG-8網(wǎng)絡(luò)處理CIFAR-10數(shù)據(jù)集時(shí)的功耗與延遲表現(xiàn)。實(shí)驗(yàn)結(jié)果表明,以本文架構(gòu)為基礎(chǔ)的原型加速器對(duì)比現(xiàn)有的神經(jīng)網(wǎng)絡(luò)加速器,在僅增加6%的面積開銷的情況下,取得了146%的處理速度提升。