吳 凡,王 磊
1(中原工學院 計算機學院,鄭州 450007)
2(中原工學院 前沿信息技術研究院,鄭州 450007)
高性能計算機是國家綜合國力的重要體現(xiàn),對現(xiàn)代社會的科學研究、社會服務、經(jīng)濟活動而言,已成為不可或缺的戰(zhàn)略工具,全球眾多國家都極為重視高性能計算能力的建設與發(fā)展[1].基礎數(shù)學函數(shù)庫[2]作為處理器配套軟件的重要組成部分,是高性能計算機平臺上各領域應用軟件開發(fā)必需的最基礎、最核心的軟件之一.而基礎數(shù)學庫的實現(xiàn)與硬件平臺密切相關,Intel、AMD 等主流CPU 廠商都推出了與其平臺相對應數(shù)學庫軟件.隨著高性能計算需求的日益增大,越來越多的應用開始部署在以申威處理器為代表的國產高性能計算平臺上[3].申威1621 處理器是一款具有我國自主知識產權的高性能處理器,針對該處理器,目前已經(jīng)推出了與之對應的國產數(shù)學庫軟件,并且做了相對應的優(yōu)化,達到了工程的需求,其性能較之GNU的glibc 數(shù)學庫也有較大的優(yōu)勢.
從算法優(yōu)化角度,文獻[4]在分析現(xiàn)有算法的基礎上,提出初等函數(shù)算法設計原則和兩種算法設計模式,使得主核函數(shù)的性能平均提高52.4%,從核函數(shù)的性能平均提高75.3%,并且精度與GNU 總體保持一致.文獻[5]針對超越函數(shù)的實現(xiàn)繁瑣易錯、應用精度需求各異等問題,提出并實現(xiàn)兼顧通用性和函數(shù)數(shù)學特性的可變精度超越函數(shù)算法.該算法不僅能夠生成常見超越函數(shù)的不同精度版本的函數(shù)代碼,且相對標準數(shù)學庫超越函數(shù)具有性能優(yōu)勢.
從訪存優(yōu)化角度,文獻[6]為有效解決超越函數(shù)查表與多項式結合算法的“存儲墻”問題,提出基于數(shù)據(jù)表精簡算法的超越函數(shù)訪存優(yōu)化方法,使得函數(shù)性能平均提升55.06%.文獻[7]提出了一種基于訪存指令的調度策略,即將訪存延遲有效地隱藏于計算延遲中,平均提高函數(shù)性能16.08%.文獻[8]提出一種基于多級分層策略的寄存器分配策略,合理地使用寄存器資源,減少寄存器分配過程中產生的溢出,將數(shù)學庫中的函數(shù)性能提高6%以上.文獻[9]針對基礎數(shù)學庫中的寄存器分配特點,利用最常用情況執(zhí)行時間(Most-Case Execution Time,MCET)模型對經(jīng)典的線性掃描寄存器分配算法進行了擴展,將變量溢出過程分配到非常用路徑上,從而減少全局的寄存器溢出開銷,提高數(shù)學庫的性能.
從SIMD 向量化角度,文獻[10]結合三角函數(shù)、反三角函數(shù)、指數(shù)函數(shù)和對數(shù)函數(shù)研究出一種高效向量化算法,并在申威26010 處理器上完成擴展函數(shù)庫實現(xiàn),在性能上與Intel VML 數(shù)學庫相比,各函數(shù)的平均加速比均達到1.1 以上.文獻[11]針對SIMD 指令缺少和部分指令性能較低的問題,提出了一種基于SIMD擴展指令的等價替換方法,使得函數(shù)庫性能提升13%左右.文獻[12]針對多數(shù)函數(shù)代碼分支多和SIMD 指令不完備的問題,提出了向量數(shù)學庫的向量化方法,通過確定核心代碼段、數(shù)據(jù)預處理過程向量化及指令向量化3個步驟,使exp,pow,log10 等典型函數(shù)的性能平均提高了24.2%.文獻[13]提出一種SIMD 對齊的優(yōu)化方法,并采用一套系統(tǒng)的方法來處理絕對地址和相對地址訪存方案,與數(shù)學函數(shù)的非對齊存儲器訪問方案相比,提升函數(shù)性能22.3%.文獻[14]提出一種向量寄存器部分數(shù)據(jù)重用的方法,利用向量寄存器的部分元素來減少寄存器壓力、冗余計算和內存訪問,與打包解包方法相比,該方法使得函數(shù)性能平均加速14.19%.
文獻[15]從基本塊向量化、指令替換、訪存、指令流水線等多個方面展開優(yōu)化,在保證數(shù)學庫精度的同時,有效提高了函數(shù)的性能.
以上文獻提出的優(yōu)化方法都對基礎數(shù)學函數(shù)庫性能有一定的提升,但是還沒有文獻針對rfpcr和wfpcr指令作出優(yōu)化處理.在現(xiàn)版本基礎函數(shù)庫的實現(xiàn)中,tan、cot、remainder、fmodf、lround、modf、remquof、trunc 等函數(shù)都使用了rfpcr 指令和wfpcr 指令,該指令會導致流水線中斷,嚴重降低了函數(shù)庫的性能.因此本文在分析每個函數(shù)功能和指令特性后提出指令段功能等效替換方法,提升函數(shù)性能.
本文第1 節(jié)詳細介紹指令替換方法;第2 節(jié)給出實驗結果及分析;最后對全文進行總結.
在流水線技術中,指令之間的相關性會在流水線中引起沖突,沖突會導致流水線阻塞,而流水線阻塞會降低流水線的效率[16].除了指令之間的相關性會導致流水線的阻塞,還有一些特殊的指令由于指令的功能需求,會直接阻斷流水線,比如rfpcr和wfpcr 指令.浮點控制寄存器(Floating-Point Control Register,FPCR)是浮點運算控制和狀態(tài)寄存器,其內容用于控制浮點運算的舍入方式、異常屏蔽等,并記錄浮點運算的異常狀態(tài).rfpcr 指令的功能是讀浮點控制寄存器的值,wfpcr 指令向浮點控制寄存器寫入新值.
當譯碼器識別出rfpcr 指令時,為保證rfpcr 指令獲得浮點控制寄存器的最新內容,rfpcr 指令進入浮點指令隊列發(fā)射的條件之一是前面的所有指令已執(zhí)行完畢并退出流水.
當譯碼器識別出wfpcr 指令時,為保證wfpcr 指令修改FPCR 寄存器后能影響后繼的浮點指令,在指令流水線的發(fā)射站臺設置一位CSR 記分板,wfpcr 指令從指令隊列發(fā)射的條件之一是該記分板位已被清除,該指令發(fā)射時,設置該記分板位為“1”,禁止發(fā)射隊列發(fā)射后繼的指令,直到wfpcr 指令完成并退出后,清除該記分板位.
在申威基礎數(shù)學庫的實現(xiàn)中,rfpcr和wfpcr 會與移位、加減計算等指令組成一個指令段,指令段的主要功能是使得計算指令在向零舍入模式下執(zhí)行.圖1是指令段偽代碼.

