陳金娥 黃勝兵
摘 要:Open64是一個(gè)擁有GNU通用公共許可證的開(kāi)源高性能編譯器,設(shè)計(jì)結(jié)構(gòu)好,分析優(yōu)化全面,是編譯器高級(jí)研究的理想平臺(tái)。本文針對(duì)BWDSP處理器所提供的高效特殊運(yùn)算指令,在Open64基礎(chǔ)上研究并實(shí)現(xiàn)了面向BWDSP中的特殊指令合成策略。該策略通過(guò)擴(kuò)展并重定向編譯器后端模塊,能夠充分地利用BWDSP中的復(fù)數(shù)指令、累加指令、乘累加指令和平方和指令等特殊指令。實(shí)驗(yàn)結(jié)果表明,本文提出的特殊指令合成策略能夠很大程度上提高程序的性能。
關(guān)鍵詞:Open64編譯器;特殊指令合成;超長(zhǎng)指令字
中圖分類(lèi)號(hào):TP311.54 文獻(xiàn)標(biāo)識(shí)碼:A
Abstract:As an open-source high-performance compiler with GNU General Public License (GPL),Open64 is a good compiler for advanced research.Aiming at the special instructions provided by BWDSP,the paper researches and implements the special instruction synthesis strategy based on Open64.Extending and redirecting the compiler back-end,the strategy fully utilizes the special instructions of BWDSP,including complex,accumulation,multiply accumulation and sum-of-squares operations.The experimental results show that the program performance can be greatly improved with this special instruction synthesis strategy proposed in this paper.
Keywords:Open64 compiler;special instruction synthesis;Very Long Instruction Word (VLIW)
1 引言(Introduction)
BWDSP是一款采用分簇架構(gòu)、支持SIMD的16發(fā)射的VLIW數(shù)字信號(hào)處理器。根據(jù)其面向的計(jì)算領(lǐng)域提供了大量的特殊指令[1,2],包括復(fù)數(shù)指令、累加指令、乘累加指令和平方和指令等。
本文以O(shè)pen64作為面向BWDSP體系結(jié)構(gòu)的編譯器研究框架。Open64是一個(gè)運(yùn)行在Linux下的C、C++、Fortran編譯器基礎(chǔ)設(shè)施[3],其前端將源程序轉(zhuǎn)化為中間表示W(wǎng)HIRL,后端讀入中間語(yǔ)言WHIRL,經(jīng)過(guò)翻譯生成CG階段(Code Generation)的中間表示(CGIR),再經(jīng)過(guò)一系列優(yōu)化,最終CGIR經(jīng)過(guò)代碼輸出生成匯編程序[4]。Open64編譯器的架構(gòu)如圖1所示。
本文主要解決如何將高級(jí)程序語(yǔ)言代碼通過(guò)編譯器直接生成BWDSP指令系統(tǒng)中的特殊指令,并在Open64編譯基礎(chǔ)設(shè)施上提出并實(shí)現(xiàn)了面向BWDSP體系結(jié)構(gòu)的特殊指令合成策略,能夠較好地利用BWDSP的特殊指令來(lái)提高應(yīng)用程序的性能。
2 特殊指令合成策略(Special instruction synthesis strategy)
2.1 復(fù)數(shù)指令合成
原Open64編譯基礎(chǔ)設(shè)施內(nèi)部提供了浮點(diǎn)復(fù)數(shù)類(lèi)型,因此編譯器前端能夠直接處理浮點(diǎn)復(fù)數(shù)類(lèi)型源代碼。然而編譯器后端為了能夠生成處理復(fù)數(shù)形式的匯編代碼,在中間語(yǔ)言WHIRL的Middle WHIRL上又將復(fù)數(shù)類(lèi)型C4下降為Float類(lèi)型來(lái)進(jìn)行處理。為了充分利用BWDSP處理器的特點(diǎn),必須將復(fù)數(shù)類(lèi)型到浮點(diǎn)類(lèi)型的轉(zhuǎn)換過(guò)程進(jìn)行屏蔽,使其直接處理復(fù)數(shù)類(lèi)型的中間語(yǔ)言WHIRL,指令如下所示(以復(fù)數(shù)加法為例):
C4C4LDID 0 <2,1,a> T<17,.predef_C4,4>
C4C4LDID 0 <2,2,b> T<17,.predef_C4,4>
C4ADD
C4STID 0 <2,3,c> T<17,.predef_C4,4> {line: 1/6}
這種帶復(fù)數(shù)類(lèi)型C4的中間語(yǔ)言WHIRL在后端的代碼生成階段(CG_Generate_Code)直接將其注釋為BWDSP體系結(jié)構(gòu)中的復(fù)數(shù)指令。
2.2 累加和乘累加類(lèi)指令合成
原Open64編譯器基礎(chǔ)設(shè)施中累加和乘累加類(lèi)指令通常是由數(shù)條匯編指令組成,如下所示(以c+=a*b為例):
I4I4LDID 0 <2,1,a> T<4,.predef_I4,1>
I4I4LDID 0 <2,2,b> T<4,.predef_I4,1>
I4MPY
I4I4LDID 0 <2,3,c> T<4,.predef_I4,1>
I4ADD
I4STID 0 <2,3,c> T<4,.predef_I4,1> {line: 1/6}
面向BWDSP的Open64編譯器在中間語(yǔ)言WHIRL上生成的累加操作直接進(jìn)行指令注釋?zhuān)⒉恍枰谄渲胁迦胂鄳?yīng)的特殊規(guī)約處理指令。如下所示:
I4I4LDID 0 <2,1,a> T<4,.predef_I4,1>
I4I4LDID 0 <2,2,b> T<4,.predef_I4,1>
I4REDUCE_ADD
I4STID 0 <2,3,c> T<4,.predef_I4,1>
該類(lèi)指令與復(fù)數(shù)指令的處理類(lèi)似,將生成帶累加操作的中間語(yǔ)言WHIRL,在后端代碼生成階段直接將其注釋為BWDSP體系結(jié)構(gòu)中的累加和乘累加類(lèi)指令。
2.3 平方和類(lèi)指令合成
平方和類(lèi)指令合成與上述的兩類(lèi)特殊指令合成策略有所不同。由于Open64編譯器基礎(chǔ)設(shè)施中并沒(méi)有提供相應(yīng)的平方和類(lèi)指令表示,因此需要在中間語(yǔ)言WHIRL中增加相應(yīng)的WHIRL操作。面向BWDSP的Open64編譯器中的平方和類(lèi)特殊指令的合成策略框架如圖2所示。
例如,平方和操作(例如c=a*a+b*b)在中間語(yǔ)言WHIRL上合成的中間表示如下所示:
I4I4LDID 0 <2,1,a> T<4,.predef_I4,1>
I4I4LDID 0 <2,2,b> T<4,.predef_I4,1>
I4SQURA
I4STID 0 <2,3,c> T<4,.predef_I4,1> {line: 1/6}
3 代碼生成內(nèi)部模塊改進(jìn)(Improvement of theinternal modules in code generation)
面向BWDSP的Open64編譯器后端的代碼生成模塊部分是與BWDSP體系結(jié)構(gòu)最為密切相關(guān)的階段,因此需要對(duì)代碼生成內(nèi)部的各個(gè)階段進(jìn)行相應(yīng)的擴(kuò)展和重定向,具體包括四個(gè)階段。
3.1 機(jī)器描述
Open64中的機(jī)器描述文件稱(chēng)為Knobsfile[5],可將其按照硬件資源信息分為指令集描述、運(yùn)算資源描述、寄存器描述和匯編輸出描述等四類(lèi)信息。Open64的機(jī)器描述采用的是二次編譯的方式設(shè)計(jì)的,編譯器通過(guò)采用Intel提供的可解析特點(diǎn)格式的信息文件工具KAPI來(lái)生成BWDSP使用的數(shù)據(jù)和文件,即只需在v11-itanium-extra.knb和v12-itanium-extra.knb文件中添加相應(yīng)特殊指令的機(jī)器描述,就可以生成相應(yīng)動(dòng)態(tài)鏈接庫(kù)供編譯器在使用過(guò)程中調(diào)用。
3.2 指令注釋
Open64中的指令注釋主要是將中間語(yǔ)言WHIRL轉(zhuǎn)換為代碼生成內(nèi)部的中間表示CGIR,該過(guò)程位于CG_Expand中,特殊指令的注釋主要分為如下幾類(lèi)。
(1)復(fù)數(shù)指令注釋
原Open64框架中并沒(méi)有提供復(fù)數(shù)寄存器對(duì)的概念,因此需要擴(kuò)展虛擬寄存器的數(shù)據(jù)結(jié)構(gòu)TN,在其中增加數(shù)據(jù)域TN_Pair用來(lái)表示復(fù)數(shù)寄存器對(duì)。指令注釋過(guò)程中直接將帶復(fù)數(shù)類(lèi)型C4的WHIRL節(jié)點(diǎn)注釋成為復(fù)數(shù)指令。此外,對(duì)于復(fù)數(shù)乘法運(yùn)算(如c=a*b),BWDSP指令系統(tǒng)并沒(méi)有提供完整的復(fù)數(shù)指令,因此需要在其中插入兩條運(yùn)算指令,如下所示:
Rm+1:m=[Um+=2,0] //復(fù)數(shù)a
Rn+1:n=[Un+=2,0] //復(fù)數(shù)b
qFRm+1:m_n+1:n=CFRm+1:m*CFRn+1:n
//插入運(yùn)算指令
FRs+1=FRn+FRm
FRs=FRn+1-FRm+1
[Us+=2,0]=Rs+1:s //存儲(chǔ)復(fù)數(shù)c
(2)累加和乘累加類(lèi)指令注釋
對(duì)于該類(lèi)指令的注釋?zhuān)枰谔摂M寄存器數(shù)據(jù)結(jié)構(gòu)TN中增加表示累加信息的數(shù)據(jù)域TN_Acc和乘累加信息的數(shù)據(jù)域TN_Macc,以便后面的寄存器分配處理。另外還需要在該類(lèi)指令前面插入一條初始化指令。例如c+=a*b運(yùn)算的指令注釋如下所示:
Clr Macc //初始化清零
Rm=[Um+=1,0] //源操作數(shù)a
Rn=[Un+=1,0] //源操作數(shù)b
Macc0+=Rm*Rn //乘累加操作
Rs=Macc0
[Us+=1,0]=Rs //存儲(chǔ)目的操作數(shù)c
(3)平方和類(lèi)指令注釋
平方和指令的注釋與普通指令的注釋完全一致,只需按照普通指令的注釋方式進(jìn)行指令注釋即可。
3.3 寄存器分配
寄存器分配階段是根據(jù)虛擬寄存器TN中的相關(guān)寄存器信息為每個(gè)虛擬寄存器TN分配相應(yīng)的物理寄存器。Open64中的寄存器分配包括全局寄存器分配和局部寄存器分配[5]。傳統(tǒng)的通用處理器中并沒(méi)有提供A/B面寄存器,即復(fù)數(shù)寄存器對(duì),故該處需要考慮寄存器對(duì)信息并進(jìn)行相應(yīng)的特殊處理。
面向BWDSP的Open64編譯器沿用并擴(kuò)展了原Open64中的寄存器分配算法,這里采用的策略是優(yōu)先考慮A/B面寄存器等特殊情況。通過(guò)TN中的TN_Pair數(shù)據(jù)域,將TN寄存器對(duì)作為一個(gè)整體來(lái)處理,在寄存器分配時(shí)給其分配連續(xù)并且低位寄存器編號(hào)為偶數(shù)的兩個(gè)物理寄存器,即復(fù)數(shù)寄存器對(duì)。
對(duì)于累加指令和乘累加指令的寄存器分配,則只需要根據(jù)虛擬寄存器TN中的數(shù)據(jù)域TN_Pair和TN_Macc分別分配相應(yīng)的累加寄存器ACC和乘累加寄存器MACC即可。
3.4 匯編代碼輸出
面向BWDSP的Open64編譯器中的匯編代碼輸出模塊主要是根據(jù)BWDSP中的指令集特點(diǎn),按照其相應(yīng)的匯編格式輸出相應(yīng)的匯編代碼程序。該過(guò)程位于cgemit.cxx文件中。對(duì)于復(fù)數(shù)指令的匯編代碼,其中的兩個(gè)寄存器對(duì)之間必須用”:”來(lái)表示,并且低位寄存器編號(hào)必須有偶數(shù);對(duì)于累加指令則需要在累加寄存器的編號(hào)前面加上標(biāo)識(shí)Acc;對(duì)于乘累加指令,則加上標(biāo)識(shí)Macc等。
4 結(jié)論(Conclusion)
本文在Open64編譯基礎(chǔ)設(shè)施上設(shè)計(jì)并實(shí)現(xiàn)了上述的特殊指令合成策略,為了驗(yàn)證該方案的效果,我們選取用于測(cè)試DSP編譯器性能的、在DSP數(shù)字信號(hào)處理領(lǐng)域具有典型應(yīng)用的部分運(yùn)算作為測(cè)試集,詳見(jiàn)表1。
本文采用加速比來(lái)表示程序優(yōu)化前后性能的好壞,加速比越大,表示程序經(jīng)過(guò)特殊指令合成前后周期之間的差距越大,程序的優(yōu)化性能越顯著;相反則表示程序的優(yōu)化性能不夠明顯。實(shí)驗(yàn)結(jié)果詳見(jiàn)表2。
從表2中可以看出,針對(duì)表1中的7個(gè)基準(zhǔn)測(cè)試用例,采用本文提出的特殊指令合成策略,其平均加速比大約為1.05。因此,通過(guò)本文提出的特殊指令合成策略,能夠使得DSP中一些常用的特殊操作運(yùn)算程序的性能得到很大的提升。
參考文獻(xiàn)(References)
[1] Jordans R,Jówiak L,Corporaal H,et al.Automatic instruction-set architecture synthesis for VLIW processor cores in the ASAM project[J].Microprocessors and Microsystems,2017:114-133.
[2] Choi H,Kim J S,Yoon C W,et al.Synthesis of application specific instructions for embedded DSP software[J]. IEEE Transactions on Computers,1999,48(6):603-614.
[3] Gautam Chakrabarti,F(xiàn)red Chow G.Chakrabarti,F(xiàn).Chow.Structure Layout Optimizations in the Open64 Compiler:Design,Implementation and Measurements.Gautam Chakrabarti,Open64 Wor kshop at CGO,2008.
[4] 王昊,黃光紅,王向前.基于BWDSP100的傳播分簇算法研究與實(shí)現(xiàn)[J].中國(guó)集成電路,2014,23(8):24-28.
[5] 蔣奕.龍芯1編譯器中的指令調(diào)度相關(guān)優(yōu)化[D].北京:中國(guó)科學(xué)院研究生,2004:8-11.
作者簡(jiǎn)介:
陳金娥(1979-),女,碩士,助教.研究領(lǐng)域:軟件工程.
黃勝兵(1990-),男,碩士,工程師.研究領(lǐng)域:系統(tǒng)軟件開(kāi)發(fā).