胥 濤, 秦水介, 鄧 全
(1 貴州大學(xué) 貴州省光電子技術(shù)及應(yīng)用重點(diǎn)實(shí)驗(yàn)室, 貴陽 550025; 2 國防科技大學(xué) 計(jì)算機(jī)學(xué)院, 長沙 410073;3 貴州大學(xué) 大數(shù)據(jù)與信息工程學(xué)院, 貴陽 550025)
隨著信息時(shí)代的到來,圖像識(shí)別、深度學(xué)習(xí)、數(shù)字信號(hào)處理和人工智能等應(yīng)用技術(shù)在不斷地發(fā)展,需要處理的數(shù)據(jù)量正與日俱增,對(duì)于計(jì)算能力的要求也越來越高。 由于浮點(diǎn)數(shù)科學(xué)計(jì)數(shù)的方式,在圖像識(shí)別、機(jī)器學(xué)習(xí)等領(lǐng)域得到了越來越廣泛的使用,對(duì)于數(shù)據(jù)計(jì)算速率的提升有很大的作用。 由于浮點(diǎn)的加法、減法、轉(zhuǎn)換、比較都可以轉(zhuǎn)換為加法或者復(fù)用加法的部分計(jì)算來實(shí)現(xiàn),使得浮點(diǎn)加法在運(yùn)算中使用頻率占50%以上[1],所以浮點(diǎn)加法的性能提升對(duì)于浮點(diǎn)計(jì)算能力的提高有著非常重要的意義。
在機(jī)器學(xué)習(xí)等領(lǐng)域發(fā)展過程中發(fā)現(xiàn),一般情況下不需要用到32 位和64 位的高精度數(shù)據(jù),而bfloat16 的數(shù)據(jù)格式比IEEE 754-2008 定義的16 位數(shù)據(jù)表示范圍更大,對(duì)比32 位和64 位數(shù)據(jù)而言,尾數(shù)較小、精度較低在計(jì)算時(shí)容易在舍入上出現(xiàn)錯(cuò)誤;而精度低也表示在相同內(nèi)存下,bfloat 格式可以存放更多數(shù)據(jù),數(shù)據(jù)的存取移動(dòng)速度更快,同時(shí)在計(jì)算部件的實(shí)現(xiàn)上也會(huì)更加簡單。
bfloat16 格式是指1 位符號(hào)位、8 位階碼、7 位尾數(shù)組成的浮點(diǎn)數(shù),形式上相當(dāng)于單精度浮點(diǎn)數(shù)的高16 位;同時(shí)相比IEEE 半精度浮點(diǎn)階碼更大,尾數(shù)更小,可以發(fā)現(xiàn)就能在降低精度的情況下表示更大范圍的數(shù)據(jù)。 由此有一些處理器已經(jīng)將bfloat16 數(shù)據(jù)的計(jì)算加入設(shè)計(jì)規(guī)劃,比如ARM 宣布將bfloat16 數(shù)據(jù)格式加入下一版本的Armv8-A 架構(gòu)[2]。
現(xiàn)在主流的浮點(diǎn)計(jì)算還沒有實(shí)現(xiàn)兼容bfloat16數(shù)據(jù)的相關(guān)計(jì)算,為了滿足對(duì)浮點(diǎn)計(jì)算速率更高的要求,本文提出一種支持bfloat16 的高性能浮點(diǎn)加法器設(shè)計(jì),包含設(shè)計(jì)要點(diǎn),性能報(bào)告等。 本文工作包括算法修改、縮拍設(shè)計(jì)、bfloat16 計(jì)算兼容。 其中,算法修改是為了更好地實(shí)現(xiàn)縮拍設(shè)計(jì),在原來的3 拍流水線設(shè)計(jì)上,各拍計(jì)算功能分配合理,頻率相對(duì)較高,但絕對(duì)延時(shí)為3 拍。 為了滿足2 拍流水線的設(shè)計(jì),優(yōu)化后的算法將前導(dǎo)零預(yù)測(cè)和尾數(shù)計(jì)算改為并行計(jì)算,減少了整體的計(jì)算時(shí)間,將絕對(duì)延時(shí)減為2拍,但是每拍的計(jì)算操作更多,功率更高。 算法修改后將流水線縮減為2 拍可以盡可能避免頻率減小。
實(shí)驗(yàn)數(shù)據(jù)表明,最終設(shè)計(jì)相比原始設(shè)計(jì)頻率下降1.36%,達(dá)到2.16 GHz,面積增加14.01%,功率增加53.31%,為2.181 1 mw。
浮點(diǎn)加法算法主要可以分為單通道計(jì)算算法、雙通道計(jì)算算法、三通道計(jì)算算法等,主流為雙通道算法(Two-Path)和三通道算法(Triple-data-path)。
浮點(diǎn)加法計(jì)算過程簡單,分為階碼相減、對(duì)階操作、前導(dǎo)零預(yù)測(cè)、尾數(shù)相加、規(guī)格化舍入等運(yùn)算步驟,如圖1 所示。
圖1 浮點(diǎn)加法流程Fig.1 Floating-point addition flow chart
本設(shè)計(jì)是基于主流的TWO-PATH 算法上做出的改進(jìn),原始的加法器算法設(shè)計(jì)的是一個(gè)3 級(jí)流水線的加法器部件,簡單的算法流程圖如圖2 所示。 原始算法按TWO-PATH 結(jié)構(gòu)設(shè)計(jì),第一步是數(shù)據(jù)的預(yù)?。菏紫劝凑蛰斎胄盘?hào)的變化分辨操作數(shù)的精度,依據(jù)不同的浮點(diǎn)精度選取不同長度的階碼、尾數(shù)部分,對(duì)2 個(gè)操作數(shù)進(jìn)行階碼相減分辨操作數(shù)的計(jì)算符合near 和far中哪一條路徑。 對(duì)于TWO-PATH 算法依據(jù)浮點(diǎn)加法的計(jì)算方式將加法分為near path 和far path 兩條路徑,兩者以階碼的差值相區(qū)別,當(dāng)階碼的差值小于等于1時(shí),加法對(duì)應(yīng)near path 部分結(jié)果,當(dāng)階碼差值大于1時(shí),加法結(jié)果為far path 路徑結(jié)果。
圖2 浮點(diǎn)加法3 級(jí)流水線示意圖Fig.2 Schematic diagram of the three-stage pipeline for floatingpoint addition
第二拍的操作是將near path 路徑數(shù)據(jù)的尾數(shù)部分進(jìn)行前導(dǎo)零預(yù)測(cè)計(jì)算,計(jì)算前需將數(shù)據(jù)右移一位的同時(shí)在最高位補(bǔ)1,這是由于規(guī)格化浮點(diǎn)數(shù)的尾數(shù)部分總是默認(rèn)舍棄最高位1,在計(jì)算過程中還要回復(fù)原始數(shù)據(jù)計(jì)算。 根據(jù)操作數(shù)階碼的差值和尾數(shù)的大小比較確定右移的位數(shù),判斷操作數(shù)的大小。根據(jù)小數(shù)靠大數(shù)的原則右移尾數(shù)部分,然后根據(jù)前導(dǎo)零預(yù)測(cè)的數(shù)據(jù)左移操作數(shù)尾數(shù)部分,最后進(jìn)行尾數(shù)的加法操作。
第三拍的計(jì)算操作是舍入和數(shù)據(jù)選擇,根據(jù)計(jì)算指令規(guī)定的舍入模式對(duì)加法的結(jié)果進(jìn)行數(shù)據(jù)舍入,同時(shí)根據(jù)浮點(diǎn)計(jì)算的規(guī)則和操作數(shù)的情況,分辨結(jié)果是near path 路徑結(jié)果、還是far path 路徑結(jié)果、或者是特殊值。
優(yōu)化算法的結(jié)構(gòu)也是基于TWO-PATH 的算法,其中對(duì)于關(guān)鍵路徑的時(shí)序進(jìn)行了優(yōu)化,將計(jì)算過程的絕對(duì)延遲縮減到2 拍,且支持流水線操作。
浮點(diǎn)加法3 級(jí)流水線的設(shè)計(jì)見圖2,本文提出加法計(jì)算結(jié)構(gòu)將計(jì)算的步驟縮減到2 拍,即:E1 和E2。 在初始算法設(shè)計(jì)3 拍流水線的基礎(chǔ)上,為了提高計(jì)算速度,降低流水線拍數(shù),在第一拍完成數(shù)據(jù)分解和計(jì)算階碼差值后,將較小操作數(shù)尾數(shù)部分對(duì)階的右移操作也放到第一拍,加快near path 路徑計(jì)算;在第二拍完成尾數(shù)部分的補(bǔ)碼加法,計(jì)算尾數(shù)部分的前導(dǎo)零預(yù)測(cè)的結(jié)果,取消對(duì)操作數(shù)規(guī)格化的操作,改為對(duì)結(jié)果進(jìn)行規(guī)格化,然后對(duì)結(jié)果進(jìn)行舍入計(jì)算,減少了near path 的計(jì)算時(shí)間。
原始算法的加法設(shè)計(jì)在劃分流水線時(shí),將數(shù)據(jù)的右移對(duì)階部分、前導(dǎo)零預(yù)測(cè)部分、左移規(guī)格化部分都設(shè)定在同一拍的流水上,由于前導(dǎo)零預(yù)測(cè)的復(fù)雜性,大大占用了節(jié)拍時(shí)間。 為此在新設(shè)計(jì)中,為了在縮拍后避免時(shí)序的沖突,將階碼對(duì)階定制在第一拍的計(jì)算中,將前導(dǎo)零預(yù)測(cè)和計(jì)算排定在第二拍中,看起來似乎加大了第二拍的運(yùn)算時(shí)間,然而對(duì)于整體計(jì)算過程而言,原設(shè)計(jì)在尾數(shù)相加之前的對(duì)階操作、前導(dǎo)零預(yù)測(cè)和規(guī)格化左移是一個(gè)連貫有序的過程,后續(xù)的規(guī)格化左移只能等待前兩者完成后才能啟動(dòng);而對(duì)于新設(shè)計(jì)而言,在上一拍已經(jīng)進(jìn)行了對(duì)階右移操作,而規(guī)格化左移的計(jì)算是針對(duì)結(jié)果去做的,這并不會(huì)影響正常的尾數(shù)加法,所以前導(dǎo)零預(yù)測(cè)和尾數(shù)的相加并行進(jìn)行,如此則縮短了整體的計(jì)算時(shí)間。 綜上縮拍的結(jié)果符合設(shè)計(jì)的要求,在保證頻率的情況下減小整個(gè)加法的計(jì)算時(shí)間,完成了流水線縮拍設(shè)計(jì)。
在此基礎(chǔ)上,根據(jù)TWO-PATH 算法的規(guī)則,分別選取符合far path 和near path 的數(shù)據(jù)建立測(cè)試功能點(diǎn),對(duì)于特殊數(shù)如:無窮大(inf)、NaN(not a number)等也考慮在內(nèi),接下來基于這些功能點(diǎn)編寫定向測(cè)試激勵(lì)測(cè)試功能完整性。
在做縮拍設(shè)計(jì)時(shí),會(huì)遇到的較為典型的信號(hào)傳導(dǎo)和時(shí)序匹配問題,比如功能驗(yàn)證時(shí)發(fā)現(xiàn)階碼計(jì)算出錯(cuò)的問題,排查發(fā)現(xiàn)是階碼信號(hào)傳遞的判定信號(hào)和前導(dǎo)零預(yù)測(cè)結(jié)果的傳遞判斷信號(hào)相同,但是兩者在計(jì)算時(shí)是一個(gè)串行的關(guān)系,所以出現(xiàn)計(jì)算錯(cuò)誤。這是在節(jié)拍控制上對(duì)于相關(guān)問題考慮上發(fā)生的疏漏所致。 所以需要考慮到數(shù)據(jù)傳遞和計(jì)算在時(shí)序分配上的關(guān)系,從而避免設(shè)計(jì)沖突。
1.3.1 設(shè)計(jì)結(jié)構(gòu)
本設(shè)計(jì)將bfloat16 格式的計(jì)算放在16 位浮點(diǎn)加法模塊中,如果將bfloat16 浮點(diǎn)數(shù)看做32 位IEEE標(biāo)準(zhǔn)數(shù)據(jù)的前半部分計(jì)算,將其和32 位單精度加法結(jié)合,那么實(shí)現(xiàn)起來會(huì)很簡單,對(duì)于設(shè)計(jì)的改變較?。坏沁@樣設(shè)計(jì)考慮到精度混合計(jì)算時(shí),在一個(gè)64 位雙精度計(jì)算部件中只能兼容2 個(gè)32 位單精度計(jì)算、或2 個(gè)bfloat16 計(jì)算、或4 個(gè)半精度計(jì)算;所以研究中將其與IEEE 格式的16 位半精度加法計(jì)算結(jié)合在一塊,這樣一來64 位雙精度計(jì)算部件可以兼容2 個(gè)32 位計(jì)算、或4 個(gè)bfloat16 計(jì)算、或4 個(gè)半精度計(jì)算,利用計(jì)算部件的復(fù)用實(shí)現(xiàn)兼容bfloat16 格式,減小資源的消耗,兼容bfloat16 的半精度加法的設(shè)計(jì)如圖3 所示。
圖3 兼容bfloat16 的半精度加法Fig.3 Half-precision addition compatible with bfloat16
對(duì)于半精度的數(shù)據(jù)而言只有5 位的階碼長度,所以要達(dá)到兼容bfloat16 的情況要擴(kuò)展高位,為了不影響正常的半精度階碼計(jì)算需要在高位補(bǔ)0,而尾數(shù)的計(jì)算,為了保證bfloat16 數(shù)據(jù)計(jì)算的正確性,需要在數(shù)據(jù)分解時(shí),將尾數(shù)部分放在高位,在低位補(bǔ)0。 為了區(qū)分計(jì)算需要添加bfloat 使能信號(hào),在前導(dǎo)零預(yù)測(cè)中bfloat16 最多可移動(dòng)位數(shù)是7,小于半精度的10 位,所以前導(dǎo)零預(yù)測(cè)的部件復(fù)用對(duì)于結(jié)果不會(huì)產(chǎn)生影響。 在舍入計(jì)算中同樣需要區(qū)分兩者的不同有效部分,由于舍入的判定都是由有效位后的數(shù)據(jù)和舍入模式?jīng)Q定的,計(jì)算結(jié)果選取也要選擇相應(yīng)的有效位數(shù),這些都需要考慮bfloat16 和半精度浮點(diǎn)的區(qū)別。
設(shè)計(jì)工作要考慮bfloat16 數(shù)據(jù)和正常浮點(diǎn)數(shù)的計(jì)算差別,包括數(shù)據(jù)格式、特殊數(shù)選取、舍入模式等方面。 基于浮點(diǎn)計(jì)算的共通之處則要盡可能復(fù)用正常浮點(diǎn)的計(jì)算通路減小功耗。
在進(jìn)行了兼容bfloat16 計(jì)算的設(shè)計(jì)后,先利用寫好的定向測(cè)試激勵(lì)驗(yàn)證正常浮點(diǎn)數(shù)計(jì)算功能是否破壞,再根據(jù)TWO-PATH 算法和bfloat16 的數(shù)據(jù)格式建立功能點(diǎn),重新編寫定向激勵(lì)測(cè)試設(shè)計(jì)的功能是否成功。
1.3.2 bfloat16 對(duì)于特殊數(shù)的處理
對(duì)于無窮大、NaN 數(shù)、subnormal 數(shù)的格式和IEEE 標(biāo)準(zhǔn)類似,只是數(shù)據(jù)的位數(shù)不一致。 其中,無窮大數(shù)和NaN 數(shù)都是階碼為全1,尾數(shù)為全0 和不為全0 的數(shù);subnormal 數(shù)是階碼為0,尾數(shù)不為全0的數(shù);subnormal 數(shù)階碼為0,但表示的數(shù)據(jù)階碼在計(jì)算時(shí)等同于1。
對(duì)于這些特殊數(shù)據(jù)在計(jì)算時(shí)的處理使用的RISC-V 的處理情況,正負(fù)零相加減,結(jié)果為正零;若符號(hào)位相同,則符號(hào)位取任意操作數(shù)符號(hào)位。NaN 數(shù)與任意數(shù)據(jù)相加減結(jié)果為canonical-NaN,兩NaN 數(shù)相加減結(jié)果也為canonical-NaN;正無窮大加減數(shù)據(jù)結(jié)果為正無窮大,負(fù)無窮加減結(jié)果為負(fù)無窮,正負(fù)無窮相加減結(jié)果為canonical-NaN。
對(duì)于這些特殊數(shù)據(jù)的計(jì)算,為了實(shí)現(xiàn)特殊結(jié)果的輸出,在數(shù)據(jù)輸入后就會(huì)進(jìn)行特殊數(shù)的判斷,比較階碼和尾數(shù)部分是否全為1、或全為0,從而判斷是哪一種特殊情況,根據(jù)設(shè)計(jì)規(guī)則輸出標(biāo)準(zhǔn)結(jié)果。
利用核級(jí)環(huán)境調(diào)用加減法指令測(cè)試實(shí)驗(yàn)功能準(zhǔn)確性,利用DC 綜合工具進(jìn)行綜合仿真。 實(shí)驗(yàn)分為設(shè)計(jì)修改、定向測(cè)試激勵(lì)驗(yàn)證、EDA 軟件綜合PPA對(duì)比。
分析可知,驗(yàn)證即是芯片設(shè)計(jì)過程中值得關(guān)注的重要問題,隨著芯片功能的不斷強(qiáng)大,驗(yàn)證環(huán)境涉及的各類情況越發(fā)復(fù)雜,需要占據(jù)設(shè)計(jì)環(huán)節(jié)越來越多的時(shí)間和工作。 本設(shè)計(jì)只需要驗(yàn)證BF 浮點(diǎn)16位加法功能的正確性,只使用定向測(cè)試激勵(lì)驗(yàn)證設(shè)計(jì)功能。 簡單來說,設(shè)計(jì)對(duì)應(yīng)的bfloat16 的計(jì)算數(shù)據(jù),準(zhǔn)備正確結(jié)果作為比對(duì)值,在計(jì)算結(jié)束后將計(jì)算結(jié)果與預(yù)設(shè)值比較,這些過程都由匯編指令完成。
對(duì)于本設(shè)計(jì)的驗(yàn)證,選擇了利用浮點(diǎn)指令的定向激勵(lì)做測(cè)試,定向測(cè)試激勵(lì)都利用risc-v 支持的匯編指令編寫,整個(gè)過程具體分為:調(diào)用訪存指令讀取數(shù)據(jù)、利用浮點(diǎn)搬運(yùn)指令放入浮點(diǎn)寄存器、調(diào)用浮點(diǎn)加減指令、計(jì)算結(jié)果寫回寄存器、寫入正確結(jié)果對(duì)比值、調(diào)用比較指令、輸出比較結(jié)果。 數(shù)據(jù)選取考慮到了正常的數(shù)據(jù)計(jì)算(包括near path 和far path 的各樣需要移位的情形)、非特殊數(shù)的臨界數(shù)據(jù)計(jì)算、無窮大和NaN 數(shù)等特殊數(shù)的計(jì)算情形。
本設(shè)計(jì)使用的EDA 軟件綜合工具來對(duì)設(shè)計(jì)進(jìn)行綜合驗(yàn)證,使用軟件綜合的結(jié)果可得到較為優(yōu)化的時(shí)序效果,會(huì)自動(dòng)對(duì)設(shè)計(jì)中部分參數(shù)進(jìn)行優(yōu)化,比如設(shè)計(jì)尺寸、電路拓?fù)浣Y(jié)果、時(shí)序約束等,所以EDA的軟件綜合結(jié)果比其他工具在面積、速度上更加精簡。 實(shí)驗(yàn)比較了原始算法、縮拍新算法設(shè)計(jì)、兼容bfloat16 算法三種設(shè)計(jì)。
EDA 綜合數(shù)據(jù)符合預(yù)期。 原始算法、改進(jìn)算法和兼容bfloat16 格式的EDA 綜合數(shù)據(jù)見表1。
表1 EDA 綜合結(jié)果Tab.1 Comprehensive results of EDA
表1 中,數(shù)據(jù)前四列為EDA 工具綜合出的4 個(gè)路徑組,對(duì)應(yīng)的數(shù)據(jù)為該路徑的slack 值;后三列為設(shè)計(jì)占用的硬件資源。 slack 值代表的數(shù)據(jù)為設(shè)計(jì)要求時(shí)間和dc 工具模擬出的時(shí)間的差值:當(dāng)slack為正數(shù),表示在要求時(shí)間內(nèi)可以完成該路徑計(jì)算;為負(fù)值,表示計(jì)算時(shí)間超過約束值。 本設(shè)計(jì)中使用的約束時(shí)間為0.455 ns,原始算法恰好滿足結(jié)果,其頻率達(dá)到2.2 GHz;對(duì)于改進(jìn)算法,由于進(jìn)行了拍數(shù)縮減,使得在盡量保持頻率的情況下減少了硬件計(jì)算資源,其頻率達(dá)到2.16 GHz;兼容bfloat16 計(jì)算的算法,在設(shè)計(jì)實(shí)現(xiàn)下其頻率為2.17 GHz,與原算法相比在縮減流水線兼容bfloat16 計(jì)算的情況下其頻率下降1.36%,面積增加14.01%,功率增加53.31%。
定向測(cè)試激勵(lì)測(cè)試結(jié)果:bfloat16 浮點(diǎn)加法減法計(jì)算,特殊數(shù)計(jì)算結(jié)果均符合預(yù)期,正常IEEE 標(biāo)準(zhǔn)浮點(diǎn)計(jì)算結(jié)果正常。
本設(shè)計(jì)提出一種兼容bfloat16 格式的高速浮點(diǎn)加法設(shè)計(jì),在保證正常的16、32、64 位浮點(diǎn)計(jì)算的同時(shí)將執(zhí)行流水線縮減至2 拍,頻率可達(dá)2.17 GHz,功耗為2.181 1 mw。本設(shè)計(jì)可以保證在深度學(xué)習(xí)、圖像識(shí)別等領(lǐng)域進(jìn)行計(jì)算時(shí)使用bfloat 格式浮點(diǎn)數(shù)計(jì)算,提高計(jì)算速度;但由于是在原浮點(diǎn)加法部件上進(jìn)行的兼容設(shè)計(jì),整個(gè)計(jì)算的功能變得龐大,雖然做了流水線縮拍設(shè)計(jì),但整個(gè)部件的頻率還是有略微下降,并且功耗加大,所以還需進(jìn)一步改善設(shè)計(jì)的功耗面積等相關(guān)方面。