圖1 指令段偽代碼
在申威1621 處理器中,默認的舍入模式是就近舍入.為了實現(xiàn)在向零舍入模式下執(zhí)行計算指令,需要在計算前用wfpcr 指令將舍入模式修改為向零舍入,即向FPCR 寄存器中寫入新值,該值的舍入模式控制位為向零舍入,計算完成后再用wfpcr 指令將舍入模式還原.
在有需要實現(xiàn)上述指令段功能的函數(shù)中,計算指令有3 種,分別是浮點轉整數(shù)指令(fcvtdl)、加法指令(faddd/fadds)和除法指令(fdivd/fdivs).如圖2所示,本文在不改變這些指令段正確性的前提下,使用等效的方法實現(xiàn)相同的功能.在執(zhí)行完上述3 種計算指令后,會得出一個值并被寫入到寄存器中.所謂功能等效替換方法是指在不使用rfpcr和wfpcr 指令的前提下,結合每個計算指令的功能和特性,使用另外一種方法得出計算結果,該結果與原版基礎數(shù)學函數(shù)庫實現(xiàn)的方法所計算出的值一致.

圖2 功能等效替換方法示意圖
對于浮點小數(shù)來說,浮點數(shù)的尾數(shù)包含浮點數(shù)的整數(shù)部分和小數(shù)部分,且整數(shù)部分所占的位數(shù)與指數(shù)大小有關.對于雙精度浮點數(shù),若浮點數(shù)指數(shù)的十進制數(shù)值是n,則小數(shù)部分占尾數(shù)的[0,51–n]位,整數(shù)部分占尾數(shù)的[(51–n)+1,51]位.在十進制數(shù)中,若將小數(shù)點后面的數(shù)全部變?yōu)?,則小數(shù)就變成了一個整數(shù).同樣對于二進制數(shù)而言,將小數(shù)點后面的位全部置為0,也就是將雙精度浮點數(shù)的[0,51–n]位置0,則該二進制浮點數(shù)就變成了一個浮點整數(shù),也即實現(xiàn)浮點小數(shù)取整化.其具體的步驟如下:
假設是對雙精度浮點數(shù)f1 進行浮點小數(shù)取整化,
Step 1.將f1 對應的二進制數(shù)傳給t1;生成一個二進制數(shù)t2,其值為0x7FF0000000000000,即52 到63 位為1,其他位為0.
Step 2.將t1 與t2 進行邏輯與運算,右移52 位后,減去1023,得到f1 指數(shù)的十進制數(shù)值n.
Step 3.將52 減去n,計算出浮點數(shù)尾數(shù)的小數(shù)部分占據(jù)的位數(shù).
Step 4.生成一個二進制數(shù)t3,其值的0 到(52–n)位為0,其他位為1.
Step 5.將t3 與t1 進行邏輯與運算,使得浮點數(shù)尾數(shù)中的小數(shù)部分為0;再將t1的值傳給f1.
圖3是按照上述思路,對浮點數(shù)f1(浮點數(shù)對應的二進制數(shù)每一位用x表示)進行浮點小數(shù)取整化的實現(xiàn)過程.

