吳 凡,王 磊
1(中原工學(xué)院 計(jì)算機(jī)學(xué)院,鄭州 450007)
2(中原工學(xué)院 前沿信息技術(shù)研究院,鄭州 450007)
高性能計(jì)算機(jī)是國(guó)家綜合國(guó)力的重要體現(xiàn),對(duì)現(xiàn)代社會(huì)的科學(xué)研究、社會(huì)服務(wù)、經(jīng)濟(jì)活動(dòng)而言,已成為不可或缺的戰(zhàn)略工具,全球眾多國(guó)家都極為重視高性能計(jì)算能力的建設(shè)與發(fā)展[1].基礎(chǔ)數(shù)學(xué)函數(shù)庫(kù)[2]作為處理器配套軟件的重要組成部分,是高性能計(jì)算機(jī)平臺(tái)上各領(lǐng)域應(yīng)用軟件開發(fā)必需的最基礎(chǔ)、最核心的軟件之一.而基礎(chǔ)數(shù)學(xué)庫(kù)的實(shí)現(xiàn)與硬件平臺(tái)密切相關(guān),Intel、AMD 等主流CPU 廠商都推出了與其平臺(tái)相對(duì)應(yīng)數(shù)學(xué)庫(kù)軟件.隨著高性能計(jì)算需求的日益增大,越來越多的應(yīng)用開始部署在以申威處理器為代表的國(guó)產(chǎn)高性能計(jì)算平臺(tái)上[3].申威1621 處理器是一款具有我國(guó)自主知識(shí)產(chǎn)權(quán)的高性能處理器,針對(duì)該處理器,目前已經(jīng)推出了與之對(duì)應(yīng)的國(guó)產(chǎn)數(shù)學(xué)庫(kù)軟件,并且做了相對(duì)應(yīng)的優(yōu)化,達(dá)到了工程的需求,其性能較之GNU的glibc 數(shù)學(xué)庫(kù)也有較大的優(yōu)勢(shì).
從算法優(yōu)化角度,文獻(xiàn)[4]在分析現(xiàn)有算法的基礎(chǔ)上,提出初等函數(shù)算法設(shè)計(jì)原則和兩種算法設(shè)計(jì)模式,使得主核函數(shù)的性能平均提高52.4%,從核函數(shù)的性能平均提高75.3%,并且精度與GNU 總體保持一致.文獻(xiàn)[5]針對(duì)超越函數(shù)的實(shí)現(xiàn)繁瑣易錯(cuò)、應(yīng)用精度需求各異等問題,提出并實(shí)現(xiàn)兼顧通用性和函數(shù)數(shù)學(xué)特性的可變精度超越函數(shù)算法.該算法不僅能夠生成常見超越函數(shù)的不同精度版本的函數(shù)代碼,且相對(duì)標(biāo)準(zhǔn)數(shù)學(xué)庫(kù)超越函數(shù)具有性能優(yōu)勢(shì).
從訪存優(yōu)化角度,文獻(xiàn)[6]為有效解決超越函數(shù)查表與多項(xiàng)式結(jié)合算法的“存儲(chǔ)墻”問題,提出基于數(shù)據(jù)表精簡(jiǎn)算法的超越函數(shù)訪存優(yōu)化方法,使得函數(shù)性能平均提升55.06%.文獻(xiàn)[7]提出了一種基于訪存指令的調(diào)度策略,即將訪存延遲有效地隱藏于計(jì)算延遲中,平均提高函數(shù)性能16.08%.文獻(xiàn)[8]提出一種基于多級(jí)分層策略的寄存器分配策略,合理地使用寄存器資源,減少寄存器分配過程中產(chǎn)生的溢出,將數(shù)學(xué)庫(kù)中的函數(shù)性能提高6%以上.文獻(xiàn)[9]針對(duì)基礎(chǔ)數(shù)學(xué)庫(kù)中的寄存器分配特點(diǎn),利用最常用情況執(zhí)行時(shí)間(Most-Case Execution Time,MCET)模型對(duì)經(jīng)典的線性掃描寄存器分配算法進(jìn)行了擴(kuò)展,將變量溢出過程分配到非常用路徑上,從而減少全局的寄存器溢出開銷,提高數(shù)學(xué)庫(kù)的性能.
從SIMD 向量化角度,文獻(xiàn)[10]結(jié)合三角函數(shù)、反三角函數(shù)、指數(shù)函數(shù)和對(duì)數(shù)函數(shù)研究出一種高效向量化算法,并在申威26010 處理器上完成擴(kuò)展函數(shù)庫(kù)實(shí)現(xiàn),在性能上與Intel VML 數(shù)學(xué)庫(kù)相比,各函數(shù)的平均加速比均達(dá)到1.1 以上.文獻(xiàn)[11]針對(duì)SIMD 指令缺少和部分指令性能較低的問題,提出了一種基于SIMD擴(kuò)展指令的等價(jià)替換方法,使得函數(shù)庫(kù)性能提升13%左右.文獻(xiàn)[12]針對(duì)多數(shù)函數(shù)代碼分支多和SIMD 指令不完備的問題,提出了向量數(shù)學(xué)庫(kù)的向量化方法,通過確定核心代碼段、數(shù)據(jù)預(yù)處理過程向量化及指令向量化3個(gè)步驟,使exp,pow,log10 等典型函數(shù)的性能平均提高了24.2%.文獻(xiàn)[13]提出一種SIMD 對(duì)齊的優(yōu)化方法,并采用一套系統(tǒng)的方法來處理絕對(duì)地址和相對(duì)地址訪存方案,與數(shù)學(xué)函數(shù)的非對(duì)齊存儲(chǔ)器訪問方案相比,提升函數(shù)性能22.3%.文獻(xiàn)[14]提出一種向量寄存器部分?jǐn)?shù)據(jù)重用的方法,利用向量寄存器的部分元素來減少寄存器壓力、冗余計(jì)算和內(nèi)存訪問,與打包解包方法相比,該方法使得函數(shù)性能平均加速14.19%.
文獻(xiàn)[15]從基本塊向量化、指令替換、訪存、指令流水線等多個(gè)方面展開優(yōu)化,在保證數(shù)學(xué)庫(kù)精度的同時(shí),有效提高了函數(shù)的性能.
以上文獻(xiàn)提出的優(yōu)化方法都對(duì)基礎(chǔ)數(shù)學(xué)函數(shù)庫(kù)性能有一定的提升,但是還沒有文獻(xiàn)針對(duì)rfpcr和wfpcr指令作出優(yōu)化處理.在現(xiàn)版本基礎(chǔ)函數(shù)庫(kù)的實(shí)現(xiàn)中,tan、cot、remainder、fmodf、lround、modf、remquof、trunc 等函數(shù)都使用了rfpcr 指令和wfpcr 指令,該指令會(huì)導(dǎo)致流水線中斷,嚴(yán)重降低了函數(shù)庫(kù)的性能.因此本文在分析每個(gè)函數(shù)功能和指令特性后提出指令段功能等效替換方法,提升函數(shù)性能.
本文第1 節(jié)詳細(xì)介紹指令替換方法;第2 節(jié)給出實(shí)驗(yàn)結(jié)果及分析;最后對(duì)全文進(jìn)行總結(jié).
在流水線技術(shù)中,指令之間的相關(guān)性會(huì)在流水線中引起沖突,沖突會(huì)導(dǎo)致流水線阻塞,而流水線阻塞會(huì)降低流水線的效率[16].除了指令之間的相關(guān)性會(huì)導(dǎo)致流水線的阻塞,還有一些特殊的指令由于指令的功能需求,會(huì)直接阻斷流水線,比如rfpcr和wfpcr 指令.浮點(diǎn)控制寄存器(Floating-Point Control Register,FPCR)是浮點(diǎn)運(yùn)算控制和狀態(tài)寄存器,其內(nèi)容用于控制浮點(diǎn)運(yùn)算的舍入方式、異常屏蔽等,并記錄浮點(diǎn)運(yùn)算的異常狀態(tài).rfpcr 指令的功能是讀浮點(diǎn)控制寄存器的值,wfpcr 指令向浮點(diǎn)控制寄存器寫入新值.
當(dāng)譯碼器識(shí)別出rfpcr 指令時(shí),為保證rfpcr 指令獲得浮點(diǎn)控制寄存器的最新內(nèi)容,rfpcr 指令進(jìn)入浮點(diǎn)指令隊(duì)列發(fā)射的條件之一是前面的所有指令已執(zhí)行完畢并退出流水.
當(dāng)譯碼器識(shí)別出wfpcr 指令時(shí),為保證wfpcr 指令修改FPCR 寄存器后能影響后繼的浮點(diǎn)指令,在指令流水線的發(fā)射站臺(tái)設(shè)置一位CSR 記分板,wfpcr 指令從指令隊(duì)列發(fā)射的條件之一是該記分板位已被清除,該指令發(fā)射時(shí),設(shè)置該記分板位為“1”,禁止發(fā)射隊(duì)列發(fā)射后繼的指令,直到wfpcr 指令完成并退出后,清除該記分板位.
在申威基礎(chǔ)數(shù)學(xué)庫(kù)的實(shí)現(xiàn)中,rfpcr和wfpcr 會(huì)與移位、加減計(jì)算等指令組成一個(gè)指令段,指令段的主要功能是使得計(jì)算指令在向零舍入模式下執(zhí)行.圖1是指令段偽代碼.
圖1 指令段偽代碼
在申威1621 處理器中,默認(rèn)的舍入模式是就近舍入.為了實(shí)現(xiàn)在向零舍入模式下執(zhí)行計(jì)算指令,需要在計(jì)算前用wfpcr 指令將舍入模式修改為向零舍入,即向FPCR 寄存器中寫入新值,該值的舍入模式控制位為向零舍入,計(jì)算完成后再用wfpcr 指令將舍入模式還原.
在有需要實(shí)現(xiàn)上述指令段功能的函數(shù)中,計(jì)算指令有3 種,分別是浮點(diǎn)轉(zhuǎn)整數(shù)指令(fcvtdl)、加法指令(faddd/fadds)和除法指令(fdivd/fdivs).如圖2所示,本文在不改變這些指令段正確性的前提下,使用等效的方法實(shí)現(xiàn)相同的功能.在執(zhí)行完上述3 種計(jì)算指令后,會(huì)得出一個(gè)值并被寫入到寄存器中.所謂功能等效替換方法是指在不使用rfpcr和wfpcr 指令的前提下,結(jié)合每個(gè)計(jì)算指令的功能和特性,使用另外一種方法得出計(jì)算結(jié)果,該結(jié)果與原版基礎(chǔ)數(shù)學(xué)函數(shù)庫(kù)實(shí)現(xiàn)的方法所計(jì)算出的值一致.
圖2 功能等效替換方法示意圖
對(duì)于浮點(diǎn)小數(shù)來說,浮點(diǎn)數(shù)的尾數(shù)包含浮點(diǎn)數(shù)的整數(shù)部分和小數(shù)部分,且整數(shù)部分所占的位數(shù)與指數(shù)大小有關(guān).對(duì)于雙精度浮點(diǎn)數(shù),若浮點(diǎn)數(shù)指數(shù)的十進(jìn)制數(shù)值是n,則小數(shù)部分占尾數(shù)的[0,51–n]位,整數(shù)部分占尾數(shù)的[(51–n)+1,51]位.在十進(jìn)制數(shù)中,若將小數(shù)點(diǎn)后面的數(shù)全部變?yōu)?,則小數(shù)就變成了一個(gè)整數(shù).同樣對(duì)于二進(jìn)制數(shù)而言,將小數(shù)點(diǎn)后面的位全部置為0,也就是將雙精度浮點(diǎn)數(shù)的[0,51–n]位置0,則該二進(jìn)制浮點(diǎn)數(shù)就變成了一個(gè)浮點(diǎn)整數(shù),也即實(shí)現(xiàn)浮點(diǎn)小數(shù)取整化.其具體的步驟如下:
假設(shè)是對(duì)雙精度浮點(diǎn)數(shù)f1 進(jìn)行浮點(diǎn)小數(shù)取整化,
Step 1.將f1 對(duì)應(yīng)的二進(jìn)制數(shù)傳給t1;生成一個(gè)二進(jìn)制數(shù)t2,其值為0x7FF0000000000000,即52 到63 位為1,其他位為0.
Step 2.將t1 與t2 進(jìn)行邏輯與運(yùn)算,右移52 位后,減去1023,得到f1 指數(shù)的十進(jìn)制數(shù)值n.
Step 3.將52 減去n,計(jì)算出浮點(diǎn)數(shù)尾數(shù)的小數(shù)部分占據(jù)的位數(shù).
Step 4.生成一個(gè)二進(jìn)制數(shù)t3,其值的0 到(52–n)位為0,其他位為1.
Step 5.將t3 與t1 進(jìn)行邏輯與運(yùn)算,使得浮點(diǎn)數(shù)尾數(shù)中的小數(shù)部分為0;再將t1的值傳給f1.
圖3是按照上述思路,對(duì)浮點(diǎn)數(shù)f1(浮點(diǎn)數(shù)對(duì)應(yīng)的二進(jìn)制數(shù)每一位用x表示)進(jìn)行浮點(diǎn)小數(shù)取整化的實(shí)現(xiàn)過程.
圖3 利用移位、邏輯與指令完成浮點(diǎn)小數(shù)取整化的流程圖
對(duì)應(yīng)的匯編代碼如下:
fimovd $f1,t1
ldi t2,2047(zero)
sll t2,52,t2//對(duì)應(yīng)Step 1
and t1,t2,t2
srl t2,52,t2
ldi t12,1023(zero)
subl t2,t12,t2//對(duì)應(yīng)Step 2
ldi t4,52(zero)
subl t4,t2,t2//對(duì)應(yīng)Step 3
ldi t3,0(zero)
ornot zero,t3,t3
sll t3,t2,t3 //對(duì)應(yīng)Step 4
and t3,t1,t1
ifmovd t1,$f1//對(duì)應(yīng)Step 5
指令說明:fimovd 將雙精度浮點(diǎn)數(shù)從浮點(diǎn)寄存器傳送到整數(shù)寄存器;ldi為立即數(shù)裝載指令;sll為邏輯左移指令;bic 實(shí)現(xiàn)邏輯與非運(yùn)算;and為邏輯與指令;srl為邏輯右移指令;ornot為邏輯或非指令;subl為長(zhǎng)字減指令;ifmovd 將整數(shù)寄存器中長(zhǎng)字整數(shù)按照雙精度浮點(diǎn)傳送到浮點(diǎn)寄存器.
fcvtdl 指令將雙精度浮點(diǎn)數(shù)轉(zhuǎn)化成長(zhǎng)字,且依據(jù)浮點(diǎn)控制寄存器中的舍入方式控制位來選擇舍入方式.本文在查閱申威1621的指令集手冊(cè)后,發(fā)現(xiàn)在硬件的設(shè)計(jì)上,fcvtdl_z 指令實(shí)現(xiàn)了向“0”舍入模式下,將雙精度浮點(diǎn)數(shù)轉(zhuǎn)換成長(zhǎng)字的功能.所以直接用fcvtdl_z 指令即可實(shí)現(xiàn)rfpcr、wfpcr和fcvtdl 指令段的功能等效替換.
但是該指令存在一個(gè)問題,若雙精度浮點(diǎn)數(shù)是一個(gè)浮點(diǎn)小數(shù),而不是浮點(diǎn)整數(shù),那么在轉(zhuǎn)換后,FPCR 寄存器的非精確異??刂莆粫?huì)被置1,從而產(chǎn)生一個(gè)非精確異常問題.因此使用浮點(diǎn)小數(shù)取整法,提前將浮點(diǎn)小數(shù)轉(zhuǎn)換為浮點(diǎn)整數(shù),即可解決fcvtdl_z 指令產(chǎn)生的非精確異常問題.
申威1621 處理器按照IEEE-754 浮點(diǎn)標(biāo)準(zhǔn)[17]設(shè)置了4 種舍入模式,分別是就近舍入、向零舍入、向負(fù)無窮大舍入和向正無窮大舍入,其中就近舍入即0 舍1 入.在十進(jìn)制數(shù)運(yùn)算的四舍五入中,若有效位后面第一位的值小于5,則舍入的結(jié)果與向零舍入的結(jié)果相同;若有效位后面第一位的值大于5,則舍入的結(jié)果會(huì)比向零舍入的結(jié)果大1.0 舍1 入法與其類似.在二進(jìn)制數(shù)運(yùn)算中,有一個(gè)對(duì)階的過程,如果參與計(jì)算的兩個(gè)值階碼不同,就需要將階碼小的值的階碼左移,使其階碼與另一個(gè)階碼較大的數(shù)相同,同時(shí)尾數(shù)需要右移.在尾數(shù)右移時(shí),若被移去的最高數(shù)值位為0,則舍入,此時(shí)舍入的結(jié)果與向零舍入的結(jié)果相同;若被移去的最高數(shù)值位為1,則在尾數(shù)的末位加1,此時(shí)舍入結(jié)果的二進(jìn)制數(shù)值比向零舍入結(jié)果的二進(jìn)制數(shù)值大1.
終點(diǎn)判斷法是在默認(rèn)舍入模式下,一條運(yùn)算指令執(zhí)行結(jié)束并且計(jì)算結(jié)果寫入寄存器后,根據(jù)不同的計(jì)算指令選擇不同的判斷方法決定計(jì)算結(jié)果.按照四則運(yùn)算指令分類,終點(diǎn)判斷法可以分為和判斷法、差判斷法、乘判斷法和除判斷法.
下面分別以加法指令faddd/fadds和除法指令fdivd/fdivs 說明終點(diǎn)判斷法.
1)faddd/fadds 指令
Faddd/fadds 指令實(shí)現(xiàn)的是浮點(diǎn)數(shù)加的功能,并將相加的結(jié)果舍入到指定的精度,舍入方式根據(jù)浮點(diǎn)控制寄存器中的舍入方式控制位來選擇.其中faddd 指令實(shí)現(xiàn)雙精度浮點(diǎn)數(shù)加,fadds 指令實(shí)現(xiàn)的是單精度浮點(diǎn)數(shù)加.Faddd 指令和fadds 指令的結(jié)果對(duì)本文的替換方法沒有影響,因此本文基于faddd 指令分析替換方法.
和判斷法依據(jù)被移去的最高數(shù)值位的值決定運(yùn)算的結(jié)果.當(dāng)最高數(shù)值位為0 時(shí),則和不變.當(dāng)最高數(shù)值位為1 時(shí),則將和的二進(jìn)制數(shù)減1.以加法運(yùn)算語句faddd$f1,$f2,$f3為例,其實(shí)現(xiàn)流程如圖4所示.
圖4 和判斷法實(shí)現(xiàn)流程圖
2)fdivd/fdivs 指令
Fdivd/fdivs 指令實(shí)現(xiàn)的是浮點(diǎn)數(shù)除法的功能,商舍入到指定精度,舍入方式根據(jù)浮點(diǎn)控制寄存器中的舍入方式控制位來選擇.其中fdivd 指令實(shí)現(xiàn)雙精度浮點(diǎn)數(shù)除,fdivs 指令實(shí)現(xiàn)的是單精度浮點(diǎn)數(shù)除.Fdivd 指令和fdivs 指令的結(jié)果對(duì)本文的替換方法沒有影響,因此本文基于fdivd 指令分析.
在十進(jìn)制運(yùn)算的四舍五入中,若是“四舍”,則舍入的結(jié)果比未舍入的結(jié)果小;若是“五入”,則舍入的結(jié)果比未舍入的結(jié)果大.同樣在二進(jìn)制運(yùn)算的0 舍1 入中,若是“0 舍”,則舍入的結(jié)果比未舍入的結(jié)果小;若是“1入”,則舍入的結(jié)果比未舍入的結(jié)果大.
商判斷法依據(jù)回乘商的方法決定運(yùn)算的結(jié)果.回乘商是指在不進(jìn)行舍入情況下,將商與除數(shù)相乘,得到一個(gè)積.若商是“0 舍”后得出的結(jié)果,則積應(yīng)比除法語句中的被除數(shù)小,此時(shí)商的值不變.若商是“1 入”后得出的結(jié)果,則積應(yīng)比除法語句中的除數(shù)大,此時(shí)商對(duì)應(yīng)的二進(jìn)制值減去1.
以除法運(yùn)算語句fdivd $f11,$f12,$f13為例,其替換的具體過程如下:
Step 1.就近舍入下,執(zhí)行除法計(jì)算,得到商.
Step 2.將商與被除數(shù)相乘得到積,這個(gè)積不做任何舍入操作.
Step 3.將積與除數(shù)相減,得到一個(gè)差.
Step 4.判斷差是否小于0.若差小于0,則商值不變.若差大于0,則將商對(duì)應(yīng)二進(jìn)制數(shù)減1.
圖5中,左圖是采用rfpcr和wfpcr 指令設(shè)置舍入模式方法實(shí)現(xiàn)的指令段,右圖是采用商判斷法實(shí)現(xiàn)的指令段.
圖5 商判斷法實(shí)現(xiàn)的指令段替換
指令說明:fmsd為雙精度浮點(diǎn)乘減指令,f13 與f12 相乘再減去f11,最后結(jié)果寫入f0,且只對(duì)最終結(jié)果進(jìn)行舍入;fbgt為浮點(diǎn)數(shù)大于“0”轉(zhuǎn)移指令.
終點(diǎn)判斷法實(shí)現(xiàn)的是在就近舍入模式下計(jì)算出向零舍入結(jié)果的功能,替換了原版使用rfpcr和wfpcr 指令修改舍入模式的方法,以此提高性能.其中商判斷法是在分析就近舍入和向零舍入的關(guān)系后提出的方法,和判斷法是在分析就近舍入和向零舍入的關(guān)系以及就近舍入的實(shí)現(xiàn)方式后提出的方法.由于申威1621 處理器的舍入模式是按照IEEE-754 浮點(diǎn)標(biāo)準(zhǔn)實(shí)現(xiàn)的,因此終點(diǎn)判斷法不僅可以應(yīng)用于申威1621 處理器,對(duì)于其他滿足IEEE-754 浮點(diǎn)標(biāo)準(zhǔn)的處理器都可適用.同時(shí)該方法主要針對(duì)四則運(yùn)算提出的,本文目前提出了和判斷法和商判斷法,同樣對(duì)于減法運(yùn)算和乘法運(yùn)算也可以應(yīng)用終點(diǎn)判斷法實(shí)現(xiàn)在就近舍入模式下計(jì)算出向零舍入結(jié)果的功能,相對(duì)應(yīng)的方法可以命名為差判斷法與積判斷法.
為了驗(yàn)證本文方法的有效性,以申威1621 處理器為實(shí)驗(yàn)平臺(tái).實(shí)驗(yàn)平臺(tái)相關(guān)配置信息如表1所示.
表1 申威1621 實(shí)驗(yàn)平臺(tái)
實(shí)驗(yàn)從正確性和性能兩方面進(jìn)行測(cè)試.正確性測(cè)試用Glibc 測(cè)試套件分別對(duì)替換前和替換后的計(jì)算結(jié)果進(jìn)行對(duì)比;由于部分函數(shù)需要替換多種指令,因此性能測(cè)試綜合3 種替換指令計(jì)算對(duì)函數(shù)的整體性能提升.性能提升的計(jì)算公式如下:
性能提升=(替換前節(jié)拍?替換后節(jié)拍)/替換前節(jié)拍×100%
本文用glibc 測(cè)試套件作為測(cè)試用例,替換前與替換后的計(jì)算結(jié)果保持一致.測(cè)試結(jié)果表明,替換后與替換前的功能是等效的.
本文性能測(cè)試通過rtc (讀計(jì)時(shí)器TC)指令計(jì)算被測(cè)函數(shù)的運(yùn)行節(jié)拍數(shù)來衡量性能的好壞.為保證性能測(cè)試能夠覆蓋函數(shù)的主要分支,主要采用0~1 區(qū)間內(nèi)均勻分布的隨機(jī)浮點(diǎn)數(shù)作為測(cè)試數(shù)據(jù)集,測(cè)試基礎(chǔ)函數(shù)庫(kù)運(yùn)行兩百次的節(jié)拍數(shù).為了減小偏差較大的測(cè)試數(shù)據(jù)對(duì)性能測(cè)試結(jié)果的影響,采用4D 檢測(cè)法[18]對(duì)函數(shù)運(yùn)行節(jié)拍數(shù)進(jìn)行處理并求算術(shù)平均值.測(cè)試結(jié)果如圖6所示.圖7是每個(gè)函數(shù)的性能提升百分比.
圖6的測(cè)試結(jié)果表明,本文提出的指令段功能等效替換方法有效地解決了基礎(chǔ)數(shù)學(xué)函數(shù)庫(kù)中因rfpcr和wfpcr 指令導(dǎo)致的斷流水問題,與替換前的函數(shù)性能相比,替換后的每個(gè)函數(shù)性能都有不同程度的提升.
圖6 替換前后性能對(duì)比
從圖7的結(jié)果來看,可以將性能提升百分比分為兩種情況:
圖7 性能提升百分比
1)lround、remquo和remainder 等函數(shù)性能提升百分比較高.在這些函數(shù)中,同時(shí)應(yīng)用了浮點(diǎn)小數(shù)取整法和終點(diǎn)判斷法,并且remquo和remainde 函數(shù)多次應(yīng)用兩種替換方法,使得性能提升比較明顯.
2)tan、cot和lgamma 等函數(shù)性能提升百分比較低.這是因?yàn)閠an和cot 函數(shù)只應(yīng)用了終點(diǎn)判斷法中的和判斷法,并且只替換了一次.lgamma 函數(shù)應(yīng)用了一次浮點(diǎn)小數(shù)取整法且多次應(yīng)用了終點(diǎn)判斷法,但是該函數(shù)分支較多,替換指令都處于不同的分支上,因此性能提升較低.
綜合以上兩種情況的分析,可以得出性能提升效果不同的主要原因有以下幾種:1)部分函數(shù)需要應(yīng)用兩種替換方法,部分函數(shù)只需要應(yīng)用一種替換方法.2)有的函數(shù)需要替換多次,有的函數(shù)只需替換一次;3)有的替換指令分布在熱路徑[19]的分支上,有的替換指令是在函數(shù)較少使用的路徑上.
基礎(chǔ)數(shù)學(xué)庫(kù)在科學(xué)計(jì)算中發(fā)揮著舉足輕重的作用,其性能直接影響著科學(xué)計(jì)算程序的執(zhí)行效率.關(guān)于現(xiàn)版本國(guó)產(chǎn)申威基礎(chǔ)函數(shù)庫(kù)因rfpcr、wfpcr 指令和計(jì)算指令組成的指令段導(dǎo)致的流水線中斷問題,本文提出指令段功能等效替換方法.針對(duì)fcvtdl 指令提出了浮點(diǎn)小數(shù)取整化方法,針對(duì)faddd/fadds 指令和fdivd/fdivs指令提出了終點(diǎn)判斷法.實(shí)驗(yàn)結(jié)果表明,本文提出的方法有效的解決了rfprc和wfpcr 指令斷流水問題,使函數(shù)性能平均提升27.83%.下一步將充分利用流水線的硬件特性,深度挖掘流水線的性能優(yōu)勢(shì),對(duì)指令流水線進(jìn)行深入優(yōu)化,進(jìn)一步提高函數(shù)性能.