藺智挺 徐 田 童忠瑱 吳秀龍 汪方銘 彭春雨盧文娟 趙 強(qiáng) 陳軍寧
(安徽大學(xué)電子信息工程學(xué)院 合肥 230601)
人工智能(Artificial Intelligence, AI)在各個(gè)領(lǐng)域得到了特別的關(guān)注和廣泛的應(yīng)用,同時(shí)也促使著“算力時(shí)代”的到來。與AI相關(guān)的算法,如深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNN)、卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)等需要進(jìn)行大量的數(shù)據(jù)處理。然而,大多數(shù)現(xiàn)代計(jì)算系統(tǒng)是以傳統(tǒng)的馮·諾依曼結(jié)構(gòu)為基礎(chǔ)建立的,物理結(jié)構(gòu)上包括獨(dú)立的計(jì)算單元和存儲單元,其在執(zhí)行各種計(jì)算任務(wù)的過程中,需要在存儲單元和計(jì)算單元之間反復(fù)傳輸大量的數(shù)據(jù),這將導(dǎo)致巨大的延遲和能量損耗[1–3],從而限制了數(shù)據(jù)處理的效率。處理器和存儲設(shè)備長期非均衡的發(fā)展,使得存儲器和處理器之間的速度差距越來越大,這種差距稱為“內(nèi)存墻”,由此產(chǎn)生眾所周知的馮·諾依曼瓶頸。只有解決馮·諾依曼瓶頸,才能將人工智能應(yīng)用到能量預(yù)算和效率有嚴(yán)格限制的設(shè)備中(如物聯(lián)網(wǎng)、可移動設(shè)備、可穿戴設(shè)備等)實(shí)現(xiàn)“人工智能無處不在”。
為了克服傳統(tǒng)馮·諾依曼結(jié)構(gòu)帶來的計(jì)算限制,存內(nèi)計(jì)算(Computing In Memory, CIM)的概念被提出,其不需要將數(shù)據(jù)從存儲器傳輸?shù)教幚砥鳎苯訉⑦\(yùn)算部分整合到存儲陣列內(nèi)部執(zhí)行計(jì)算,這不僅減少了中間數(shù)據(jù)的傳輸,還減輕了處理器的運(yùn)算量。由于總線的帶寬不再是吞吐量的限制因素,從而顯著地提高了吞吐量和能效[4–7]。存內(nèi)計(jì)算的另一個(gè)顯著的優(yōu)勢是能夠?qū)崿F(xiàn)多行讀取,從而減少了存儲訪問的次數(shù),增加了數(shù)據(jù)吞吐量。
隨著有效緩解馮·諾依曼瓶頸的存內(nèi)計(jì)算成為一個(gè)熱門的研究領(lǐng)域,越來越多的學(xué)者開始從事這方面的研究,乘法計(jì)算、加減法運(yùn)算以及邏輯運(yùn)算已通過存內(nèi)計(jì)算實(shí)現(xiàn),相關(guān)的研究在國際等級的期刊、會議陸續(xù)出現(xiàn)。隨著學(xué)者對存內(nèi)計(jì)算技術(shù)研究的深入,一些學(xué)者發(fā)現(xiàn)在各種存儲器中實(shí)現(xiàn)存內(nèi)計(jì)算具有可行性,由于靜態(tài)隨機(jī)存取存儲器(Static Random-Access Memory, SRAM)單元穩(wěn)定性高,讀取速度快而且在最先進(jìn)的處理器中普遍存在,這使得在芯片上集成計(jì)算能力具有可行性?;赟RAM的存內(nèi)計(jì)算也受到國內(nèi)外學(xué)者的關(guān)注。在SRAM陣列中實(shí)現(xiàn)存內(nèi)計(jì)算技術(shù)包括數(shù)字信號[8–10]、模擬信號[11–14]和混合信號方法,基于SRAM存內(nèi)計(jì)算技術(shù)的具體實(shí)現(xiàn)將在之后的章節(jié)概述。
本文其余部分的組織結(jié)構(gòu)如下,第2節(jié)主要介紹SRAM存內(nèi)計(jì)算的應(yīng)用背景,例如卷積神經(jīng)網(wǎng)絡(luò)、機(jī)器學(xué)習(xí)分類器、編碼、存內(nèi)加解密算法等;第3節(jié)闡述基于SRAM存內(nèi)計(jì)算的邏輯運(yùn)算、乘法累加操作(Multiply ACcumulation, MAC)等運(yùn)算功能的實(shí)現(xiàn)。第4節(jié)介紹以模數(shù)轉(zhuǎn)換器為核心的量化技術(shù)和不同數(shù)模轉(zhuǎn)換器的特點(diǎn);第5節(jié)分析存內(nèi)計(jì)算架構(gòu)中存在的一些挑戰(zhàn)與問題;第6節(jié)從不同研究方向展望存內(nèi)計(jì)算技術(shù)。
現(xiàn)有存內(nèi)計(jì)算能實(shí)現(xiàn)的計(jì)算原語已經(jīng)廣泛應(yīng)用于各個(gè)AI領(lǐng)域之中,從要求大量數(shù)據(jù)訪問的圖像語音識別到確保數(shù)據(jù)安全性的加解密算法。在本節(jié)中,介紹了存內(nèi)計(jì)算技術(shù)的應(yīng)用背景,并且分析了SRAM陣列如何與這些應(yīng)用相結(jié)合。
2.1.1 卷積神經(jīng)網(wǎng)絡(luò)
CNN作為DNN的延續(xù)和發(fā)展,主要應(yīng)用于圖像處理。如圖1所示,其中展示的是CNN中的卷積層。卷積層提取了輸入的不同特征,全連接層組合這些特征映射到最終的輸出。對于每一個(gè)卷積層都包含一系列卷積核(Weight, W)、輸入特征映射(Input Feature MaP, IFMP)、輸出特征映射(Output Feature MaP, OFMP)。輸出特征映射是由卷積核與輸入相卷積得到,其中主要的運(yùn)算就是MAC。所以很多研究者致力于實(shí)現(xiàn)存內(nèi)的MAC運(yùn)算,而且SRAM單元互補(bǔ)對稱的結(jié)構(gòu)很利于應(yīng)用于MAC。通常把權(quán)重存儲到SRAM單元內(nèi)部,輸入可通過外圍電路應(yīng)用于字線上或者通過數(shù)字輔助電路應(yīng)用于陣列之中。為了進(jìn)一步減小功耗和硬件開銷使存內(nèi)運(yùn)算更好地滿足SRAM陣列,文獻(xiàn)[15,16]實(shí)現(xiàn)了存內(nèi)的二值化神經(jīng)網(wǎng)絡(luò)(Binary Neural Networks,BNN),其輸入和權(quán)重都是二值為“+1”或者“–1”,其精度相較于傳統(tǒng)的CNN算法相差不大。Chih等人[17]提出基于6T SRAM的全數(shù)字存內(nèi)計(jì)算用于實(shí)現(xiàn)CNN中的乘法累加操作,具有較高的能量效率和吞吐率。SRAM陣列具體如何實(shí)現(xiàn)這些乘累加操作,后面的章節(jié)會具體介紹。
圖1 SRAM陣列應(yīng)用于卷積神經(jīng)網(wǎng)絡(luò)
2.1.2 機(jī)器學(xué)習(xí)分類器
在機(jī)器學(xué)習(xí)中,分類器對所需處理的數(shù)據(jù)進(jìn)行分類,用于判斷一個(gè)新的觀察樣本所屬的類別。然而,由于分類器算法的高數(shù)據(jù)訪問速率及高度不規(guī)則的數(shù)據(jù)訪問模式,實(shí)現(xiàn)低開銷的分類器算法具有挑戰(zhàn)性。所以,學(xué)者開始關(guān)注存內(nèi)實(shí)現(xiàn)分類器,并且其中較多的工作是基于SRAM陣列實(shí)現(xiàn)分類器。
文獻(xiàn)[18, 19]提出了一種機(jī)器學(xué)習(xí)分類器,其中計(jì)算是在標(biāo)準(zhǔn)6T SRAM陣列中執(zhí)行的。外圍電路通過SRAM列來實(shí)現(xiàn)混合信號的弱分類器,通過組合多個(gè)列來克服電路的非理想性,實(shí)現(xiàn)強(qiáng)分類器。其中輸入是以字線電壓體現(xiàn),而權(quán)重是固定存儲在陣列單元內(nèi)部。此設(shè)計(jì)在采用標(biāo)準(zhǔn)訓(xùn)練算法時(shí)將能耗降低了113倍。Kang等人[20]介紹了一種隨機(jī)森林機(jī)器學(xué)習(xí)分類算法的存內(nèi)實(shí)現(xiàn)。同樣地,該設(shè)計(jì)也是基于6T SRAM陣列,支持大規(guī)模的并行處理,從而最大限度地減少了數(shù)據(jù)與存儲器之間往返的次數(shù)。在存內(nèi)實(shí)現(xiàn)高數(shù)據(jù)訪問量算法將會是未來的趨勢。
數(shù)據(jù)傳輸差錯(cuò)控制編碼中一個(gè)重要的算法就是漢明距離。漢明距離是比較兩個(gè)相同長度字節(jié)中有多少位不同的算法,其在信號處理和模式識別中都有廣泛應(yīng)用。
Kang等人[21]提出了一種基于6T SRAM陣列的存內(nèi)漢明距離計(jì)算。該設(shè)計(jì)中一個(gè)數(shù)據(jù)存儲在單元內(nèi)部,而另外一個(gè)數(shù)據(jù)是應(yīng)用于字線上,最后的漢明距離計(jì)算結(jié)果以兩個(gè)位線電壓差得到。由于結(jié)果是以位線電壓體現(xiàn),所以該設(shè)計(jì)的計(jì)算方式只能按列進(jìn)行,這就與SRAM按行存儲模式有所沖突,降低了計(jì)算效率。為了解決此類問題, Ali等人[22]提出了一種9T SRAM單元用于漢明距離計(jì)算,該計(jì)算方式是按行進(jìn)行的。其中輸入向量應(yīng)用于兩根讀位線即上讀位線(Read Bit Line, RBL)、讀位線非 (Read Bit Line Bar, RBLB),另一個(gè)數(shù)據(jù)也是存儲在單元內(nèi),異或(eXclusive OR, XOR)結(jié)果最終在按行連接的電源線(Source Line, SL)。為了打破漢明距離算法在存內(nèi)空間上的限制,接下來的研究方向可以著眼于可同時(shí)按行、按列進(jìn)行漢明距離計(jì)算。
在大數(shù)據(jù)時(shí)代對數(shù)據(jù)加密尤為重要,但是通過數(shù)字域?qū)崿F(xiàn)一套加密算法,例如高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard, AES),其功耗和延時(shí)會限制系統(tǒng)整體性能,而存內(nèi)實(shí)現(xiàn)AES就是很好的選擇。
如圖2所示,為AES加解密算法的全流程,其中包括字節(jié)替換、行移位、列混合、輪密鑰加這4個(gè)步驟。Wang等人[23,24]實(shí)現(xiàn)了存內(nèi)全流程AES。Agrawal等人[2]基于8T SRAM提出了“讀算存”策略,其中將運(yùn)算得到的XOR結(jié)果通過每一列尾部的數(shù)據(jù)選擇器存儲到另外一行,可以實(shí)現(xiàn)AES中迭代式XOR部分操作,但是這樣的策略同時(shí)也增加了存儲陣列的面積開銷,需要額外空出一行來存儲運(yùn)算結(jié)果。Huang等人[25]修改了帶有雙字線的6T SRAM位單元,以在不犧牲并行計(jì)算效率的情況下實(shí)現(xiàn) XOR 加密,這可以保護(hù) CIM中的DNN模型數(shù)據(jù)不被泄露。
圖2 AES流程圖
基于SRAM的存內(nèi)計(jì)算設(shè)計(jì)既可以實(shí)現(xiàn)SRAM的基本讀寫功能,也可以通過設(shè)置位線電壓,改變單元結(jié)構(gòu)以及修改外圍電路來實(shí)現(xiàn)計(jì)算功能。目前一些存內(nèi)設(shè)計(jì)主要實(shí)現(xiàn)的功能有布爾運(yùn)算、內(nèi)容可尋址存儲器(Content Addressable Memory,CAM)、乘法累計(jì)以及減法運(yùn)算。
由于陣列單元結(jié)構(gòu)的重復(fù)性,所以在存內(nèi)較易實(shí)現(xiàn)簡單重復(fù)的布爾邏輯運(yùn)算。現(xiàn)階段大多數(shù)布爾運(yùn)算是通過激活相鄰的兩個(gè)或多個(gè)單元的字線,用靈敏放大器(Sensa Amplifier, SA)感測位線電壓所實(shí)現(xiàn)[25–28]。然而對于使用傳統(tǒng)的6T陣列執(zhí)行存內(nèi)操作,同時(shí)開啟多行會帶來一些挑戰(zhàn),例如讀干擾問題。因此電路設(shè)計(jì)者采用讀寫分離的SRAM單元[6,26,29]或降低字線(Word Line, WL)電壓的方法來緩解這些挑戰(zhàn)。Agrawal等人[2]則提出了8T SRAM和8+T SRAM單元結(jié)構(gòu)實(shí)現(xiàn)布爾邏輯運(yùn)算,提高了吞吐率和計(jì)算速度。這里主要介紹其或非(Not OR,NOR)和與非(Not AND , NAND)邏輯運(yùn)算。8T SRAM單元結(jié)構(gòu)如圖3(a)所示,通過控制一列中兩個(gè)位單元的讀操作,在RBL上實(shí)現(xiàn)布爾邏輯運(yùn)算。如圖3(b)所示,為了實(shí)現(xiàn)NOR邏輯運(yùn)算,首先將RBL預(yù)充到VDD,同時(shí)激活一列中相鄰兩個(gè)單元的字線,當(dāng)單元1和單元2中存儲的數(shù)據(jù)都為0時(shí),兩個(gè)單元的放電路徑同時(shí)截止,RBL保持預(yù)充高電平,經(jīng)過兩個(gè)反相器(INVerter, INV)后,NOR輸出為1,其余輸出為0。
圖3 布爾運(yùn)算
NAND邏輯運(yùn)算通過準(zhǔn)確控制兩條讀字線(Read Word Line, RWL)的脈沖寬度實(shí)現(xiàn),只有當(dāng)單元1和單元2中存儲的數(shù)據(jù)都為1時(shí),兩個(gè)單元中的M1, M3同時(shí)導(dǎo)通放電(此時(shí)放電速度最快),單元1和單元2其中一個(gè)為1時(shí),只有一個(gè)放電路徑使得RBL放電不完全。如圖3(c)所示,這兩種情況下RBL上的電壓會有所不同。通過選擇INV3的跳變點(diǎn),使得它僅在“11”情況下輸出高電平,此時(shí)INV4輸出NAND操作。兩種運(yùn)算的真值表如圖3(d)所示,此單元具有解耦的讀寫路徑,同時(shí)激活兩條讀字線不會帶來讀干擾問題。另一種設(shè)計(jì)是將8T SRAM結(jié)構(gòu)改進(jìn)為8T+SRAM結(jié)構(gòu),其使用非對稱SA檢測兩條讀位線上的電壓差實(shí)現(xiàn)布爾邏輯運(yùn)算,因?yàn)榇藛卧Y(jié)構(gòu)允許差分讀取檢測,所以與8T單元結(jié)構(gòu)相比具有更高的魯棒性。
表1比較了5種現(xiàn)有的存內(nèi)計(jì)算實(shí)現(xiàn)布爾運(yùn)算的技術(shù),結(jié)果表明,大多數(shù)方案是通過修改標(biāo)準(zhǔn)單元實(shí)現(xiàn)各種布爾運(yùn)算。文獻(xiàn)[30,31]提出創(chuàng)新的策略使用6T SRAM 單元執(zhí)行布爾運(yùn)算,避免了讀寫干擾的風(fēng)險(xiǎn)。其將兩個(gè)被訪問的單元連接到不同的局部位線,最終在全局位線連接的SA端輸出運(yùn)算結(jié)果。類似于上述策略的大多數(shù)存內(nèi)設(shè)計(jì)在單個(gè)周期只能實(shí)現(xiàn)兩個(gè)輸入的布爾運(yùn)算,若要實(shí)現(xiàn)復(fù)合布爾邏輯運(yùn)算至少需要兩個(gè)周期。文獻(xiàn)[32]提出新的12T雙端口雙互鎖存儲單元在單個(gè)周期內(nèi)同時(shí)實(shí)現(xiàn)兩對數(shù)據(jù)集的布爾運(yùn)算。安徽大學(xué)的Lin團(tuán)隊(duì)[33]充分利用傳統(tǒng)8T的雙字線和3個(gè)讀端口實(shí)現(xiàn)多輸入布爾運(yùn)算,有效地突破了現(xiàn)有方案的瓶頸。這些工作則解決了多輸入布爾邏輯需要兩周期的問題,能做到在1個(gè)周期內(nèi)就可完成復(fù)合布爾邏輯運(yùn)算。
表1 CIM實(shí)現(xiàn)布爾運(yùn)算的相關(guān)設(shè)計(jì)參數(shù)以及性能指標(biāo)
DNN的關(guān)鍵算法是矩陣向量乘法(Matrix-Vector Multiply, MVM),包括乘法和累加計(jì)算。然而,算法頻繁的訪問存儲被限制了能效和速度,為了解決這個(gè)問題,學(xué)者提出BNN將權(quán)重和神經(jīng)元激活二值化[34–36],MVM被簡化成按位XNOR運(yùn)算。Agrawal等人[14]實(shí)現(xiàn)了XNOR運(yùn)算通過模擬累加方式把結(jié)果累加到SL之上,原理如圖4所示。
其中操作分為兩步:預(yù)備階段如圖4(a)所示,在執(zhí)行運(yùn)算之前2維向量輸入A1和K1被存儲在存儲陣列之中,RBL/RBLB預(yù)充到VDD。接著,A1相應(yīng)行的字線RWL打開,RBL/RBLB根據(jù)相應(yīng)存儲陣列存儲的值進(jìn)行放電,然后,所對應(yīng)行的SL接地。例如,存儲陣列存儲的數(shù)值為“1”(Q=VDD,QB=0 V),則RBL通過M2, M1放電到0 V。運(yùn)算階段如圖4(c)所示,首先,對K1進(jìn)行操作,K1值的大小是存儲陣列存儲值設(shè)定的。如果Q=0,則K1=0;如果Q=1,則K1=1。然后K1所在行的SL上寄生電容存儲了初始電壓,并且其對應(yīng)行的RWL開啟。最后SL上積累XNOR計(jì)算結(jié)果。例如,A1=0,K1=0,則SL電壓“上拉”;A1=0,K1=1,則SL電壓“下拉”。通過上面兩步實(shí)現(xiàn)了A1*K1,也就是XNOR運(yùn)算。對應(yīng)的真值表可由圖4(b)看出。完成了單次XNOR運(yùn)算后,運(yùn)算的累加結(jié)果體現(xiàn)在SL電壓上。
圖4 乘法運(yùn)算
整個(gè)存內(nèi)乘法技術(shù)的關(guān)鍵是如何累加XNOR計(jì)算結(jié)果。一些存內(nèi)計(jì)算設(shè)計(jì)[11,37,38]以模擬的方式在SRAM陣列中實(shí)現(xiàn)乘法累加,以加速人工智能算法。表2總結(jié)了部分存內(nèi)設(shè)計(jì)實(shí)現(xiàn)乘法運(yùn)算的參數(shù)以及性能指標(biāo)。雖然有些方法可以顯著提高能量效率和執(zhí)行效率,但也存在一些不足,例如使用ADC/DAC會產(chǎn)生額外的面積開銷或者受到模擬非理想性的影響降低了推理的準(zhǔn)確性。針對這些問題一些學(xué)者做了分析研究,例如文獻(xiàn)[37]提出了奇偶雙通道策略增加了運(yùn)算吞吐量和整體系統(tǒng)的能耗效率。文獻(xiàn)[39]研究了模擬運(yùn)算的非理想性對基于6T SRAM單元實(shí)現(xiàn)點(diǎn)乘運(yùn)算的影響,并提出有效的緩解方案。文獻(xiàn)[40]將基于6T SRAM的內(nèi)存運(yùn)算與數(shù)字近內(nèi)存計(jì)算多位積和運(yùn)算相結(jié)合,以提高讀取精度并減少面積開銷。
表2 存內(nèi)實(shí)現(xiàn)乘法運(yùn)算的參數(shù)以及性能指標(biāo)
減法運(yùn)算是廣泛使用的匹配模式算法,根據(jù)脈寬調(diào)制技術(shù)研究者提出基于SRAM的減法運(yùn)算。減法運(yùn)算實(shí)現(xiàn)如圖5所示,將減數(shù)以4位二進(jìn)制的形式輸入到字線脈沖產(chǎn)生電路,脈沖產(chǎn)生電路根據(jù)輸入的特征值選擇開啟一條字線(輸入為1時(shí)開啟WL,反之開啟WLB),4條字線開啟的時(shí)間根據(jù)輸入特征值的權(quán)重高低分別為8T, 4T, 2T, 1T。被減數(shù)以4位二進(jìn)制形式存儲在一列相鄰的4個(gè)存儲單元。如果局部位線(Local Bit Line, LBL)和局部位線非(Local Bit Line Bar, LBLB)與存儲節(jié)點(diǎn)“0”連接則使其放電,與節(jié)點(diǎn)“1”相連則保持預(yù)充電壓。之后通過比較兩條局部位線的電壓差獲得減法的計(jì)算結(jié)果,這種多行開啟的方式實(shí)現(xiàn)減法運(yùn)算極大地提高了吞吐量。
圖5 減法運(yùn)算原理圖
CAM主要分為二進(jìn)制內(nèi)容可尋址(Binary Content Addressable Memory, BCAM)和三進(jìn)制內(nèi)容可尋址(Ternary Content Addressable Memory,TCAM)。通過對需要檢索的數(shù)據(jù)與存儲器內(nèi)的數(shù)據(jù)進(jìn)行比較匹配得到存儲位置,這樣操作可以極大程度地減少待檢索數(shù)據(jù)的搬移。
3.4.1 二進(jìn)制內(nèi)容可尋址
文獻(xiàn)[9]使用如圖6(a)所示的push-rule 6T SRAM單元構(gòu)成的陣列,BCAM操作時(shí),搜索數(shù)據(jù)和待查找數(shù)據(jù)都是由4位二進(jìn)制組成的,搜索數(shù)據(jù)以電壓的形式加載到字線,待查找數(shù)據(jù)存儲在一列相鄰的4個(gè)單元。每列的匹配結(jié)果通過位線BL與BLB接的SA和與門體現(xiàn)。文獻(xiàn)[41]提出了基于SRAM 6T的可重配置CAM/SRAM結(jié)構(gòu),如圖6(b)所示,該結(jié)構(gòu)可通過CAM_MODE在CAM模式和SRAM模式下進(jìn)行切換,提高了單元利用率。在CAM模式下執(zhí)行并行數(shù)據(jù)搜索,并通過單端靈敏放大器輸出結(jié)果表示尋址是否匹配。但是此設(shè)計(jì)以面積和功耗為代價(jià)實(shí)現(xiàn)并行數(shù)據(jù)搜索。利用CAM搜索數(shù)據(jù)的功能,文獻(xiàn)[42]提出CAM輔助電路技術(shù),該技術(shù)通過提高寫速度來提高能量效率。文獻(xiàn)[43]則利用3D-CAM設(shè)計(jì)一種新穎的存內(nèi)數(shù)模轉(zhuǎn)換器。
圖6 二進(jìn)制內(nèi)容可尋址
3.4.2 三進(jìn)制內(nèi)容可尋址
另外一種尋址模式為TCAM三進(jìn)制尋址。由于TACM在存內(nèi)中可以有無關(guān)態(tài),因此其可以匹配多個(gè)搜索字符串。表3比較了多種現(xiàn)有的內(nèi)容可尋址方案,如圖7(a)所示為TCAM陣列[33],其中TCAM的3種狀態(tài):0/1/X(X為無關(guān)態(tài)),分別由00/11/10表示。搜索的數(shù)據(jù)存儲在SRAM陣列同一行相鄰的兩列中,目標(biāo)數(shù)據(jù)由RWL和WLL的電平表示。文獻(xiàn)[44]同樣使用讀寫分離的8T單元實(shí)現(xiàn)TCAM功能,如圖7(b)所示,通過控制其RWL和搜索字線USL和LSL的開關(guān)實(shí)現(xiàn)尋址。此單元不僅可配置為TCAM,還可以執(zhí)行左移、右移功能。
圖7 三進(jìn)制內(nèi)容可尋址
表3 存內(nèi)CAM芯片參數(shù)以及性能指標(biāo)總結(jié)
與上述不同的是,文獻(xiàn)[45]提出的10T SRAM提高存內(nèi)計(jì)算的穩(wěn)定性,通過重新配置數(shù)據(jù)線、讀出放大器和讀端口可實(shí)現(xiàn)內(nèi)容可尋址,由于其單元結(jié)構(gòu)的對稱性可提供按行或列的數(shù)據(jù)搜索??紤]到三進(jìn)制內(nèi)容可尋址存儲器受到單元面積大、高搜索功率以及匹配線上搜索速度和信號余量的折中等限制,Xue等人[46]采用分離控制14T TCAM單元和一種3倍裕量電壓檢測放大器緩解上述問題,同時(shí)降低了搜索延遲和搜索能量。
在SRAM陣列中執(zhí)行乘法累加運(yùn)算的本質(zhì)是模擬運(yùn)算,其將權(quán)重存儲在單元陣列中,輸入激活應(yīng)用到字線,運(yùn)算結(jié)果以模擬電壓的形式體現(xiàn),那么如何量化該模擬電壓以及提高量化精度顯得尤為重要。
常見的ADC結(jié)構(gòu)有積分型ADC[12,14,47]、逐次逼近型ADC[3,48–50](Successive Approximation Register Analog-to -Digital Converter, SAR-ADC)以及Flash ADC [11,13,51,52],其中Flash ADC由多個(gè)比較器構(gòu)成,是目前轉(zhuǎn)換速率最快的一種結(jié)構(gòu)。文獻(xiàn)[4, 5]在外圍電路中嵌入11級Flash ADC,將代表每列MAC結(jié)果的模擬電壓進(jìn)行數(shù)字化處理。每個(gè)ADC由10個(gè)基于采樣的自校準(zhǔn)單端比較器組成,其操作分為兩個(gè)步驟,首先,在每列MAC計(jì)算期間,將代表運(yùn)算結(jié)果的MBL通過傳輸門連接到比較器的電容Vcap,同時(shí)RSTB=1產(chǎn)生負(fù)反饋。之后,將電容的輸入節(jié)點(diǎn)切換到參考電壓VREF,并且關(guān)閉負(fù)反饋路徑。VREF和VMBL之間的電壓差將導(dǎo)致電容的充放電,使反相器被驅(qū)動為高電平或低電平,之后通過增益反相器鏈放大輸出數(shù)字值。文獻(xiàn)[53]使用strong-arm比較器構(gòu)成的11級Flash ADC進(jìn)行數(shù)字化,并且通過多路復(fù)用器在64列之間共享ADC,減少了面積開銷。與非線性量化相比,其采用受限線性量化方案,由于更寬的參考電壓間隔將CIFAR-10的精度提高到88.8%。與上述不同的是文獻(xiàn)[13]在功耗、性能和面積之間權(quán)衡選擇了4 bit Flash ADC,此ADC使用SA代替模擬比較器以節(jié)省面積降低功耗。
與Flash ADC相比,SAR-ADC的結(jié)構(gòu)相對簡單,廣泛用于處理存內(nèi)計(jì)算中產(chǎn)生的模擬運(yùn)算結(jié)果??紤]到CIM中的ADC面積和能量開銷,文獻(xiàn)[49]采用SAR架構(gòu)的ADC提供8位輸出,用于后續(xù)數(shù)字計(jì)算。文獻(xiàn)[3]使用SAR-ADC將多位乘法運(yùn)算累加的模擬電壓轉(zhuǎn)換為數(shù)字輸出,由于采用SA作為比較器和電容陣列的DAC,從而降低了SAR-ADC的靜態(tài)功耗。文獻(xiàn)[37]利用了電容陣列經(jīng)過多周期操作生成了不同的參考電壓用于處理位線的模擬電壓,并且利用了電容陣列對位線電壓進(jìn)行了高低位合并,也就是進(jìn)行了加權(quán)。在此ADC中是將不同數(shù)值的電容通過開關(guān)依次接到SA兩端中的一端,也就是通過多個(gè)操作階段進(jìn)行逐次比較,從而對位線的模擬電壓進(jìn)行量化。盡管此逐次逼近型ADC相較于Flash ADC在量化速度上有所不足,但是使用多周期可以節(jié)省大量的面積開銷。
如何將低精度ADC應(yīng)用于存內(nèi)計(jì)算之中一直是關(guān)鍵技術(shù)。下面的工作就是利用了數(shù)字電路進(jìn)行輔助,使得低精度ADC在量化模擬電壓時(shí)也能提高量化結(jié)果。
文獻(xiàn)[14]提出基于電荷共享方法來執(zhí)行XNOR和近似popcount運(yùn)算。最終的結(jié)果以模擬電壓的形式體現(xiàn)在源極SL上,為了檢測該模擬電壓,他們提出了一種低開銷、低精度電荷共享的串行積分型ADC。由于低精度的ADC很難檢測準(zhǔn)確地模擬電壓。所以該方案還采用雙字線和雙級ADC技術(shù)來最小化脈沖計(jì)數(shù)輸出的誤差。雙字線技術(shù)存儲器陣列每行的前1/2單元連接到RWL1,另1/2連接到RWL2。以確保一次只有1/2的單元參與電荷共享,從而減少待檢測的SL上電壓狀態(tài)的數(shù)量。雙級ADC如圖8(a)所示。在ADC檢測的第1階段,ADC控制模塊產(chǎn)生信號VREFN, VREFP以及使能信號SAE,并將其饋送到兩個(gè)SA,以確定SL上模擬電壓的子類。其他的控制信號用于ADC檢測的第2階段對虛擬單元進(jìn)行操作,虛擬單元根據(jù)子類在每個(gè)周期向SL注入或從SL泵出電荷,同時(shí)數(shù)字電路計(jì)數(shù)器在產(chǎn)生ADC輸出的最后3位期間對周期數(shù)進(jìn)行計(jì)數(shù)。
如圖8(b)所示,文獻(xiàn)[40]提出了自參考多級讀出器(Self-Reference Multi Level Reader, SRMLR)用于量化兩個(gè)位線的模擬電壓值。SRMLR是由電壓型SA、數(shù)據(jù)線預(yù)充選擇器、輸出鎖存器和編碼器所組成的。無論是Flash ADC、逐次逼近型ADC還是數(shù)字電路輔助型ADC都是對位線運(yùn)算結(jié)果進(jìn)行量化,并在面積、功耗、精度之間的折中。
圖8 數(shù)字輔助型ADC
為了實(shí)現(xiàn)存內(nèi)計(jì)算中的特定功能,國內(nèi)外學(xué)者對單元結(jié)構(gòu)的重構(gòu)或外圍電路的增添方面進(jìn)行了大量的研究。各種存算策略的出現(xiàn)同時(shí)也帶來很多架構(gòu)問題,下面針對存算架構(gòu)中幾個(gè)關(guān)鍵問題進(jìn)行分析。
5.1.1 晶體管尺寸加權(quán)技術(shù)
在實(shí)現(xiàn)多比特乘法中,晶體管的寬長比經(jīng)常被用來作為加權(quán)。如圖9(a)所示,8T陣列中通過調(diào)整不同列的讀取訪問管尺寸大小作為數(shù)據(jù)的權(quán)值[1],在此8T陣列中第1列的M1和M2的寬長比等于8,以此類推第2列、第3列、第4列的M1, M2的寬長比分別為4, 2, 1,因此可以實(shí)現(xiàn)多位乘1位的點(diǎn)積和運(yùn)算。此工作合并4列的位線放電電流,最后通過運(yùn)算放大器將電流值轉(zhuǎn)化成電壓值進(jìn)行量化。相同地,文獻(xiàn)[37]基于傳統(tǒng)8T提出了twin-8T結(jié)構(gòu),將其中一組讀取晶體管寬長比調(diào)至另外一組的2倍,實(shí)現(xiàn)了兩比特輸入加權(quán)。
圖9 晶體管尺寸加權(quán)
如圖9(b)所示,文獻(xiàn)[38,54]提出一種可轉(zhuǎn)置運(yùn)算單元結(jié)構(gòu),其內(nèi)部也是利用晶體管的寬長比進(jìn)行加權(quán)。此策略是基于傳統(tǒng)6T單元增加額外的晶體管,可以實(shí)現(xiàn)水平方向和垂直方向的乘法運(yùn)算。上述的研究均是利用了位線放電電流與晶體管寬長比成正比的特點(diǎn),所以可以通過調(diào)節(jié)其尺寸得到多位乘法運(yùn)算。但是由于需要調(diào)大管子的尺寸,所以在芯片之中所需要的面積開銷也很大。如果想要實(shí)現(xiàn)更高位的運(yùn)算,那么面積開銷是需要呈指數(shù)倍增長,文獻(xiàn)[37,38,54]利用寬長比方法只做了兩位加權(quán)。寬長比對運(yùn)算進(jìn)行加權(quán)的實(shí)質(zhì)是對電流進(jìn)行等比例擴(kuò)大,之后研究的方向可致力于尋找另一種等比例擴(kuò)大電流的策略來代替寬長比加權(quán),減少面積開銷帶來的挑戰(zhàn)。
5.1.2 電容陣列加權(quán)技術(shù)
電容陣列在實(shí)現(xiàn)運(yùn)算結(jié)果的高低位合并是一項(xiàng)常用的技術(shù),也就是通過電容陣列提高運(yùn)算的位數(shù)[11,13]。如圖10(a)所示,RBL[3]-RBL[0]每一列上的電容總值都為9CU,然而每根位線上分享的電容數(shù)值比例為8:4:2:1,因此可通過打開S0和S1分別在N3-N0得到8 /9?v, 4 /9?v, 2 /9?v, 1 /9?v。文獻(xiàn)[55, 56]通過比例為16:1的電容陣列,完成了低4位運(yùn)算同高4位運(yùn)算的合并,基本操作與上述類似。上述的研究都是通過電容的數(shù)值完成加權(quán)操作的,此技術(shù)與晶體管尺寸技術(shù)加權(quán)同樣有較大的面積消耗。另外一種做法是通過多周期多運(yùn)算結(jié)果進(jìn)行分享[57]得到與電容加權(quán)相同的結(jié)果,如圖10(b)所示,如果需要1/8加權(quán),位線在第1個(gè)周期連接到端口2,電壓降低到1/4。第2個(gè)周期,位線連接到端口1,電荷再平分,所以現(xiàn)在的電荷變成原來的1/8。為了獲得其他權(quán)重,可以在類似于上述操作的多周期操作中完成,此技術(shù)比上述電容數(shù)值加權(quán)技術(shù)增加了計(jì)算周期,但是減小了面積開銷 。
圖10 電容加權(quán)技術(shù)
通過電容陣列,無論是電容數(shù)值加權(quán)還是多周期分享,都是在面積開銷和速度開銷之間的折中。而且,電容分享在通過開關(guān)共享時(shí)也會有損耗,影響計(jì)算結(jié)果的精度。過大的電容雖然可以增加計(jì)算結(jié)果的線性度,但是也會給電路帶來額外的功耗。
5.1.3 脈沖個(gè)數(shù)/高度/寬度加權(quán)技術(shù)
Sinangil 等人[13]提出的用于機(jī)器學(xué)習(xí)的CIM芯片采用了脈沖個(gè)數(shù)調(diào)制電路,如圖11(a)所示,利用字線 RWL 上不同的脈沖數(shù)目代表不同的權(quán)重。這些脈沖是由計(jì)數(shù)器根據(jù)輸入數(shù)據(jù)的數(shù)值所產(chǎn)生的,再應(yīng)用到字線開啟單元,從而實(shí)現(xiàn)多比特輸入。脈沖高度加權(quán)可以由如圖11(b)所示電路產(chǎn)生,字線DAC電路由二進(jìn)制權(quán)值電流源和復(fù)制單元所組成[19],此電路可根據(jù)輸入數(shù)據(jù)不同生成不同比例的電流,電流再通過二極管連接的MA,R產(chǎn)生應(yīng)用于字線的電壓,輸出電壓根據(jù)數(shù)字量0000-1111一一對應(yīng),從而實(shí)現(xiàn)了不同權(quán)重的輸入。除了脈沖個(gè)數(shù)與脈沖高度加權(quán)技術(shù),還有另外一種控制訪問管放電時(shí)間的脈寬加權(quán)。如圖11(c)所示,文獻(xiàn)[55,56]提出了一種功能性讀技術(shù)對存儲的權(quán)重進(jìn)行4位加權(quán)。該策略的實(shí)現(xiàn)是基于脈寬調(diào)制,而且在位線電壓保持在一定的范圍內(nèi),位線放電電壓與字線開啟時(shí)間成正比,所以可以通過調(diào)整WL0-WL3開啟時(shí)間為8:4:2:1實(shí)現(xiàn)4位加權(quán)運(yùn)算。
圖11 脈沖加權(quán)
3種技術(shù)的核心問題在位線上等效電阻與寄生電容不是恒定的,在整個(gè)計(jì)算過程中位線電壓是動態(tài)變化的,因此會使整個(gè)系統(tǒng)計(jì)算精度下降。而且整個(gè)陣列中字線長度較長,所以應(yīng)用于字線的電壓會隨著寄生電容不同發(fā)生畸變,導(dǎo)致相同的計(jì)算數(shù)值在不同列產(chǎn)生不同的放電電壓,產(chǎn)生計(jì)算結(jié)果有不一致性。
為了保障存內(nèi)計(jì)算中的一致性以及提高線性度,文獻(xiàn)[58]提出了一種共源共柵電流鏡(Cascade Current Mirror, CCM)用于鉗制位線電壓,如圖12(a)所示,每條位線上增加4個(gè)晶體管,鉗制位線電壓并按比例鏡像讀取電流,從而提高計(jì)算的線性度。時(shí)序如圖12(b)所示,在預(yù)充電過程中,BL充電至VDD/2左右,Vout接地,VCM/VG連接至VDD;然后CCM進(jìn)入預(yù)讀取階段,VG連接到 BL,為了確保晶體管在飽和區(qū)工作,VCM的偏置電壓被設(shè)置為VDD/2左右,CCM需要很短的預(yù)讀取時(shí)間,以使BL 的電壓在 WLR脈沖到達(dá)之前保持穩(wěn)定。最后多行讀取開始,多行字線被激活,M1和M3按比例鏡像多行讀取時(shí)位線上的總電流IBL,并且通過電容收集鏡像的電流形成輸出電壓Vout表示計(jì)算結(jié)果。由于此電路采用雙字線6T單元結(jié)構(gòu),減少了字線上的脈沖寬度延遲,從而保證電路計(jì)算的一致性。仿真結(jié)果顯示,在0.8 V電壓下,CCM電路可將非線性降低70%,在0.9 V電壓下,計(jì)算一致性提高54.85%。此研究不僅探索了非線性和不一致性產(chǎn)生的原因,還提出相應(yīng)的解決方案是當(dāng)前技術(shù)的一個(gè)突破。Kim等人[59]提出了全數(shù)字位串行計(jì)算架構(gòu),基于其新穎的可重構(gòu)位串行結(jié)構(gòu),輸入和權(quán)重精度可從1 bit配置到6 bit,此設(shè)計(jì)不受上述模擬計(jì)算的非理想性影響,但是提供的面積優(yōu)勢是以降低吞吐率為代價(jià)。
圖12 共源共柵電流鏡
存內(nèi)計(jì)算的架構(gòu)為了執(zhí)行額外的計(jì)算功能需要大量的外圍輔助電路來完成。例如,在實(shí)現(xiàn)數(shù)字功能中的邏輯運(yùn)算時(shí),每一列位線上需要兩個(gè)SA來區(qū)別不同輸入;在執(zhí)行模擬運(yùn)算中的乘累加時(shí),就需要外圍輔助電路量化這些電壓值。典型的做法是引用ADC進(jìn)行量化,這都會增加外圍電路的占比。此外,多比特輸入生成也會占據(jù)很大部分的面積。
外圍電路占比過大是研究者在設(shè)計(jì)電路過程中需要去解決的問題,為了減少外圍電路的開銷,Yin等人[53]通過64列共用一個(gè)ADC,分64次對位線電壓進(jìn)行量化。Biswas等人[12]實(shí)現(xiàn)了存內(nèi)基于脈寬的6 bit輸入,傳統(tǒng)的做法是通過外圍電路生成64種不同脈寬,再根據(jù)輸入將對應(yīng)的脈寬作用到陣列之上,這樣策略的外圍電路面積開銷過大。此工作中提出了GBL_DAC(Global Bit Line Digital-to-Analog Converter)電路,該電路使用了3個(gè)2:1多路復(fù)用器(MUltipleXing, MUX)和一個(gè)8:1MUX實(shí)現(xiàn)了64:1MUX的功能,通過組合8種不同的脈寬就可生成64種與輸入對應(yīng)的脈寬,大大減少面積開銷。在存內(nèi)計(jì)算系統(tǒng)級設(shè)計(jì)時(shí)也不能一味為了實(shí)現(xiàn)更復(fù)雜的運(yùn)算增加外圍電路而忽視了輔助電路的復(fù)雜性。
在存內(nèi)計(jì)算中經(jīng)常需要同時(shí)開啟多行進(jìn)行操作,增加數(shù)據(jù)處理的吞吐量。但是,同時(shí)開啟多行會導(dǎo)致存儲節(jié)點(diǎn)與位線直接相連接,讀取過程中很容易造成數(shù)據(jù)被翻轉(zhuǎn),導(dǎo)致最后的計(jì)算結(jié)果發(fā)生錯(cuò)誤。如圖13(a)所示,在一列中相鄰4個(gè)單元中存儲的數(shù)據(jù)為“0111”,相對應(yīng)的4根字線WL0-WL3被激活,其開啟時(shí)間分別為8T0, 4T0, 2T0, T0。BLB電流根據(jù)單元內(nèi)部存儲的數(shù)據(jù)從M3, M2, M1流向存儲“0”數(shù)據(jù)單元的M0。傳統(tǒng)SRAM基本單元為左右對稱互補(bǔ)結(jié)構(gòu),所以BL上電流正好與BLB相反,并且BL可以通過3個(gè)路徑放電,會使位線電壓快速降低。如果位線電壓降得過低,會影響3個(gè)存儲“1”的單元,使內(nèi)部數(shù)據(jù)容易發(fā)生翻轉(zhuǎn),這樣會導(dǎo)致存內(nèi)計(jì)算中讀取魯棒性降低。最壞的情況會發(fā)生在放電為8T0時(shí),此時(shí)位線放電量最大。
為了解決上述討論的讀破壞問題,Kang等人[60]則通過降低字線WL的開啟電壓來減緩位線的速度,并且調(diào)節(jié)每個(gè)T0的時(shí)間使其放電的線性度最優(yōu)。如圖13(b)所示,有研究者通過重構(gòu)傳統(tǒng)SRAM單元提出了7T, 8T, 9T, 10T等一系列讀寫分離結(jié)構(gòu)[6,14,44,52],這樣把讀、寫操作分開,被隔離的位線不會影響到內(nèi)部節(jié)點(diǎn),也就不會出現(xiàn)讀破壞的現(xiàn)象。為了不影響存儲密度,其他研究者選擇將基本6T單元結(jié)構(gòu)的存儲陣列分割成較小的部分[30,31],如圖13(c)所示,其將兩部分被訪問的小陣列模塊連接到不同的局部位線,最終在全局位線連接的SA端輸出運(yùn)算結(jié)果,從而降低了讀破壞的風(fēng)險(xiǎn)。
圖13 多行讀取的讀破壞
以應(yīng)用為導(dǎo)向的存內(nèi)計(jì)算系統(tǒng)是需要考慮存儲器密度、計(jì)算精度、功耗等因素的。想要進(jìn)行敏捷的CIM系統(tǒng)設(shè)計(jì),研究者可以針對電路單元庫的不同層次,研究多模式下電路的自動建模,快速獲得各層次電路模塊的參數(shù)以支撐芯片綜合算法。
電路執(zhí)行不同任務(wù),在性能、功耗等方面顯示出不同的需求,這使得最終的電路的設(shè)計(jì)和結(jié)構(gòu)會有所不同。這一點(diǎn)在存內(nèi)計(jì)算場景下將變得更加突出,因此,如圖14所示,需要建立一個(gè)高能效的電路單元庫,可以滿足盡可能多的任務(wù)場景。已有的電路模塊中,相同功能的不同電路模塊往往具有不同的電路接口,這不利于在電路迭代時(shí)進(jìn)行敏捷設(shè)計(jì)。因此為了實(shí)現(xiàn)CIM芯片的敏捷設(shè)計(jì),可以應(yīng)當(dāng)構(gòu)建具有相同接口的模塊電路庫。當(dāng)硬件參數(shù)、需求改變時(shí),通過迭代關(guān)鍵路徑關(guān)鍵模塊可以提升目標(biāo)性能,以此縮短存內(nèi)計(jì)算芯片迭代時(shí)間,提升電路設(shè)計(jì)的敏捷性。
圖14 電路單元庫模型實(shí)例
CIM的最大優(yōu)勢在于減少數(shù)據(jù)的搬移,而不在于復(fù)雜計(jì)算。若某種算法其數(shù)據(jù)并不需要頻繁搬移或者改變,同時(shí)運(yùn)算卻較為復(fù)雜,那么“存內(nèi)”并不合適。因此,如圖15所示,研究者應(yīng)當(dāng)首先分析SRAM特點(diǎn)、CIM的限制以及主流人工智能算法的需求。之后需要提煉算法共性基本算子、提煉算法位數(shù)、容量需求。根據(jù)所提煉的共性基本算子、各種需求,規(guī)劃電路模塊功能接口、規(guī)劃精度位數(shù)可調(diào)范圍、規(guī)劃共享的層次數(shù)目、每個(gè)層次的計(jì)算資源共享模式。之后再設(shè)計(jì)計(jì)算資源調(diào)度策略,實(shí)現(xiàn)計(jì)算資源調(diào)度器。調(diào)度器需考慮SRAM的狀態(tài)以及計(jì)算資源的狀態(tài),根據(jù)請求進(jìn)行調(diào)度選擇合適的計(jì)算資源,避免沖突。
圖15 計(jì)算資源調(diào)度方式研究方案
想要充分發(fā)揮CIM的優(yōu)勢,可以將其看成系統(tǒng)的一部分而不僅是一個(gè)割裂的輔助加速器。在CIM系統(tǒng)中,并不是所有的數(shù)據(jù)都適合在存內(nèi)處理,部分?jǐn)?shù)據(jù)在處理器中計(jì)算,部分?jǐn)?shù)據(jù)在CIM中計(jì)算。程序在CIM中執(zhí)行的部分必須與在處理器中繼續(xù)執(zhí)行的部分保持一致。但是由于一致性消息消耗了大量的片外通信,CIM體系結(jié)構(gòu)無法使用傳統(tǒng)的方法來實(shí)現(xiàn)緩存一致性,對于許多數(shù)據(jù)密集型應(yīng)用程序來說,這可能會抵消CIM執(zhí)行的好處。研究思路如圖16所示,未來研究方向可能是在傳統(tǒng)粒度一致性的基礎(chǔ)上,通過準(zhǔn)預(yù)測的思想,減少CIM提交來減少沖突發(fā)生回滾的開銷。這樣不僅避免了大量不必要的數(shù)據(jù)刷新所造成的功耗,還保障了數(shù)據(jù)的一致性。
圖16 面向CIM的異構(gòu)多處理器系統(tǒng)關(guān)鍵技術(shù)的研究思路
存內(nèi)計(jì)算技術(shù)作為“算力時(shí)代”中的前沿技術(shù)之一,其具有劃時(shí)代意義。SRAM存內(nèi)計(jì)算是克服傳統(tǒng)馮·諾依曼架構(gòu)中存在的“存儲墻”問題的有效策略,可以高能效地實(shí)現(xiàn)AI算法,為未來的智慧生活奠定了基礎(chǔ)。本文概述了SRAM存內(nèi)計(jì)算的應(yīng)用背景,并且討論了現(xiàn)有SRAM架構(gòu)所能實(shí)現(xiàn)的運(yùn)算功能。用于復(fù)雜的應(yīng)用時(shí)電路需具有要高精度的量化能力,為此我們還研究了SRAM存內(nèi)計(jì)算架構(gòu)中各種量化技術(shù)。并且探討了SRAM存內(nèi)計(jì)算技術(shù)中存在的一系列問題和面臨的挑戰(zhàn)。存內(nèi)計(jì)算架構(gòu)的競爭力體現(xiàn)在芯片的整體性能,而整體性能本質(zhì)是各種問題之間的折中,基于存內(nèi)計(jì)算架構(gòu)的芯片在未來定會廣泛地應(yīng)用于各個(gè)領(lǐng)域。