圖3 利用移位、邏輯與指令完成浮點小數(shù)取整化的流程圖
對應的匯編代碼如下:
fimovd $f1,t1
ldi t2,2047(zero)
sll t2,52,t2//對應Step 1
and t1,t2,t2
srl t2,52,t2
ldi t12,1023(zero)
subl t2,t12,t2//對應Step 2
ldi t4,52(zero)
subl t4,t2,t2//對應Step 3
ldi t3,0(zero)
ornot zero,t3,t3
sll t3,t2,t3 //對應Step 4
and t3,t1,t1
ifmovd t1,$f1//對應Step 5
指令說明:fimovd 將雙精度浮點數(shù)從浮點寄存器傳送到整數(shù)寄存器;ldi為立即數(shù)裝載指令;sll為邏輯左移指令;bic 實現(xiàn)邏輯與非運算;and為邏輯與指令;srl為邏輯右移指令;ornot為邏輯或非指令;subl為長字減指令;ifmovd 將整數(shù)寄存器中長字整數(shù)按照雙精度浮點傳送到浮點寄存器.
fcvtdl 指令將雙精度浮點數(shù)轉化成長字,且依據(jù)浮點控制寄存器中的舍入方式控制位來選擇舍入方式.本文在查閱申威1621的指令集手冊后,發(fā)現(xiàn)在硬件的設計上,fcvtdl_z 指令實現(xiàn)了向“0”舍入模式下,將雙精度浮點數(shù)轉換成長字的功能.所以直接用fcvtdl_z 指令即可實現(xiàn)rfpcr、wfpcr和fcvtdl 指令段的功能等效替換.
但是該指令存在一個問題,若雙精度浮點數(shù)是一個浮點小數(shù),而不是浮點整數(shù),那么在轉換后,FPCR 寄存器的非精確異常控制位會被置1,從而產生一個非精確異常問題.因此使用浮點小數(shù)取整法,提前將浮點小數(shù)轉換為浮點整數(shù),即可解決fcvtdl_z 指令產生的非精確異常問題.
申威1621 處理器按照IEEE-754 浮點標準[17]設置了4 種舍入模式,分別是就近舍入、向零舍入、向負無窮大舍入和向正無窮大舍入,其中就近舍入即0 舍1 入.在十進制數(shù)運算的四舍五入中,若有效位后面第一位的值小于5,則舍入的結果與向零舍入的結果相同;若有效位后面第一位的值大于5,則舍入的結果會比向零舍入的結果大1.0 舍1 入法與其類似.在二進制數(shù)運算中,有一個對階的過程,如果參與計算的兩個值階碼不同,就需要將階碼小的值的階碼左移,使其階碼與另一個階碼較大的數(shù)相同,同時尾數(shù)需要右移.在尾數(shù)右移時,若被移去的最高數(shù)值位為0,則舍入,此時舍入的結果與向零舍入的結果相同;若被移去的最高數(shù)值位為1,則在尾數(shù)的末位加1,此時舍入結果的二進制數(shù)值比向零舍入結果的二進制數(shù)值大1.
終點判斷法是在默認舍入模式下,一條運算指令執(zhí)行結束并且計算結果寫入寄存器后,根據(jù)不同的計算指令選擇不同的判斷方法決定計算結果.按照四則運算指令分類,終點判斷法可以分為和判斷法、差判斷法、乘判斷法和除判斷法.
下面分別以加法指令faddd/fadds和除法指令fdivd/fdivs 說明終點判斷法.
1)faddd/fadds 指令
Faddd/fadds 指令實現(xiàn)的是浮點數(shù)加的功能,并將相加的結果舍入到指定的精度,舍入方式根據(jù)浮點控制寄存器中的舍入方式控制位來選擇.其中faddd 指令實現(xiàn)雙精度浮點數(shù)加,fadds 指令實現(xiàn)的是單精度浮點數(shù)加.Faddd 指令和fadds 指令的結果對本文的替換方法沒有影響,因此本文基于faddd 指令分析替換方法.
和判斷法依據(jù)被移去的最高數(shù)值位的值決定運算的結果.當最高數(shù)值位為0 時,則和不變.當最高數(shù)值位為1 時,則將和的二進制數(shù)減1.以加法運算語句faddd$f1,$f2,$f3為例,其實現(xiàn)流程如圖4所示.

