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