時(shí)間:2022年01月21日 分類(lèi):電子論文 次數(shù):
摘要微處理器是現(xiàn)代信息系統(tǒng)的核心基礎(chǔ)設(shè)施.大數(shù)據(jù)、人工智能、5G等技術(shù)的快速發(fā)展催生了數(shù)據(jù)量的爆發(fā)性增長(zhǎng),隨之對(duì)數(shù)據(jù)處理能力的需求也急劇增長(zhǎng).專(zhuān)用計(jì)算技術(shù)被廣泛認(rèn)為是后摩爾時(shí)代的計(jì)算機(jī)體系結(jié)構(gòu)演化的重要方向.專(zhuān)用處理器技術(shù)的發(fā)展一直伴生著通用處理器的發(fā)展,數(shù)字信號(hào)處理技術(shù)甚至早于傳統(tǒng)意義上的通用處理器.通用處理器技術(shù)的發(fā)展,不僅在商業(yè)上取得了巨大的成功,很多關(guān)鍵技術(shù)也被專(zhuān)用處理器吸收借鑒用于提升專(zhuān)用計(jì)算的性能、優(yōu)化可編程性等.本文主要分析了數(shù)字信號(hào)處理器(DSP)、圖像處理器(GPU)、深度學(xué)習(xí)處理器(AI芯片)和網(wǎng)絡(luò)處理器(NPU)的關(guān)鍵技術(shù)特征,并進(jìn)一步對(duì)專(zhuān)用計(jì)算架構(gòu)未來(lái)發(fā)展可能涉及的關(guān)鍵點(diǎn)作出了簡(jiǎn)要的評(píng)述.
關(guān)鍵詞專(zhuān)用處理器,數(shù)字信號(hào)處理,圖像處理,深度學(xué)習(xí),網(wǎng)絡(luò)處理
1引言
如果不考慮成本因素,一顆理想的處理器應(yīng)該可以像CPU(centralprocessingunit)一樣通用,像DSP(digitalsignalprocessor)一樣處理數(shù)字信號(hào),像GPU(graphicsprocessingunit)一樣處理圖像數(shù)據(jù),像NPU(networkprocessingunit,網(wǎng)絡(luò)處理器,也簡(jiǎn)稱(chēng)NP)一樣處理網(wǎng)絡(luò)數(shù)據(jù)包,像“礦機(jī)”一樣競(jìng)爭(zhēng)加密貨幣共識(shí)算力,像神經(jīng)網(wǎng)絡(luò)芯片一樣運(yùn)行深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練和推理等.
但是,實(shí)現(xiàn)如此萬(wàn)能的處理器芯片是不現(xiàn)實(shí)的,至少?gòu)慕?jīng)濟(jì)成本角度不具備可行性,專(zhuān)用化就成為了發(fā)展的必然[1].專(zhuān)用處理器并不是通用CPU完全改弦易轍,而更像是基于通用處理器技術(shù)的一種分化.所以我們看到現(xiàn)代DSP、基帶處理器、網(wǎng)絡(luò)處理器的很多成功產(chǎn)品都包含一個(gè)甚至多個(gè)通用RISC(reducedinstructionsetcomputer)核來(lái)做系統(tǒng)管理、運(yùn)行操作系統(tǒng)、與主機(jī)通信,將協(xié)處理器也變成一個(gè)具備自我管理能力的主動(dòng)設(shè)備.從時(shí)間上看,DSP可能也是出現(xiàn)最早的計(jì)算芯片,在集成電路發(fā)明(1958年)之前,德州儀器(TI)公司已經(jīng)在大批量生產(chǎn)硅晶體管器件.
TI公司在1967年發(fā)明手持計(jì)算器,1971年研制了單芯片微型計(jì)算機(jī).在此之前的“DSP”只能稱(chēng)為利用分立器件信號(hào)處理(processing),還不是名副其實(shí)的“processor”.DSP沒(méi)有被冠名某個(gè)“PU”的稱(chēng)呼也許正是由于出現(xiàn)過(guò)早,當(dāng)時(shí)“PU”的稱(chēng)呼還沒(méi)流行起來(lái).CPU最早出現(xiàn)在1971年,GPU出現(xiàn)在1993年(雖然當(dāng)時(shí)的名稱(chēng)還不叫GPU),網(wǎng)絡(luò)處理器(NPU)出現(xiàn)在1999年.從這些時(shí)間關(guān)系上看,我們大體可以看出人們首先是對(duì)信號(hào)處理有需求,然后才擴(kuò)展到其他更普遍的數(shù)據(jù)處理需求上,因此有了對(duì)通用CPU的需求.再由于應(yīng)用的驅(qū)動(dòng),CPU難以滿足性能要求,進(jìn)而發(fā)展出了GPU,NPU等更專(zhuān)用的計(jì)算芯片.
從這個(gè)意義上看,通用CPU技術(shù)可以視為處理芯片的基本技術(shù),在此基礎(chǔ)上發(fā)展了高性能CPU、現(xiàn)代高效能DSP[2]、高吞吐GPU、高通量NPU[3]等各種“XPU”.個(gè)人認(rèn)為分析這些XPU的結(jié)構(gòu)特征有助于更深刻地理解“通用”和“專(zhuān)用”的本質(zhì)差異.針對(duì)專(zhuān)用處理器有很多關(guān)鍵問(wèn)題,包括:芯片在架構(gòu)上有什么差異,各自具備什么樣的軟件生態(tài),能否取得商業(yè)上的成功的決定性因素是什么等,而答案也莫衷一是.本文的重點(diǎn)是試圖從架構(gòu)層面去看待這些不同類(lèi)別的專(zhuān)用處理器芯片的差異,幫助我們預(yù)測(cè)未來(lái)架構(gòu)的發(fā)展趨勢(shì),對(duì)于專(zhuān)用處理器技術(shù)未來(lái)的發(fā)展做了些許開(kāi)放性的討論,拋磚引玉.
其次,本文主要討論經(jīng)典專(zhuān)用處理器的演化,而把通用CPU的發(fā)展作為背景而暫不加以專(zhuān)門(mén)討論.同時(shí),本文主要以DSP、GPU、AI芯片和NPU(網(wǎng)絡(luò)處理器)為主要參考對(duì)象,其中DSP以TI公司的C6000系列為主要參考,GPU以英偉達(dá)(Nvidia)公司的Tesla架構(gòu)為主要參考[4],AI芯片以寒武紀(jì)的DianNao[5]深度學(xué)習(xí)處理器和Google公司的TPU(tensorprocessingunit)[6]為主要參考,NPU以邁絡(luò)思(Mellanox)公司(已經(jīng)被Nvidia公司收購(gòu))的NP-5和因特爾(Intel)的IXP[3]為主要參考,均為各個(gè)公司比較有代表性的產(chǎn)品.限于篇幅,本文尚未將新出現(xiàn)DPU(dataprocessingunit)[7]芯片架構(gòu)納入討論,相關(guān)內(nèi)容將作為未來(lái)工作.專(zhuān)用計(jì)算架構(gòu)的設(shè)計(jì)難度不亞于通用CPU,核心目標(biāo)就是“有條件地”高性能.
無(wú)論是一個(gè)3W的DSP,還是一個(gè)300W的GPU,也無(wú)論是面向哪一個(gè)專(zhuān)用領(lǐng)域定制化的設(shè)計(jì),都追求在給定的功耗、芯片面積約束下實(shí)現(xiàn)高性能.然而,這個(gè)問(wèn)題的復(fù)雜性在于專(zhuān)用計(jì)算并不僅僅是設(shè)計(jì)幾個(gè)運(yùn)算單元,配合幾條數(shù)據(jù)通路那么簡(jiǎn)單,它涉及到IO子系統(tǒng)、操作系統(tǒng)內(nèi)核、網(wǎng)絡(luò)協(xié)議棧、訪問(wèn)安全、虛擬化、二次開(kāi)發(fā)的方便程度等層面的問(wèn)題,其中任何一個(gè)層面的問(wèn)題的專(zhuān)業(yè)性都極強(qiáng),要能融匯貫通并能系統(tǒng)地組織起來(lái)是一個(gè)巨大的挑戰(zhàn).掛一漏萬(wàn),本文的內(nèi)容只代表筆者的觀點(diǎn).本文余下內(nèi)容安排如下:
第2節(jié)闡述了專(zhuān)用處理器的基本概念,第3∼6節(jié)分別介紹了數(shù)字信號(hào)處理器(DSP)、圖形處理器(GPU)、AI芯片和網(wǎng)絡(luò)處理器(NPU)4類(lèi)重要的專(zhuān)用處理器的基本特征,第7節(jié)表述了筆者對(duì)于專(zhuān)用處理器的幾點(diǎn)思考,據(jù)此在第8節(jié)提出了構(gòu)建專(zhuān)用處理器系統(tǒng)結(jié)構(gòu)的關(guān)鍵點(diǎn),第9節(jié)總結(jié)全文.
2專(zhuān)用處理器的基本概念專(zhuān)用處理器(或?qū)S眉铀倨?,顧名思義,就是用于處理“特定應(yīng)用”的處理器,相對(duì)于通用處理器而言,這類(lèi)處理器性能更高、功耗更低、通常價(jià)格也更便宜,但是使用范圍也相對(duì)有限.計(jì)算芯片產(chǎn)業(yè)在過(guò)去50年的發(fā)展歷程中,比較成功的專(zhuān)用處理器門(mén)類(lèi)只有數(shù)字信號(hào)處理器(DSP)、圖形處理器(GPU)和網(wǎng)絡(luò)處理器(NPU),這是20世紀(jì)90年代就已經(jīng)基本定型的格局.在過(guò)去5年中,用于處理深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)處理器(AI芯片)也開(kāi)始快速發(fā)展,比較成功的案例包括Google公司的張量處理器TPU[6]、寒武紀(jì)公司的DianNao系列深度學(xué)習(xí)處理器[5]等.
專(zhuān)用處理器的最終目標(biāo)不是替代通用CPU,而是與現(xiàn)有的通用CPU技術(shù)協(xié)作,即將部分CPU運(yùn)行效率低下的應(yīng)用卸載(offloading)到專(zhuān)用加速器上運(yùn)行,通過(guò)構(gòu)建異構(gòu)計(jì)算平臺(tái)來(lái)高效地處理計(jì)算任務(wù).從產(chǎn)業(yè)生態(tài)的視角來(lái)看,相比于通用處理器的硬件與軟件分離的“水平”模式,專(zhuān)用加速器更注重軟硬協(xié)同的“垂直”發(fā)展模式.
這里效能指的是單位功耗下提供的計(jì)算能力,適應(yīng)性就是通常意義下的通用性.業(yè)界通常將數(shù)據(jù)處理芯片大體分為三大類(lèi):
處理器芯片、ASIC(applicationspecificintegratedcircuit)芯片和FPGA(fieldprogrammablegatearray)芯片.處理器芯片包括CPU,GPU,DSP等,是用戶可編程的芯片;ASIC是面向特定應(yīng)用(application-specific)的專(zhuān)用集成電路[8],通常也稱(chēng)之為全定制芯片,不可編程;FPGA器件屬于專(zhuān)用集成電路中的一種半定制電路,是可“編程”的邏輯列陣,利用查找表來(lái)實(shí)現(xiàn)組合邏輯,但FPGA的“編程”與處理器芯片的軟件編程不同,主要是配置邏輯,可以理解為硬件編程.從相對(duì)性能來(lái)看,ASIC芯片最好,處理器芯片最差,FPGA介于二者之間;但是從應(yīng)用的適應(yīng)性來(lái)看,處理器芯片最好,FPGA次之,ASIC芯片最差.
值得注意的是這種分類(lèi)標(biāo)準(zhǔn)并不是按照電路制造工藝,例如處理器芯片和ASIC芯片本質(zhì)上都是全定制的集成電路,處理器芯片本質(zhì)也是一種ASIC,但與通常意義上ASIC的最大差別還在于是否具有指令集,有指令集的就更類(lèi)似傳統(tǒng)的處理器,反之就歸類(lèi)為ASIC.此外,處理器芯片由于其使用廣泛、出貨量大,與軟件生態(tài)聯(lián)系尤其緊密,所以將其獨(dú)立為一個(gè)大的類(lèi)別.專(zhuān)用處理器芯片的研發(fā)追求達(dá)到效能和適應(yīng)性的一個(gè)新的帕累托最優(yōu)(Paretooptimality):效能接近ASIC,但是適應(yīng)性向處理器芯片靠近.
在效能上,專(zhuān)用加速器通過(guò)定制化實(shí)現(xiàn)遠(yuǎn)高于通用處理器芯片的效能;在適應(yīng)性上,從面向特定應(yīng)用(application-specific)的ASIC范式進(jìn)化為面向特定領(lǐng)域(domain-specific)的新范式,不妨稱(chēng)之為“DSIC(domain-specificintegratedcirucuit)”.DSIC與處理器芯片相比雖然弱化了通用性,但與ASIC相比也強(qiáng)化了適應(yīng)性. 無(wú)論是DSP、GPU、AI芯片、NPU,還是現(xiàn)在更新的各種“XPU”,都是處理數(shù)據(jù)的芯片,最終都需要執(zhí)行二進(jìn)制代碼的程序來(lái)完成計(jì)算.因此專(zhuān)用處理器設(shè)計(jì)也大都需要涉及如下6方面內(nèi)容:
(1)約定二進(jìn)制代碼的格式,即指令;(2)需要將指令變換為機(jī)器碼,即匯編;(3)為了提高編程方便程度,需要將高層程序語(yǔ)言轉(zhuǎn)換為匯編語(yǔ)言,即編譯;(4)為了提高編程的效率,提供了各種編程環(huán)境,即集成開(kāi)發(fā)環(huán)境(integrateddevelopmentenvironment,IDE);(5)充分復(fù)用高度優(yōu)化的代碼,即應(yīng)用程序庫(kù);(6)為了方便程序調(diào)試,還需要提供各種仿真工具,即仿真器(emulator).
所以,從系統(tǒng)抽象層次來(lái)看,與通用處理器幾乎沒(méi)有區(qū)別.但是不同的DSIC側(cè)重點(diǎn)不同,有些DSIC只提供API(applicationprogramminginterface)方式的調(diào)用,例如早期的GPU,將編譯、匯編等過(guò)程全都凝結(jié)在運(yùn)行時(shí)庫(kù)中,從用戶角度看,調(diào)用過(guò)程與使用OpenCL[9]中的“內(nèi)建核函數(shù)(built-inkernels)”類(lèi)似,與調(diào)用普通的庫(kù)函數(shù)過(guò)程相同;雖弱化的可編程性,但是強(qiáng)化了用戶使用的便利性.但也有些DSIC,如DSP,使用了大量底層編程,雖編程難度高,但方便精確地性能調(diào)優(yōu).
3DSP:靈活的數(shù)據(jù)格式
DSP也許是最早出現(xiàn)的專(zhuān)用集成電路.DSP的使用范圍非常廣,從簡(jiǎn)單的MP3播放器到最新一代的5G通信都有使用場(chǎng)景.常見(jiàn)的DSP大多帶有豐富的外設(shè)接口,例如PCIe、以太網(wǎng)、UART、I2C等,尤其在很多嵌入式設(shè)備中,豐富的外設(shè)接口對(duì)于提高系統(tǒng)的集成度、降低成本和功耗都有很大幫助,所以很多DSP產(chǎn)品也演變成帶有豐富外設(shè)接口的SoC(systemonchip)芯片.
但是DSP最大的特點(diǎn)還是進(jìn)行數(shù)字信號(hào)處理的核.大多數(shù)DSP由于使用場(chǎng)景多為移動(dòng)設(shè)備,或者只是作為CPU系統(tǒng)的數(shù)據(jù)輸入前端,在系統(tǒng)中的地位并不高,通常在功耗、散熱等方面都不可能給予太高容限,所以功耗敏感、計(jì)算位寬對(duì)DSP很重要,定點(diǎn)、浮點(diǎn),半精度、單精度、雙精度,16位、24位、32位、40位等各種數(shù)據(jù)格式規(guī)范“五花八門(mén)”.在尋址上,DSP對(duì)于數(shù)據(jù)對(duì)齊方式也最靈活,設(shè)置了大量專(zhuān)門(mén)的指令對(duì)數(shù)據(jù)進(jìn)行對(duì)齊操作.TI公司是DSP芯片的龍頭,被媒體評(píng)為是半導(dǎo)體行業(yè)利潤(rùn)率最高的公司.2019財(cái)年?duì)I業(yè)總收入144億美金,稅后凈利潤(rùn)高達(dá)50億美金,利潤(rùn)率高達(dá)35%.作為比較,同期Intel收入720億美金,利潤(rùn)率29%;英偉達(dá)總營(yíng)收110億美金,利潤(rùn)率25%.TI公司的DSP主要分為3大系列:
C2000系列,集成了AD轉(zhuǎn)換、Flash存儲(chǔ)等,主要用于控制馬達(dá)、變頻器等工控產(chǎn)品;C5000系列,16位定點(diǎn),主要用于便攜聲音、視頻、機(jī)頂盒等設(shè)備;C6000系列,采用了VLIW(verylonginstructionword)架構(gòu),每秒執(zhí)行指令峰值可達(dá)百億條,主要用于數(shù)字通信、圖像增強(qiáng)、傳輸、加密解密等對(duì)性能要求更高的場(chǎng)景.粗略觀察DSP核其實(shí)與通常的RISC核沒(méi)有太多區(qū)別:都包括了取指令、指令分發(fā)、譯碼、寄存器讀寫(xiě)、Load/Store、計(jì)算執(zhí)行等環(huán)節(jié),但微體系結(jié)構(gòu)有非常顯著的特色.例如,普通采用超長(zhǎng)指令字(VLIW)架構(gòu)、突出的浮點(diǎn)處理能力、指令與數(shù)據(jù)分離等,分析如下.
3.1通過(guò)VLIW架構(gòu)提高性能
在C6000系列的DSP中,采用了超長(zhǎng)指令字(VLIW)技術(shù),性能的提升主要是通過(guò)引入SIMD(singleinstructionmultipledata)來(lái)實(shí)現(xiàn).
從2路16位、4路8位SIMD操作,到8路16位、4路32位向量操作.為了支持較寬的向量化操作,C66x系列DSP設(shè)置了8個(gè)功能單元、兩組寄存器堆文件、兩條獨(dú)立數(shù)據(jù)通路;每組寄存器文件包含32個(gè)32位通用寄存器,而且可以支持8,16,32,40,64位等非常靈活的數(shù)據(jù)位寬打包存儲(chǔ).例如一個(gè)完整32位寄存器連同相鄰寄存器的低8位存儲(chǔ)一個(gè)40位的浮點(diǎn)數(shù),同時(shí)相鄰寄存器的高24位還可以用于存其他的數(shù).乘法器支持128,40,64位數(shù)據(jù).顯然支持那么多“非標(biāo)”的定點(diǎn)和浮點(diǎn)數(shù),如何來(lái)安排寄存器的分配成為一個(gè)很有挑戰(zhàn)的問(wèn)題.
3.2浮點(diǎn)乘性能突出
功能單元的乘法計(jì)算能力極強(qiáng),8個(gè)功能單元的每一個(gè)都能做到單個(gè)周期完成一條指令的執(zhí)行,包括乘法(.M).單精度浮點(diǎn)乘在1個(gè)周期內(nèi)完成,雙精度浮點(diǎn)乘在4個(gè)周期內(nèi)完成,而且可以支持不同精度的浮點(diǎn)數(shù)直接相乘.算術(shù)(.S)、邏輯(.L)指令用來(lái)處理算術(shù)、分支計(jì)算、邏輯運(yùn)算,此外,邏輯指令還可以在兩個(gè)周期內(nèi)完成對(duì)復(fù)數(shù)進(jìn)行90◦,270◦旋轉(zhuǎn)操作,計(jì)算復(fù)數(shù)共軛等操作.作為比較,2006年Sparc-T1處理器的浮點(diǎn)單元(floatingpointunit,FPU)執(zhí)行一個(gè)單精度乘需要7個(gè)時(shí)鐘周期.其實(shí),乘法器的性能對(duì)于浮點(diǎn)性能至關(guān)重要,現(xiàn)在FPGA芯片為了突出計(jì)算性能,甚至把乘法器硬核的數(shù)量作為一個(gè)重要指標(biāo)(FPGA中通常將其稱(chēng)之為DSP核).
3.3指令緩存和程序緩存分離
將指令與數(shù)據(jù)分離也就是著名的“哈佛結(jié)構(gòu)”,一級(jí)程序緩存(L1P)采用直接映射,一級(jí)數(shù)據(jù)緩存(L1D)采用多路組相連.這樣導(dǎo)致了緩存替換策略的不同,L1P采用新緩存行替換同一位置的舊緩存行,采用讀–分配(read-allocate)策略.相較而言,L1D復(fù)雜的多,采用了最近最少使用(leastrecentlyused,LRU)替換策略和回寫(xiě)(writeback)機(jī)制:當(dāng)數(shù)據(jù)被更新時(shí),并不立即更新相應(yīng)的緩存位置和存儲(chǔ)器地址,而只做“dirty”標(biāo)記,只有數(shù)據(jù)被替換出緩存,或者手動(dòng)啟動(dòng)一致性操作指令,或出現(xiàn)長(zhǎng)距離訪問(wèn)(此時(shí)所有高速緩存的局部性都極有可能被破壞),才會(huì)寫(xiě)回到存儲(chǔ)器.
這也說(shuō)明指令的局部性是比數(shù)據(jù)的局部性顯著得多,而且對(duì)于核而言,指令緩存是只讀的,而數(shù)據(jù)緩存可讀可寫(xiě),從這個(gè)意義上看,將二者分開(kāi)也是有好處的.此外,DSP的緩存還支持很多先進(jìn)的管理功能,例如強(qiáng)制凍結(jié)模式(freezemode),可以防止中斷程序破壞已經(jīng)建立在緩存中的數(shù)據(jù)局部性,降低中斷恢復(fù)后“冷啟動(dòng)”性能開(kāi)銷(xiāo).這些操作也全都由程序員來(lái)完成.
3.4硬件指令支持一致性管理
多核并不是CPU的“專(zhuān)利”,C6000系列也提供多核的DSP,由于多核引入會(huì)導(dǎo)致數(shù)據(jù)一致性的問(wèn)題,C66x系列DSP也提供了柵欄指令(MFENCE)來(lái)處理緩存回寫(xiě),強(qiáng)制或阻止一致性操作的執(zhí)行等,方便程序員管理數(shù)據(jù)一致性.
3.5硬件化的帶寬管理防止運(yùn)行阻塞
DSP核中還設(shè)置了硬件化帶寬管理,負(fù)責(zé)管理一級(jí)數(shù)據(jù)緩存(L1D)、一級(jí)程序緩存(L1P)、二級(jí)緩存(L2)、寄存器配置總線等4類(lèi)資源的訪問(wèn)優(yōu)先級(jí).訪問(wèn)發(fā)起方包括DSP、外部DMA(enhanceddirectmemoryaccess,EDMA)、內(nèi)部DMA(internaldirectmemoryaccess,IDMA)、數(shù)據(jù)一致性操作.管理按照每次訪問(wèn)授予優(yōu)先級(jí),而不是按照訪問(wèn)類(lèi)型固定優(yōu)先級(jí),通過(guò)設(shè)置競(jìng)爭(zhēng)強(qiáng)度計(jì)數(shù)器來(lái)反映對(duì)資源的“饑渴”程度,即便是最低優(yōu)先級(jí)的訪問(wèn),隨著等待時(shí)間增加,優(yōu)先級(jí)就會(huì)逐漸升高,當(dāng)達(dá)到最長(zhǎng)等待周期數(shù),就會(huì)強(qiáng)制授予一次訪問(wèn).
而這些都是硬件管理的,程序員只能設(shè)置最長(zhǎng)等待時(shí)間,不能設(shè)置競(jìng)爭(zhēng)計(jì)數(shù)器.這樣的硬件化維護(hù)資源公平性的設(shè)置在CPU中并不常見(jiàn).由以上分析可以看出,DSP作為一類(lèi)典型的專(zhuān)用處理器,其結(jié)構(gòu)與數(shù)字信號(hào)處理需要豐富的IO接口便于集成,強(qiáng)大的浮點(diǎn)處理能力支持高帶寬的信號(hào)處理,還提供了豐富的底層數(shù)據(jù)通路的控制手段方便專(zhuān)業(yè)用戶的性能調(diào)優(yōu).
4GPU:數(shù)據(jù)并行的典型代表
GPU是專(zhuān)為圖形(graphic)處理設(shè)計(jì)的專(zhuān)用處理器.隨著多媒體可視化需求的爆發(fā),傳統(tǒng)的CPU是無(wú)法應(yīng)對(duì)每秒動(dòng)輒數(shù)百兆的視頻渲染等任務(wù).高清圖像、視頻數(shù)據(jù)天然具備數(shù)據(jù)并行的特征,可以通過(guò)高度的并行性來(lái)同時(shí)計(jì)算像素塊中所有像素的色度、亮度等數(shù)據(jù).之所以經(jīng)典,是因?yàn)閺倪@一代架構(gòu)開(kāi)始,GPU開(kāi)始朝著通用GPU(即GPGPU)發(fā)展,為后續(xù)GPU在深度學(xué)習(xí)領(lǐng)域的廣泛應(yīng)用奠定了基礎(chǔ).
4.1采用了單指令多線程(SIMT)的結(jié)構(gòu)
單指令多線程(singleinstructionmultiplethread,SIMT)是英偉達(dá)針對(duì)其GPGPU提出來(lái)的一種處理器執(zhí)行模型,與傳統(tǒng)的單指令多數(shù)據(jù)(SIMD)略有差別.SIMT具備了動(dòng)態(tài)調(diào)度機(jī)制,每個(gè)線程(thread)都可以獨(dú)立處理分支,而SIMD更像VLIW,需要軟件來(lái)管理批量取數(shù)(batchload)和分支.其實(shí)這點(diǎn)靈活性給GPU的優(yōu)化帶來(lái)了很多麻煩,之所以要使每個(gè)線程都可以獨(dú)立分支,本質(zhì)是為了更好地服務(wù)于通用GPU(即GPGPU).因?yàn)樵趫D像處理之外的計(jì)算負(fù)載很少能找到能同時(shí)成千上萬(wàn)個(gè)同構(gòu)的線程,否者直接采用SIMD就滿足要求了.
但是為了控制管理這些線程的復(fù)雜度,GPU將這些線程組織成群(在英偉達(dá)公司的GPU技術(shù)里稱(chēng)之為Warp,在AMD公司的GPU體系中稱(chēng)之為Wavefront,若無(wú)特殊說(shuō)明,后文均以Warp為例),調(diào)度是以Warp為單位,這就意味著同一個(gè)Warp中的線程必須以分支范圍為界,所有分支必須在同步前匯合(converge),這就很容易導(dǎo)致其他線程等待而不能充分利用GPU的運(yùn)算資源.這在運(yùn)行控制密集型負(fù)載時(shí)負(fù)面影響尤為突出.為了降低由于同一Warp內(nèi)某些線程分叉(diverge)帶來(lái)的同步開(kāi)銷(xiāo),在Tesla架構(gòu)下,每個(gè)Warp的大小被限制在32線程,只有上代產(chǎn)品的一半.
4.2GPU對(duì)于AI的支持
由AI以及渲染需求帶來(lái)的GPU架構(gòu)變化,以NVIDIAAmpere架構(gòu)和AMDRDNA/CDNA為例.首先,支持多精度/混合精度訓(xùn)練.大多數(shù)深度學(xué)習(xí)模型使用32位單精度浮點(diǎn)數(shù)(FP32)進(jìn)行訓(xùn)練,而混合精度訓(xùn)練的方法則通過(guò)如16位浮點(diǎn)數(shù)(FP16)進(jìn)行深度學(xué)習(xí)模型訓(xùn)練,從而減少了訓(xùn)練深度學(xué)習(xí)模型所需的內(nèi)存.同時(shí)由于FP16運(yùn)算比FP32運(yùn)算更快,進(jìn)一步提高了硬件效率.AMD設(shè)計(jì)“matrixfusedmultiply-add”指令集進(jìn)行混合精度計(jì)算,支持8位整型(INT8)、16位半精度浮點(diǎn)FP(FP16)、16位“brain”FP(BF16)和32位單精度浮點(diǎn)(FP32).NVIDIAAmpere架構(gòu)進(jìn)一步提升了FP32的計(jì)算速度,GeForceRTX3090實(shí)現(xiàn)35TFLOPS(采用FP32),是其上一代Turing的兩倍.其次,引入新的計(jì)算資源.NVIDIAAmpere架構(gòu)包括:
可編程的shadingcores(由NVIDIACUDAcore組成),新一代raytracingcore(RTcore)用于加速光線追蹤時(shí)的boundingvolumehierarchy(BVH)遍歷,以及場(chǎng)景劃分.其中tensorcores用于提升神經(jīng)網(wǎng)絡(luò)的計(jì)算和推理性能.AMD的RDNA架構(gòu)最主要的核心改動(dòng)就是將原先的矢量集架構(gòu)改成了標(biāo)量集架構(gòu).之前AMD的Wavefront是64個(gè)線程,這一代的架構(gòu)改成了32個(gè)線程.這一點(diǎn)與Tesla架構(gòu)采用32線程的Warp設(shè)置是一致的.采用32個(gè)線程的配置的優(yōu)點(diǎn)是可以減少Warp內(nèi)分支的性能開(kāi)銷(xiāo),單個(gè)Warp也只需要更少的寄存器,同等的硬件資源可以支持更多的Warp(wavefront),從而有效地提高吞吐量和隱藏延遲.
4.3現(xiàn)場(chǎng)調(diào)度做到
“零開(kāi)銷(xiāo)(zero-overhead)”傳統(tǒng)意義上線程的調(diào)度涉及保護(hù)現(xiàn)場(chǎng)、上下文切換、指令重新載入等環(huán)節(jié),通常來(lái)看線程的調(diào)度會(huì)破壞緩存內(nèi)數(shù)據(jù)的局部性,導(dǎo)致緩存缺失率的上升,而且現(xiàn)場(chǎng)狀態(tài)保存等也需要消耗時(shí)間,所以理論上看是不可能零開(kāi)銷(xiāo)的.但是GPU中線程由于量級(jí)很輕,同一個(gè)Warp內(nèi)的線程調(diào)度并不需要換入、換出現(xiàn)場(chǎng)的狀態(tài)(主要是寄存器內(nèi)容),所以可以做到近似零開(kāi)銷(xiāo).在Tesla架構(gòu)下,Warp是調(diào)度的最小單位,指令的調(diào)度也就是Warp的調(diào)度,在Warp間調(diào)度開(kāi)銷(xiāo)也很低.
每個(gè)Warp由32個(gè)執(zhí)行同一指令的線程組成,每一個(gè)線程(thread)都有自己的寄存器狀態(tài),獨(dú)立判斷分支的狀態(tài)執(zhí)行,由于分支決策依賴于數(shù)據(jù),所以同一個(gè)Warp中的不同的線程可能會(huì)“分道揚(yáng)鑣”(diverge),同一個(gè)Warp中的線程通過(guò)Barrier來(lái)同步,只需要執(zhí)行一條流式多處理器(streamingmultiprocessor)指令.每一條線程從創(chuàng)建、調(diào)度、同步的效率都很高.具體的調(diào)度機(jī)制采用記分板機(jī)制來(lái)實(shí)現(xiàn),調(diào)度的優(yōu)先級(jí)涉及到Warp類(lèi)型、指令類(lèi)型和公平性,由于涉及到技術(shù)機(jī)密,Nvidia公司沒(méi)有公開(kāi)更細(xì)節(jié)的內(nèi)容.類(lèi)似的降低指令調(diào)度開(kāi)銷(xiāo)的技術(shù)在網(wǎng)絡(luò)處理器(NPU)里也常見(jiàn)到.調(diào)度做到“零開(kāi)銷(xiāo)”對(duì)于優(yōu)化公平性很有幫助,不會(huì)因?yàn)橛?jì)算資源輪詢共享而犧牲性能.
4.4引入特殊超越函數(shù)處理單元
GPU中的特殊功能單元(special-functionunit,SFU)用于計(jì)算超越函數(shù),例如倒數(shù)、平方根、冪函數(shù)、對(duì)數(shù)、三角函數(shù)等.基本方法是采用查表結(jié)合二次插值的方法來(lái)計(jì)算,做到了性能、誤差和面積的平衡.性能上做到了每周期出一個(gè)結(jié)果,誤差上界可控,面積遠(yuǎn)小于單純的查表方案.GPU中的SFU和現(xiàn)在流行的神經(jīng)網(wǎng)絡(luò)處理器里用到的“Sigmoid”函數(shù)有類(lèi)似的地方,SFU中的計(jì)算方法用來(lái)處理Sigmoid計(jì)算是足夠用的.此外,之所以現(xiàn)在GPU被廣泛應(yīng)用于神經(jīng)網(wǎng)絡(luò)計(jì)算并不單純因?yàn)樾阅芨?而是GPU中的流式處理器(streamingmultiprocessor)的結(jié)構(gòu)與神經(jīng)網(wǎng)絡(luò)的矩陣–向量–Sigmoid的操作比較匹配.
5AI加速器:大規(guī)模張量處理
隨著深度學(xué)習(xí)算法效果在圖像處理中取得突破,深度學(xué)習(xí)在越來(lái)越多的應(yīng)用領(lǐng)域被應(yīng)用.在過(guò)去5年中,用于處理深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)處理器(AI芯片)快速發(fā)展,其中比較成功的案例包括寒武紀(jì)的DianNao系列深度學(xué)習(xí)處理器[5]、Google的張量處理器TPU[6] 等.AI加速器大多針對(duì)機(jī)器學(xué)習(xí)中張量運(yùn)算展開(kāi)加速,多基于SIMD方式實(shí)現(xiàn),單條指令通常可以完成一個(gè)矩陣的乘法運(yùn)算,因此也稱(chēng)為張量處理器.除了張量處理之外,還會(huì)伴有一些激活函數(shù)處理等非線性操作,運(yùn)算量相對(duì)較小,實(shí)現(xiàn)起來(lái)也相對(duì)簡(jiǎn)單.此類(lèi)加速器重在張量處理,控制相對(duì)簡(jiǎn)單,通常不會(huì)集成通用處理核.
6NPU:為網(wǎng)絡(luò)數(shù)據(jù)包處理而生
計(jì)算機(jī)網(wǎng)絡(luò)是計(jì)算機(jī)系統(tǒng)發(fā)展過(guò)程中的一個(gè)偉大發(fā)明,網(wǎng)絡(luò)是大規(guī)模并行計(jì)算、分布式計(jì)算的必要條件.IBM于1974年發(fā)布SNA(systemnetworkarchitecture)系列網(wǎng)絡(luò)協(xié)議,主要解決IBM的大型機(jī)與外圍節(jié)點(diǎn)的通信問(wèn)題.這些節(jié)點(diǎn)并不是完整的計(jì)算機(jī),而是像用于ASCII圖像顯示終端的IBM-3174控制器、打印機(jī)等設(shè)備.1974年之前程序還寫(xiě)在紙帶上,主要處理模式還是批處理;SNA引入以后,開(kāi)啟了事務(wù)處理的先河,把網(wǎng)絡(luò)通信中容錯(cuò)任務(wù)交給了網(wǎng)絡(luò)協(xié)議來(lái)處理,并且基于SNA后來(lái)發(fā)展出了應(yīng)用程序接口(API)等概念.
隨著后續(xù)幾年越來(lái)越多的設(shè)備開(kāi)始采用網(wǎng)絡(luò)來(lái)連接,不同廠商提供了不同的網(wǎng)絡(luò),為了解決不同網(wǎng)絡(luò)間的互連互通(internetworkcommunication),美國(guó)標(biāo)準(zhǔn)化組織于1981年提出了經(jīng)典了開(kāi)放系統(tǒng)互連(opensystemsinterconnection,OSI)7層模型[13],這個(gè)參考模型一直沿用至今,仍未過(guò)時(shí).網(wǎng)絡(luò)處理器的出現(xiàn)是網(wǎng)絡(luò)技術(shù)發(fā)展的必然.隨著OSI模型的普及和廣泛接受,在2000年前后,NPU還是學(xué)術(shù)界研究的熱點(diǎn)領(lǐng)域.
第1顆網(wǎng)絡(luò)處理器于1999年問(wèn)世,隨后得到了許多半導(dǎo)體公司、網(wǎng)絡(luò)設(shè)備廠商的關(guān)注,據(jù)不完全統(tǒng)計(jì),前后有30余家廠商完成了500余款NPU的設(shè)計(jì),和現(xiàn)在的各種“XPU”的多樣性相比有過(guò)之而無(wú)不及.IBM、因特爾、思科、EZChip(于2015年被Mellanox收購(gòu))都推出了相應(yīng)的系列產(chǎn)品,典型如Intel的IXP系列和Mellanox的NP系列網(wǎng)絡(luò)處理器.各家NPU產(chǎn)品雖然各有差異,覆蓋不同的協(xié)議層次,面向不同的協(xié)議內(nèi)容,但是它們的結(jié)構(gòu)模塊具有相似性,例如都包含的模塊包括通用處理器核、隊(duì)列管理單元、路由管理、緩存管理、IO接口管理等.值得一提的是,最近興起的DPU架構(gòu),有很多特征借鑒了NPU技術(shù),特別是在對(duì)路由、交換、數(shù)據(jù)包處理的高效支持上,相關(guān)討論將作為未來(lái)工作開(kāi)展.
6.1控制平面與數(shù)據(jù)平面相分離
網(wǎng)絡(luò)處理器的功能可以從控制平面和數(shù)據(jù)平面來(lái)區(qū)分.判斷一個(gè)任務(wù)屬于控制平面還是數(shù)據(jù)平面的一個(gè)簡(jiǎn)單的方法就是看數(shù)據(jù)包的路徑:如果一個(gè)數(shù)據(jù)包需要穿過(guò)處理器,就屬于數(shù)據(jù)平面,如果是由處理器發(fā)起,或者終結(jié)在某個(gè)處理器,就屬于控制平面.其中數(shù)據(jù)平面的計(jì)算主要由專(zhuān)用計(jì)算引擎完成,而控制平面的計(jì)算主要由通用處理器核完成.不同于GPU,浮點(diǎn)處理性能不是網(wǎng)絡(luò)處理器的重點(diǎn),可以靈活支持OSI7層協(xié)議中不同層次的各種網(wǎng)絡(luò)協(xié)議的高效卸載才是網(wǎng)絡(luò)處理器比拼的焦點(diǎn).
NP-5的上一代NP-4是業(yè)界首個(gè)100Gbps電信級(jí)以太網(wǎng)網(wǎng)絡(luò)處理器,到了NP-5已經(jīng)把標(biāo)稱(chēng)性能提高到了240Gbps的高度.任務(wù)優(yōu)化處理器(taskoptimizedprocessor,TOP)是NP系列專(zhuān)用處理器的核心,是以流水線方式排列的超標(biāo)量處理器.NP-1聲稱(chēng)專(zhuān)為處理第2∼7層數(shù)據(jù)包而設(shè)計(jì)處理速度為10Gbps.有一個(gè)單獨(dú)用于控制處理器來(lái)處理控制平面操作的接口.EZchip采用微碼編程,具有用于NP-1的軟件開(kāi)發(fā)環(huán)境,包括匯編器、調(diào)試器和仿真器,此外還提供常用的交換、路由、分片、組包、組播、QoS等應(yīng)用程序庫(kù).
7關(guān)于專(zhuān)用處理器的幾點(diǎn)思考
對(duì)前述的DSP,GPU,AI芯片和NPU從架構(gòu)特征、編程特點(diǎn)和性能刻畫(huà)3個(gè)維度進(jìn)行了比較,概述了這4類(lèi)專(zhuān)用處理器的主要區(qū)別.分析可以看出,專(zhuān)用處理器的設(shè)計(jì)相比于通用CPU而言,側(cè)重點(diǎn)非常不同.比如,不太強(qiáng)調(diào)指令集,也沒(méi)過(guò)多的突出應(yīng)用生態(tài),但是非常注重極致的性能優(yōu)化,注重與具體計(jì)算模式的匹配.以下是筆者關(guān)于專(zhuān)用處理器的本質(zhì)特征的幾點(diǎn)思考,拋磚引玉.
7.1專(zhuān)用處理器的指令集架構(gòu)沒(méi)有最好的,只有最合適的指令級(jí)體系結(jié)構(gòu)(instructionsetarchitecture,ISA)特征,通常分為CISC,RISC,VLIW三個(gè)大類(lèi),前兩類(lèi)大家都比較熟悉,在此略過(guò).VLIW一直未在通用市場(chǎng)上取得成功,在20世紀(jì)80年代,最有名的一家希望在通用市場(chǎng)推廣VLIW的公司應(yīng)該是Multiflow,由耶魯大學(xué)(YaleUniversity)的計(jì)算機(jī)科學(xué)家JoshFisher創(chuàng)立于1984年,他們?cè)赩LIW的編譯優(yōu)化方面做了很多研究,這家公司只生存了6年,總共只賣(mài)了一百多臺(tái)VLIW機(jī)器,隨后Fisher教授加入了惠普(Hewlett-Packard)公司.
雖然公司沒(méi)有成功,但對(duì)VLIW的貢獻(xiàn)為其贏得了計(jì)算機(jī)體系結(jié)構(gòu)領(lǐng)域最高獎(jiǎng)Eckert-MauchlyAward.20世紀(jì)90年代正值摩爾定律飛速發(fā)展的時(shí)代,Multiflow研發(fā)的VLIW處理器的性能一直跟不上RISC和CISC的微處理器,最后被淘汰出局.即便是Intel和惠普提出安騰(Itanium)架構(gòu),即IA-64系列,又發(fā)起了VLIW的嘗試.
第1顆IA-64架構(gòu)的處理器發(fā)布于1999年,雖然與X86師出同門(mén),但仍未動(dòng)搖到RISC的ARM和CISC的X86的市場(chǎng)地位,2017年安騰徹底退出歷史舞臺(tái).VLIW處理器優(yōu)勢(shì)使得控制結(jié)構(gòu)大幅消減,提升了單位面積的有效計(jì)算的密度,功耗效率也得到了提升,但與CISC和RISC相比最大的差異是編譯依賴.VLIW的性能對(duì)編譯優(yōu)化極其敏感,將開(kāi)發(fā)指令集并行(instructionlevelparallelism,ILP)的責(zé)任交由編譯器來(lái)完成,不僅導(dǎo)致編譯器的復(fù)雜度大大提高,而且還帶來(lái)了一系列兼容性的問(wèn)題:VLIW的代碼都有很強(qiáng)的機(jī)器依賴(machinedependence),更新代際的機(jī)器執(zhí)行之前的代碼并不會(huì)獲得性能的明顯提升.
此外,理論性能與實(shí)際性能的落差過(guò)大始終是VLIW繞不過(guò)去的坎,這也許是VLIW未獲得廣泛市場(chǎng)認(rèn)可的重要原因.然而,如果把VLIW的目標(biāo)范圍縮小到僅僅是數(shù)字信號(hào)處理的范疇,對(duì)編譯優(yōu)化的要求也會(huì)隨之降低,這就有可能在一個(gè)可接受的編譯優(yōu)化復(fù)雜度下,比較充分地利用VLIW架構(gòu)的計(jì)算資源.TI的C6000系列DSP已經(jīng)用事實(shí)證明了這一技術(shù)路線的可行性.所以,脫離了實(shí)際的應(yīng)用范疇談體系結(jié)構(gòu)的優(yōu)劣都很容易“刻舟求劍”.VLIW沒(méi)有成功代替X86,并不能說(shuō)明VLIW就是失敗的;X86服務(wù)器出貨量占到了所有通用服務(wù)器出貨量的90%以上,也不能證偽其他技術(shù)存在的合理性.
8討論:構(gòu)建專(zhuān)用處理器系統(tǒng)結(jié)構(gòu)的幾個(gè)關(guān)鍵點(diǎn)
專(zhuān)用處理器與通用處理器是處理器發(fā)展的兩個(gè)互補(bǔ)的方向,雖然單獨(dú)一類(lèi)專(zhuān)用處理器的市場(chǎng)要遠(yuǎn)小于通用處理器,但是多類(lèi)專(zhuān)用處理器的市場(chǎng)總和將遠(yuǎn)遠(yuǎn)大于通用處理器的市場(chǎng).而且,專(zhuān)用處理器的發(fā)展將會(huì)在很多增量的應(yīng)用市場(chǎng)中占有絕對(duì)的性能優(yōu)勢(shì),且受到通用計(jì)算的生態(tài)限制更少,有利于專(zhuān)用架構(gòu)逐步擴(kuò)展去覆蓋更長(zhǎng)尾端的應(yīng)用.在過(guò)去處理器芯片發(fā)展的60年里,前50年都是通用處理器的發(fā)展以絕對(duì)優(yōu)勢(shì)占據(jù)了處理器芯片的市場(chǎng)份額,相信在接下來(lái)的30年,隨著數(shù)據(jù)的爆發(fā)和“端、邊、云一體”這種計(jì)算范式的繼續(xù)滲透,將形成通用處理器與專(zhuān)用處理器并行的新局面,在2020年7月的CommunicationsoftheACM中,有一篇文章提出了一個(gè)新概念:“ASICclouds”,全文標(biāo)題是“ASICclouds:specializingthedatacenterforplanet-scaleapplications”[8],這里的“ASIC”就是各種專(zhuān)用處理器的呈現(xiàn)形式,我們相信專(zhuān)用處理器將迎來(lái)空前的增長(zhǎng)機(jī)遇.
9結(jié)論
采用專(zhuān)用處理器芯片是計(jì)算系統(tǒng)提升算力、提高效率的有效手段,業(yè)界對(duì)于“XPU”概念的廣泛關(guān)注反映了人們對(duì)新型計(jì)算芯片期望.本文以經(jīng)典的數(shù)字信號(hào)處理器DSP、圖形處理器GPU、AI芯片、網(wǎng)絡(luò)處理器(NPU)作為案例,以這4類(lèi)專(zhuān)用處理器的結(jié)構(gòu)特征為分析重點(diǎn),總結(jié)得出DSP最重要的結(jié)構(gòu)特征是支持靈活的數(shù)據(jù)格式,能效比優(yōu)化極致;GPU是充分利用數(shù)據(jù)并行的典型,并且正在朝著通用化的方向發(fā)展;AI芯片圍繞大規(guī)模張量處理,支持可變精度來(lái)優(yōu)化性能;NPU聚焦網(wǎng)絡(luò)數(shù)據(jù)包處理,構(gòu)造高通量的流水線.
筆者發(fā)現(xiàn)一些在通用CPU中沒(méi)有得到成功發(fā)展的技術(shù),如VLIW,在專(zhuān)用處理器中發(fā)揮了重要作用;而通用處理器體系下最重要維度,如指令系統(tǒng),在專(zhuān)用處理器中反而被弱化了.這些差異進(jìn)一步引發(fā)了筆者從經(jīng)典體系結(jié)構(gòu)的角度對(duì)專(zhuān)用處理器的幾點(diǎn)思考.最后,本文討論構(gòu)建專(zhuān)用處理器系統(tǒng)結(jié)構(gòu)的4個(gè)關(guān)鍵點(diǎn):即針對(duì)數(shù)據(jù)平面的架構(gòu),融合新存儲(chǔ)、傳輸、封裝等新技術(shù),面向領(lǐng)域?qū)S谜Z(yǔ)言和充分利用好“專(zhuān)用”這個(gè)特征來(lái)簡(jiǎn)化系統(tǒng)設(shè)計(jì).
參考文獻(xiàn)
1HennessyJL,PattersonDA.Anewgoldenageforcomputerarchitecture.CommunACM,2019,62:48–60
2WalravensC,DehaeneW.Low-powerdigitalsignalprocessorarchitectureforwirelesssensornodes.IEEETransVLSISyst,2014,22:313–321
3GeorgeL,BlumeM.TamingtheIXPnetworkprocessor.SIGPLANNot,2003,38:26–37
4LindholmE,NickollsJ,ObermanS,etal.NVIDIATesla:aunifiedgraphicsandcomputingarchitecture.IEEEMicro,2008,28:39–55
5ChenTS,DuZD,SunNH,etal.DianNao:asmall-footprinthigh-throughputacceleratorforubiquitousmachinelearning.SIGARCHComputArchitNews,2014,42:269–284
6JouppiNP,YoungC,PatilN,etal.In-datacenterperformanceanalysisofatensorprocessingunit.In:Proceedingsofthe44thAnnualInternationalSymposiumonComputerArchitecture(ISCA),2017
7YanGH,LuWY,LiXW,etal.DPU:data-centricdomain-specificprocessor.CommunCCF,2021,17:51–56[鄢貴海,盧文巖,李曉維,等.DPU:以數(shù)據(jù)為中心的專(zhuān)用處理器.中國(guó)計(jì)算機(jī)學(xué)會(huì)通訊,2021,17:51–56]
8TaylorMB,VegaL,KhazraeeM,etal.ASICclouds:specializingthedatacenterforplanet-scaleapplications.CommunACM,2020,63:103–109
9StoneJE,GoharaD,ShiG.OpenCL:aparallelprogrammingstandardforheterogeneouscomputingsystems.ComputSciEng,2010,12:66–73
作者:鄢貴海*,盧文巖,李曉維,孫凝暉