圖4 和判斷法實現(xiàn)流程圖
2)fdivd/fdivs 指令
Fdivd/fdivs 指令實現(xiàn)的是浮點數(shù)除法的功能,商舍入到指定精度,舍入方式根據(jù)浮點控制寄存器中的舍入方式控制位來選擇.其中fdivd 指令實現(xiàn)雙精度浮點數(shù)除,fdivs 指令實現(xiàn)的是單精度浮點數(shù)除.Fdivd 指令和fdivs 指令的結果對本文的替換方法沒有影響,因此本文基于fdivd 指令分析.
在十進制運算的四舍五入中,若是“四舍”,則舍入的結果比未舍入的結果小;若是“五入”,則舍入的結果比未舍入的結果大.同樣在二進制運算的0 舍1 入中,若是“0 舍”,則舍入的結果比未舍入的結果小;若是“1入”,則舍入的結果比未舍入的結果大.
商判斷法依據(jù)回乘商的方法決定運算的結果.回乘商是指在不進行舍入情況下,將商與除數(shù)相乘,得到一個積.若商是“0 舍”后得出的結果,則積應比除法語句中的被除數(shù)小,此時商的值不變.若商是“1 入”后得出的結果,則積應比除法語句中的除數(shù)大,此時商對應的二進制值減去1.
以除法運算語句fdivd $f11,$f12,$f13為例,其替換的具體過程如下:
Step 1.就近舍入下,執(zhí)行除法計算,得到商.
Step 2.將商與被除數(shù)相乘得到積,這個積不做任何舍入操作.
Step 3.將積與除數(shù)相減,得到一個差.
Step 4.判斷差是否小于0.若差小于0,則商值不變.若差大于0,則將商對應二進制數(shù)減1.
圖5中,左圖是采用rfpcr和wfpcr 指令設置舍入模式方法實現(xiàn)的指令段,右圖是采用商判斷法實現(xiàn)的指令段.

