陳正博,吳鐵彬,鄭 方,丁亞軍
(江南計(jì)算技術(shù)研究所,江蘇 無(wú)錫 214000)
隨著人工智能應(yīng)用需求的快速增長(zhǎng),面向人工智能推理和訓(xùn)練的加速芯片已成為該領(lǐng)域重要的發(fā)展方向,許多國(guó)內(nèi)外知名的大公司都大力投入相關(guān)研發(fā)。谷歌TPU、NVIDIA Tesla V100、寒武紀(jì)DianNao等是具有代表性的人工智能加速芯片。谷歌公司的TPU[1]以脈動(dòng)陣列為基礎(chǔ),支持半精度和8位整數(shù)的推理應(yīng)用;寒武紀(jì)公司的DianNao系列[2-5]芯片將神經(jīng)網(wǎng)絡(luò)各層分解成神經(jīng)功能單元(NFU),支持半精度的推理應(yīng)用;英偉達(dá)公司于2017年推出了Tesla V100[6]芯片,引入了張量計(jì)算單元(tensor core),支持雙、單、半精度以及混合精度的訓(xùn)練和推理應(yīng)用。
浮點(diǎn)乘加部件能力是衡量人工智能芯片性能的主要指標(biāo)。以NVIDIA Tesla V100為例,該芯片可達(dá)到7.5 TFLOPS的雙精度計(jì)算性能、15 TFLOPS的單精度計(jì)算性能和125 TFLOPS的張量計(jì)算性能。Tesla V100中包含2 560個(gè)FP64的計(jì)算單元和5 120個(gè)FP32的計(jì)算單元,同時(shí)引入了640個(gè)張量核心。作為人工智能卷積運(yùn)算的基本單元,張量計(jì)算單元的運(yùn)算方式如圖1所示。
圖1 Tensor Core基本運(yùn)算方式
矩陣運(yùn)算中,A和B都是半精度浮點(diǎn)數(shù)(FP16)組成的矩陣,C和D同為半精度浮點(diǎn)數(shù)(FP16)或單精度浮點(diǎn)數(shù)(FP32)組成的矩陣。當(dāng)C和D矩陣同為半精度浮點(diǎn)數(shù)時(shí),張量計(jì)算單元進(jìn)行半精度的浮點(diǎn)乘加運(yùn)算;當(dāng)C和D矩陣同為單精度浮點(diǎn)數(shù)時(shí),張量計(jì)算單元進(jìn)行半精度乘半精度加單精度的單半混合精度浮點(diǎn)乘加運(yùn)算。
考慮到人工智能領(lǐng)域?qū)τ诟鱾€(gè)精度的浮點(diǎn)運(yùn)算和整數(shù)運(yùn)算都存在需求,研究人員開(kāi)始進(jìn)行混合浮點(diǎn)乘加器的相關(guān)研究。NVIDIA公司[7]提出了單精度和半精度混合的浮點(diǎn)融合乘加部件。該部件采用雙模式實(shí)現(xiàn)不同功能,通過(guò)硬件復(fù)用技術(shù),支持單精度浮點(diǎn)乘加、半精度浮點(diǎn)乘加和半精度浮點(diǎn)乘法后加法的運(yùn)算模式。
為滿足人工智能領(lǐng)域的不同應(yīng)用場(chǎng)景,人工智能芯片需要集成多種不同精度的運(yùn)算部件。但目前的人工智能芯片都采用多種獨(dú)立運(yùn)算部件集成的技術(shù)路線,這些獨(dú)立的運(yùn)算部件帶來(lái)了較大的芯片面積和功耗開(kāi)銷。文中采用跨精度復(fù)用的思想,探索通過(guò)復(fù)用技術(shù)進(jìn)行多種精度混合的浮點(diǎn)乘加部件實(shí)現(xiàn)的技術(shù)可行性。該研究成果對(duì)國(guó)產(chǎn)人工智能芯片研發(fā)具有重要借鑒意義。
文中設(shè)計(jì)并實(shí)現(xiàn)的面向人工智能的浮點(diǎn)乘加器,支持IEEE-754[8]標(biāo)準(zhǔn)的單精度、并行2個(gè)半精度、半精度乘半精度加單精度(單半混合精度)的浮點(diǎn)乘加操作,也支持32位、并行2個(gè)16位/8位的整數(shù)乘法操作。提出了乘法器復(fù)用、移位器復(fù)用和前導(dǎo)零預(yù)測(cè)復(fù)用等一系列關(guān)鍵技術(shù),使用復(fù)用關(guān)鍵技術(shù)設(shè)計(jì)和實(shí)現(xiàn)該浮點(diǎn)乘加器,研究浮點(diǎn)乘加器中各模塊的詳細(xì)設(shè)計(jì)方法。在完成代碼設(shè)計(jì)后,對(duì)其進(jìn)行功能點(diǎn)和隨機(jī)數(shù)測(cè)試,驗(yàn)證浮點(diǎn)乘加器的正確性,同時(shí)使用DC工具進(jìn)行物理綜合,結(jié)果顯示綜合運(yùn)行頻率可達(dá)2 GHz。
文中設(shè)計(jì)的面向AI的浮點(diǎn)乘加器以經(jīng)典的浮點(diǎn)融合乘加結(jié)構(gòu)[9]為基礎(chǔ),采用6級(jí)全流水結(jié)構(gòu)實(shí)現(xiàn),總體實(shí)現(xiàn)結(jié)構(gòu)如圖2所示。浮點(diǎn)乘加器的輸入數(shù)據(jù)為32位數(shù)據(jù)A/B/C和控制信號(hào),在第6級(jí)站臺(tái)輸出的數(shù)據(jù)包括32位浮點(diǎn)乘加結(jié)果、浮點(diǎn)異常信號(hào)、32位整數(shù)乘法結(jié)果和乘法溢出信號(hào)。該浮點(diǎn)乘加器支持單精度、單半混合精度和并行2個(gè)半精度的浮點(diǎn)乘加操作,也支持32位、并行2個(gè)16位/8位的整數(shù)乘法操作。
文中設(shè)計(jì)的面向AI的浮點(diǎn)乘加器包括數(shù)據(jù)預(yù)處理、指數(shù)差值、對(duì)階移位、乘法器、合并、前導(dǎo)零預(yù)測(cè)、規(guī)格化移位、指數(shù)調(diào)整、舍入等模塊。圖2中涂黑的乘法器、移位器、合并、前導(dǎo)零預(yù)測(cè)模塊使用復(fù)用技術(shù)實(shí)現(xiàn),既解決了跨精度復(fù)用功能,又可以優(yōu)化整體實(shí)現(xiàn)的面積和功耗等指標(biāo)。各模塊的功能、跨精度復(fù)用技術(shù)和詳細(xì)設(shè)計(jì)方法將在第2節(jié)詳細(xì)介紹。
在設(shè)計(jì)的各模塊實(shí)現(xiàn)后,首先進(jìn)行功能點(diǎn)和隨機(jī)數(shù)等正確性測(cè)試,然后對(duì)該設(shè)計(jì)進(jìn)行物理綜合,根據(jù)結(jié)果手動(dòng)調(diào)節(jié)流水線的劃分,使得各級(jí)站臺(tái)之間的時(shí)延基本一致,最終的流水線站臺(tái)劃分合理后,再對(duì)比單精度和半精度浮點(diǎn)乘加部件比較性能。
本節(jié)將介紹各模塊的功能、邏輯結(jié)構(gòu)和詳細(xì)設(shè)計(jì)方法。該設(shè)計(jì)中乘法器、移位器、合并與前導(dǎo)零預(yù)測(cè)等依據(jù)跨精度復(fù)用思想,使用復(fù)用技術(shù)實(shí)現(xiàn)。
數(shù)據(jù)預(yù)處理是對(duì)輸入數(shù)據(jù)和控制信號(hào)提前進(jìn)行處理,判斷計(jì)算方式和數(shù)據(jù)是否符合規(guī)范。數(shù)據(jù)預(yù)處理模塊的功能分別有指數(shù)尾數(shù)拆分、輸入數(shù)據(jù)例外異常檢測(cè)兩部分。在數(shù)據(jù)進(jìn)入到數(shù)據(jù)預(yù)處理模塊時(shí),根據(jù)控制信號(hào)和部件需要完成的功能,遵守一定的規(guī)則,如表1所示。
表1 數(shù)據(jù)輸入規(guī)則
圖2 面向AI的浮點(diǎn)乘加器總體結(jié)構(gòu)
輸入數(shù)據(jù)滿足規(guī)則后,還需要對(duì)輸入異常和例外進(jìn)行檢測(cè),異常情況直接旁路處理,以減少后續(xù)計(jì)算復(fù)雜度。例外和異常結(jié)果主要由非數(shù)和無(wú)窮數(shù)產(chǎn)生,除此以外,非規(guī)格化數(shù)在實(shí)際運(yùn)算過(guò)程中會(huì)作為0處理。浮點(diǎn)乘加操作的異常產(chǎn)生條件和處理結(jié)果如表2所示。
表2 浮點(diǎn)乘加操作異常條件與結(jié)果
指數(shù)差值模塊是根據(jù)輸入數(shù)據(jù)A、B和C的指數(shù)值,計(jì)算對(duì)階移位量和初始結(jié)果的階碼。由于不同精度數(shù)據(jù)的指數(shù)值不同,尾數(shù)長(zhǎng)度也不同,所以分別計(jì)算各個(gè)精度的對(duì)階移位量和初始結(jié)果階碼。在此分別介紹單精度、半精度和單半混合精度的浮點(diǎn)乘加操作中指數(shù)差值模塊的計(jì)算方法。
各種的精度浮點(diǎn)乘加操作,階差的表達(dá)式均為:d=Ce-Ae-Be+bias。
在得到指數(shù)域差值d后,可以分別計(jì)算對(duì)階移位量和指數(shù)階碼。單精度浮點(diǎn)乘加操作的尾數(shù)對(duì)階移位示意如圖3所示,其中數(shù)據(jù)位0后表示補(bǔ)0,數(shù)據(jù)位0前表示尾數(shù)在小數(shù)點(diǎn)前的部分,小數(shù)點(diǎn)前表示尾數(shù)在小數(shù)點(diǎn)后的部分,可知對(duì)階移位量應(yīng)為ASC=27-d,結(jié)果階碼的初值也應(yīng)根據(jù)階差大小決定。若d>27,此時(shí)ASC為負(fù)數(shù),對(duì)階移位量為0,取加數(shù)階碼的大小作為乘加結(jié)果基礎(chǔ)解碼;若1 圖3 單精度浮點(diǎn)乘加尾數(shù)對(duì)階移位示意 文中設(shè)計(jì)的浮點(diǎn)乘加器分別支持單精度、半精度和單半混合精度的浮點(diǎn)乘加運(yùn)算,而不同精度的浮點(diǎn)乘加運(yùn)算中的對(duì)階移位量和乘加結(jié)果階碼的計(jì)算方式也不相同,需要分別進(jìn)行分析。單精度、半精度和單半混合精度的浮點(diǎn)乘加運(yùn)算的ASC、對(duì)階移位量和乘加結(jié)果階碼計(jì)算方式如表3所示。 表3 對(duì)階移位量和結(jié)果階碼的計(jì)算方式 在該設(shè)計(jì)中,移位器包括對(duì)階移位器和規(guī)格化移位器兩種。對(duì)階移位器的功能是進(jìn)行尾數(shù)C和乘法結(jié)果的對(duì)階,規(guī)格化移位器的功能是進(jìn)行中間尾數(shù)結(jié)果與規(guī)格化數(shù)的對(duì)階。雖然各模塊的功能不同,但移位器的跨精度復(fù)用思想一致。 移位器跨精度復(fù)用設(shè)計(jì)方法介紹如下:以對(duì)階移位為例,單精度浮點(diǎn)乘加需求76位移位器,半精度浮點(diǎn)乘加需求37位移位器,混合精度浮點(diǎn)乘加需求50位移位器,考慮到該設(shè)計(jì)支持一個(gè)單精度乘加、并行兩個(gè)半精度乘加、一個(gè)混合精度乘加的操作,使用一個(gè)37位和一個(gè)76位的桶形移位器[10]可滿足需求,在移位器前后分別加上移位位數(shù)選擇器和結(jié)果選擇器,完成對(duì)階移位器模塊的復(fù)用設(shè)計(jì)。 以規(guī)格化移位為例,單精度浮點(diǎn)乘加需求52位移位器,半精度浮點(diǎn)乘加需求26位移位器,混合精度浮點(diǎn)乘加可直接復(fù)用單精度操作完成。同樣地,使用一個(gè)26位和一個(gè)52位的移位器,并在前后分別加上移位位數(shù)選擇器和結(jié)果選擇器,即可完成規(guī)格化移位器模塊的復(fù)用設(shè)計(jì)。 乘法器是該設(shè)計(jì)中最重要的單元,包括部分積生成和部分積壓縮兩個(gè)部分,計(jì)算方法是按位拆分,分別計(jì)算再進(jìn)行合并。乘法計(jì)算公式為: 將公式中括號(hào)內(nèi)的內(nèi)容進(jìn)行Booth-4編碼[11-12],生成以A為基礎(chǔ)的16個(gè)部分積,再通過(guò)部分積壓縮樹(shù)將部分積壓縮成Carry和Sum結(jié)果??缇葟?fù)用技術(shù)在部分積生成和部分積壓縮樹(shù)兩部分中都有體現(xiàn)。進(jìn)行并行兩個(gè)的半精度數(shù)計(jì)算的操作中,在生成后8個(gè)部分積時(shí),A和B低位填充第一個(gè)半精度數(shù),高位填零;生成前8個(gè)部分積時(shí),A和B低位填零,高位填充第二個(gè)半精度數(shù)。這樣的填充方法可直接進(jìn)行壓縮,不影響最終結(jié)果,得到的后8個(gè)部分積壓縮后得到第一個(gè)半精度數(shù)乘法結(jié)果,前8個(gè)部分積壓縮后得到第二個(gè)半精度數(shù)乘法結(jié)果。部分積生成完成后進(jìn)行部分積壓縮,復(fù)用的部分積壓縮樹(shù)的結(jié)構(gòu)如圖4所示。 產(chǎn)生的16個(gè)部分積首先經(jīng)過(guò)兩層4∶2的CSA壓縮樹(shù),此時(shí)產(chǎn)生的4個(gè)分量結(jié)果與2個(gè)半精度特殊分量分別進(jìn)行3∶2CSA壓縮后即可輸出2個(gè)半精度結(jié)果;若其中兩個(gè)分量結(jié)果直接與單精度特殊分量進(jìn)行壓縮可輸出單半混合精度結(jié)果;而4個(gè)分量經(jīng)過(guò)4∶2CSA壓縮樹(shù)后再與單精度特殊分量進(jìn)行壓縮可得到單精度結(jié)果,所以此時(shí)需要增加一個(gè)MUX選擇器,根據(jù)控制信號(hào)中的精度信息進(jìn)行分量選擇,這樣最終可得到半精度、單精度或是單半精度的浮點(diǎn)數(shù)乘法中間結(jié)果Carry和Sum。值得注意的是,整數(shù)乘法也可借用此邏輯復(fù)用實(shí)現(xiàn),8位整數(shù)乘法套用半精度整數(shù)乘法,16位整數(shù)乘法套用半精度整數(shù)乘法,32位整數(shù)乘法套用單精度整數(shù)乘法即可。 圖4 部分積壓縮樹(shù) 得到Carry和Sum后,需要將這兩個(gè)分量合并成一個(gè)分量,同時(shí)并行使用這兩個(gè)分量進(jìn)行前導(dǎo)零預(yù)測(cè),預(yù)測(cè)合并后的分量前方有多少個(gè)零,這樣在分量合并得到結(jié)果后,同時(shí)通過(guò)前導(dǎo)零預(yù)測(cè)模塊得到的規(guī)格化移位位數(shù),直接進(jìn)行規(guī)格化移位,從而減少關(guān)鍵路徑時(shí)延。 合并模塊的功能是將Sum和Carry分量合并到一起,得到尾數(shù)計(jì)算的中間結(jié)果,通常使用加法器即可實(shí)現(xiàn)。合并模塊的跨精度復(fù)用實(shí)現(xiàn)技術(shù)比較直觀,由于單精度、半精度和單半混合精度的輸入數(shù)據(jù)大小不同,按照最低位數(shù)拆分并處理,并行使用4個(gè)41位的超前進(jìn)位加法器[13],輸入進(jìn)位分別設(shè)置為0和1,4個(gè)加法器根據(jù)控制信號(hào)分別輸入各種精度的浮點(diǎn)或整數(shù)乘加的Sum和Carry(位數(shù)不足時(shí)分別補(bǔ)0和1),然后將加法器結(jié)果通過(guò)選擇器可得到不同精度的合并數(shù)值。 前導(dǎo)零預(yù)測(cè)模塊的功能是根據(jù)Sum和Carry分量預(yù)測(cè)計(jì)算兩個(gè)分量合并后的首1位置。前導(dǎo)零預(yù)測(cè)模塊的核心算法是LZA算法[14],即對(duì)兩個(gè)操作數(shù)做減法計(jì)算,得到數(shù)零位串,對(duì)得到的數(shù)零位串通過(guò)樹(shù)形結(jié)構(gòu)LZD預(yù)測(cè)第一個(gè)1的位置,即可得到前導(dǎo)零預(yù)測(cè)的結(jié)果。 前導(dǎo)零預(yù)測(cè)的跨精度復(fù)用思想和設(shè)計(jì)技術(shù)與合并模塊類似,單精度和半精度的數(shù)零位串的長(zhǎng)度分別為52位和26位,考慮到LZD預(yù)測(cè)樹(shù)的高度可擴(kuò)展性,使用長(zhǎng)度為2的次方數(shù)的LZD樹(shù)形結(jié)構(gòu)。按照最低位數(shù)拆分并處理,并行使用兩個(gè)32位的LZD預(yù)測(cè)樹(shù),根據(jù)兩個(gè)預(yù)測(cè)樹(shù)分別輸出的有效位和預(yù)測(cè)數(shù)值進(jìn)行邏輯判斷,通過(guò)選擇器后,最終得到不同精度需求的規(guī)格化移位位數(shù)。由于前導(dǎo)零預(yù)測(cè)算法本身可能會(huì)存在1位的誤差,且加法和減法可能存在1位誤差,所以至多存在2位的誤差,需要在規(guī)格化移位結(jié)束后進(jìn)行檢測(cè),若存在誤差則進(jìn)行指數(shù)和尾數(shù)的修正。值得注意的是,在乘法器輸出結(jié)果之后,單半混合精度與單精度結(jié)果的處理方式完全相同,不會(huì)額外增加邏輯。 指數(shù)調(diào)整模塊的功能是消除誤差,得到準(zhǔn)確的指數(shù)值。由于前導(dǎo)零預(yù)測(cè)本身可能存在至多2位的誤差,故在規(guī)格化移位后進(jìn)行簡(jiǎn)單的邏輯判斷,計(jì)算出指數(shù)調(diào)整和尾數(shù)移位的數(shù)值,使用加法器即可得到最終結(jié)果的指數(shù)值,并對(duì)尾數(shù)再進(jìn)行一定量的移位得到最終結(jié)果的尾數(shù)值。 舍入模塊的功能是對(duì)最終結(jié)果進(jìn)行舍入,并合并指數(shù)尾數(shù)結(jié)果得到最終的輸出結(jié)果和異?;蛞绯鲂盘?hào)。得到最終結(jié)果的指數(shù)值和尾數(shù)值后,結(jié)合舍入位和粘貼位的數(shù)據(jù),舍入模塊根據(jù)控制信號(hào)提供的4種不同的舍入方式進(jìn)行舍入,得到正常的計(jì)算結(jié)果,同時(shí)與異常處理結(jié)果合并,即可最終輸出浮點(diǎn)乘加結(jié)果、浮點(diǎn)異常信號(hào)、整數(shù)乘法結(jié)果和整數(shù)溢出信號(hào),完成面向AI的浮點(diǎn)乘法器功能。 完成代碼設(shè)計(jì)后,撰寫(xiě)激勵(lì)使用PSL語(yǔ)言對(duì)浮點(diǎn)乘加器進(jìn)行正確性測(cè)試,驗(yàn)證面向人工智能的浮點(diǎn)乘加器是否滿足正確性要求。正確性測(cè)試主要分為功能點(diǎn)測(cè)試和隨機(jī)數(shù)測(cè)試兩個(gè)方面。第一是功能點(diǎn)測(cè)試,對(duì)于各種異常的輸入分別制造激勵(lì)進(jìn)行測(cè)試,直到所有的異常情況都被覆蓋,從而檢測(cè)浮點(diǎn)乘加器的異常處理機(jī)制是否完備;第二是隨機(jī)數(shù)測(cè)試,對(duì)于表1中列舉的各種部件功能,包括單精度、半精度和混合精度三種精度浮點(diǎn)乘加,和32/16/8位定點(diǎn)乘法,分別生成十萬(wàn)組不同的隨機(jī)數(shù)數(shù)據(jù),測(cè)試各個(gè)功能的結(jié)果是否保持正確,從而檢測(cè)浮點(diǎn)乘加器的各功能都能正確使用。功能點(diǎn)和隨機(jī)數(shù)測(cè)試的結(jié)果顯示,文中設(shè)計(jì)的面向AI的浮點(diǎn)乘加器結(jié)果滿足正確性要求。 使用Synopsys公司的Design Compiler工具,基于28 nm工藝庫(kù)條件對(duì)浮點(diǎn)乘加器進(jìn)行物理綜合。物理綜合結(jié)果顯示,該部件的綜合運(yùn)行頻率可達(dá)2 GHz。 為了評(píng)估該部件的功耗和面積等指標(biāo),體現(xiàn)該設(shè)計(jì)的優(yōu)越性,在相同條件下,分別對(duì)單精度浮點(diǎn)乘加部件[9]、半精度浮點(diǎn)乘加部件[9]和設(shè)計(jì)的面向AI的浮點(diǎn)乘加器進(jìn)行物理綜合,并對(duì)面積和功耗等性能指標(biāo)進(jìn)行對(duì)比,結(jié)果如表4所示。 表4 性能對(duì)比 對(duì)比的結(jié)果可以發(fā)現(xiàn),文中設(shè)計(jì)的面積比經(jīng)典的單精度浮點(diǎn)乘加部件增加了27.2%,功耗增加了37.55%。考慮完全無(wú)復(fù)用的設(shè)計(jì),完成面向AI的浮點(diǎn)乘加器的計(jì)算功能需求至少需要1個(gè)單精度部件和2個(gè)半精度部件,同時(shí)需要1個(gè)單半精度混合部件,且單半精度混合部件的面積和功耗比半精度部件要大,在計(jì)算無(wú)復(fù)用結(jié)果時(shí)可進(jìn)行累加。最終結(jié)果顯示,該設(shè)計(jì)比完全無(wú)復(fù)用設(shè)計(jì)的面積至少減少50.09%,功耗至少減少47.91%。 總而言之,該設(shè)計(jì)使用跨精度復(fù)用技術(shù)[15],在保證頻率可接受范圍內(nèi),大幅度減少了設(shè)計(jì)的硬件實(shí)現(xiàn)消耗,優(yōu)化了浮點(diǎn)乘加器的性能,提出的復(fù)用技術(shù)具有顯著意義。 文中研究和設(shè)計(jì)了一種面向AI的浮點(diǎn)乘加器,支持32位、并行2個(gè)16位/8位的整數(shù)乘法運(yùn)算,同時(shí)支持單精度、單半混合精度、并行2個(gè)半精度的浮點(diǎn)乘加運(yùn)算。采用跨精度復(fù)用思路,詳細(xì)講解了各模塊的功能、詳細(xì)設(shè)計(jì)方法和跨精度復(fù)用實(shí)現(xiàn)方案。跨精度復(fù)用技術(shù)是文中的主要?jiǎng)?chuàng)新點(diǎn),提出了乘法器復(fù)用、移位器復(fù)用和前導(dǎo)零預(yù)測(cè)復(fù)用等一系列關(guān)鍵技術(shù)。完成代碼設(shè)計(jì)后,對(duì)浮點(diǎn)乘加器進(jìn)行了正確性測(cè)試,結(jié)果表明浮點(diǎn)乘加器能夠滿足正確性要求。使用DC工具對(duì)浮點(diǎn)乘加器進(jìn)行硬件綜合,結(jié)果顯示該設(shè)計(jì)類比于無(wú)復(fù)用設(shè)計(jì),減少了至少50.09%的面積、47.91%的功耗,綜合運(yùn)行頻率可達(dá)2 GHz。2.3 移位器
2.4 乘法器
2.5 合并與前導(dǎo)零預(yù)測(cè)
2.6 指數(shù)調(diào)整與舍入
3 實(shí)驗(yàn)分析
3.1 正確性測(cè)試
3.2 物理綜合
4 結(jié)束語(yǔ)