圖5 商判斷法實現(xiàn)的指令段替換
指令說明:fmsd為雙精度浮點乘減指令,f13 與f12 相乘再減去f11,最后結果寫入f0,且只對最終結果進行舍入;fbgt為浮點數(shù)大于“0”轉移指令.
終點判斷法實現(xiàn)的是在就近舍入模式下計算出向零舍入結果的功能,替換了原版使用rfpcr和wfpcr 指令修改舍入模式的方法,以此提高性能.其中商判斷法是在分析就近舍入和向零舍入的關系后提出的方法,和判斷法是在分析就近舍入和向零舍入的關系以及就近舍入的實現(xiàn)方式后提出的方法.由于申威1621 處理器的舍入模式是按照IEEE-754 浮點標準實現(xiàn)的,因此終點判斷法不僅可以應用于申威1621 處理器,對于其他滿足IEEE-754 浮點標準的處理器都可適用.同時該方法主要針對四則運算提出的,本文目前提出了和判斷法和商判斷法,同樣對于減法運算和乘法運算也可以應用終點判斷法實現(xiàn)在就近舍入模式下計算出向零舍入結果的功能,相對應的方法可以命名為差判斷法與積判斷法.
為了驗證本文方法的有效性,以申威1621 處理器為實驗平臺.實驗平臺相關配置信息如表1所示.

表1 申威1621 實驗平臺
實驗從正確性和性能兩方面進行測試.正確性測試用Glibc 測試套件分別對替換前和替換后的計算結果進行對比;由于部分函數(shù)需要替換多種指令,因此性能測試綜合3 種替換指令計算對函數(shù)的整體性能提升.性能提升的計算公式如下:
性能提升=(替換前節(jié)拍?替換后節(jié)拍)/替換前節(jié)拍×100%
本文用glibc 測試套件作為測試用例,替換前與替換后的計算結果保持一致.測試結果表明,替換后與替換前的功能是等效的.
本文性能測試通過rtc (讀計時器TC)指令計算被測函數(shù)的運行節(jié)拍數(shù)來衡量性能的好壞.為保證性能測試能夠覆蓋函數(shù)的主要分支,主要采用0~1 區(qū)間內均勻分布的隨機浮點數(shù)作為測試數(shù)據(jù)集,測試基礎函數(shù)庫運行兩百次的節(jié)拍數(shù).為了減小偏差較大的測試數(shù)據(jù)對性能測試結果的影響,采用4D 檢測法[18]對函數(shù)運行節(jié)拍數(shù)進行處理并求算術平均值.測試結果如圖6所示.圖7是每個函數(shù)的性能提升百分比.
圖6的測試結果表明,本文提出的指令段功能等效替換方法有效地解決了基礎數(shù)學函數(shù)庫中因rfpcr和wfpcr 指令導致的斷流水問題,與替換前的函數(shù)性能相比,替換后的每個函數(shù)性能都有不同程度的提升.

圖6 替換前后性能對比
從圖7的結果來看,可以將性能提升百分比分為兩種情況:

圖7 性能提升百分比
1)lround、remquo和remainder 等函數(shù)性能提升百分比較高.在這些函數(shù)中,同時應用了浮點小數(shù)取整法和終點判斷法,并且remquo和remainde 函數(shù)多次應用兩種替換方法,使得性能提升比較明顯.
2)tan、cot和lgamma 等函數(shù)性能提升百分比較低.這是因為tan和cot 函數(shù)只應用了終點判斷法中的和判斷法,并且只替換了一次.lgamma 函數(shù)應用了一次浮點小數(shù)取整法且多次應用了終點判斷法,但是該函數(shù)分支較多,替換指令都處于不同的分支上,因此性能提升較低.
綜合以上兩種情況的分析,可以得出性能提升效果不同的主要原因有以下幾種:1)部分函數(shù)需要應用兩種替換方法,部分函數(shù)只需要應用一種替換方法.2)有的函數(shù)需要替換多次,有的函數(shù)只需替換一次;3)有的替換指令分布在熱路徑[19]的分支上,有的替換指令是在函數(shù)較少使用的路徑上.
基礎數(shù)學庫在科學計算中發(fā)揮著舉足輕重的作用,其性能直接影響著科學計算程序的執(zhí)行效率.關于現(xiàn)版本國產申威基礎函數(shù)庫因rfpcr、wfpcr 指令和計算指令組成的指令段導致的流水線中斷問題,本文提出指令段功能等效替換方法.針對fcvtdl 指令提出了浮點小數(shù)取整化方法,針對faddd/fadds 指令和fdivd/fdivs指令提出了終點判斷法.實驗結果表明,本文提出的方法有效的解決了rfprc和wfpcr 指令斷流水問題,使函數(shù)性能平均提升27.83%.下一步將充分利用流水線的硬件特性,深度挖掘流水線的性能優(yōu)勢,對指令流水線進行深入優(yōu)化,進一步提高函數(shù)性能.