王玉林, 鄭啟龍, 趙高義
1(中國科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,合肥 230027)2(中國科學(xué)技術(shù)大學(xué) 安徽省高性能計(jì)算重點(diǎn)實(shí)驗(yàn)室,合肥 230027)
魂芯DSP上復(fù)數(shù)類型的支持和優(yōu)化①
王玉林, 鄭啟龍, 趙高義
1(中國科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,合肥 230027)2(中國科學(xué)技術(shù)大學(xué) 安徽省高性能計(jì)算重點(diǎn)實(shí)驗(yàn)室,合肥 230027)
魂芯DSP是一款采用VLIW和SIMD架構(gòu)的針對(duì)高性能計(jì)算領(lǐng)域而設(shè)計(jì)的32bit靜態(tài)標(biāo)量數(shù)字信號(hào)處理器.為了滿足數(shù)字高性能計(jì)算的性能要求,魂芯DSP提供了豐富的復(fù)數(shù)指令,而編譯器不能直接利用這些復(fù)數(shù)指令來提升編譯性能.因此針對(duì)魂芯DSP芯片提供了大量的復(fù)數(shù)類操作指令的特點(diǎn),在傳統(tǒng)開源編譯器Open64的編譯框架基礎(chǔ)上進(jìn)行研究,實(shí)現(xiàn)了復(fù)數(shù)作為編譯器基礎(chǔ)類型和復(fù)數(shù)運(yùn)算操作的支持.同時(shí),通過識(shí)別特定的復(fù)數(shù)類操作的模式利用魂芯DSP上的復(fù)數(shù)類指令對(duì)程序編譯優(yōu)化.實(shí)驗(yàn)結(jié)果表明,該實(shí)現(xiàn)方案在魂芯DSP編譯器上對(duì)復(fù)數(shù)程序優(yōu)化后能夠取得平均5.28的加速比.
編譯優(yōu)化;分簇體系DSP;復(fù)數(shù)指令;Open64編譯器
復(fù)數(shù)分為實(shí)部和虛部,可以用n=a+bi來表示一個(gè)復(fù)數(shù):其中a表示復(fù)數(shù)的實(shí)部,b表示復(fù)數(shù)的實(shí)部.一次復(fù)數(shù)乘法操作n1×n2=(a+bi)×(c+di),要做4次乘法運(yùn)算、1次加法運(yùn)算、1次減法運(yùn)算,在匯編語言層次,要6條指令來完成一次復(fù)數(shù)乘法的操作.
魂芯DSP[1]是中國電子科技集團(tuán)第38研究所設(shè)計(jì)開發(fā)的一款高性能DSP,適用于雷達(dá)信號(hào)處理、電子對(duì)抗、通信保障等領(lǐng)域.魂芯DSP芯片提供了大量的復(fù)數(shù)運(yùn)算類指令,但是現(xiàn)有的編譯器框架是現(xiàn)有編譯器框架無法識(shí)別出復(fù)數(shù)操作生成復(fù)數(shù)類指令,是通過把復(fù)數(shù)操作分解為實(shí)部和虛部單獨(dú)處理來合成復(fù)數(shù)類的操作.復(fù)數(shù)加法或者減法至少需要2條指令,復(fù)數(shù)乘法就需要至少6條指令,無法利用魂芯DSP上單周期復(fù)數(shù)指令來對(duì)提升程序的性能.
本文重點(diǎn)介紹基于開源Open64編譯器來完成對(duì)復(fù)數(shù)的支持和優(yōu)化.主要是基于對(duì)開源編譯器Open64的前端和后端的修改來完成復(fù)數(shù)類型的支持,利用魂芯DSP上特有的復(fù)數(shù)類指令來,通過定義一些復(fù)數(shù)類操作的模式,把本來需要幾條指令才能完成的操作,優(yōu)化成魂芯DSP上對(duì)應(yīng)的一條指令.這種針對(duì)特定高效指令模式識(shí)別的方式也適用于其他的平臺(tái).
當(dāng)應(yīng)用程序中存在大量的復(fù)數(shù)乘法操作時(shí),程序執(zhí)行時(shí)間相當(dāng)程度上依賴于完成復(fù)數(shù)乘法操作的時(shí)間,快速傅里葉變換[2](Fast FourierTransform,FFT)程序中就存在很多循環(huán)的復(fù)數(shù)加法和乘法操作.
C語言的C99語法中規(guī)定了對(duì)復(fù)數(shù)操作的語法定義,對(duì)于復(fù)數(shù)的定義如下:
那么復(fù)數(shù)的乘法和除法定義為如下的操作,可以看出來復(fù)數(shù)操作要實(shí)數(shù)4次乘法、一此加法、一次減法,復(fù)數(shù)除法操作需要實(shí)數(shù)6次乘法、三次加法、兩次除法、一次減法.
GCC編譯器[3]前端從4.2版本以后就支持C99語法,也就是支持在C源程序支持復(fù)數(shù)的語義.但是GCC后端對(duì)復(fù)數(shù)操作的指令實(shí)現(xiàn),是通過一組指令組合操作來得到復(fù)數(shù)操作的結(jié)果,沒有對(duì)應(yīng)的高效的復(fù)數(shù)指令.
BWDSP編譯器采用開源Open64[4]編譯器基礎(chǔ)設(shè)施作為編譯器研究框架,而Open64編譯器是用的GCC的前端,所以原有的編譯器框架在移植到魂芯DSP上后對(duì)復(fù)數(shù)操作的編譯結(jié)果和原有的GCC中實(shí)現(xiàn)基本是一樣的.Open64是一款GPL協(xié)議的工業(yè)級(jí)開源編譯基礎(chǔ)設(shè)施,以中后端提供的強(qiáng)大的分析優(yōu)化能力著稱.主要架構(gòu)如圖1所示.
Open64開源編譯器前端采取的是GCC4.2前端,中間語言為抽象語法樹ASTtree.高級(jí)語言經(jīng)過前端時(shí),以語法tree的形式存在,經(jīng)由gspin(一種從gcc的tree到WHIRL轉(zhuǎn)換的中間表示)的媒介,轉(zhuǎn)換成為對(duì)應(yīng)的WHIRL[5]中間語言.Open64的前端將源程序轉(zhuǎn)化為中間表示W(wǎng)HIRL,后端讀入WHIRL,經(jīng)過翻譯生成代碼生成階段(Code Generation,CG)的中間表示CGIR,在經(jīng)過一系列優(yōu)化,最終CGIR經(jīng)過代碼輸出生成匯編程序.
圖1 Open64編譯器架構(gòu)
復(fù)數(shù)類型支持的基本的思路是把復(fù)數(shù)作為一種新的基礎(chǔ)數(shù)據(jù)模型,為這個(gè)新的數(shù)據(jù)類型建立一套ADT(abstract data type)并利用Open64編譯器框架實(shí)現(xiàn)和復(fù)數(shù)有關(guān)的數(shù)據(jù)操作,而不是把復(fù)數(shù)作為復(fù)合數(shù)據(jù)類型來處理.但是后前Open64編譯器框架中并不把復(fù)數(shù)操作作為基礎(chǔ)的數(shù)據(jù)類型,通過修改編譯器的前端來禁止編譯器把復(fù)數(shù)操作展開為實(shí)部和虛部.通過修改編譯器后端的機(jī)器描述,以及在編譯器WHIRL下降階段通過識(shí)別出復(fù)數(shù)操作來處理針對(duì)復(fù)數(shù)運(yùn)算的邏輯,利用魂芯DSP單周期復(fù)數(shù)指令,生成高效的匯編程序.
通過研究認(rèn)為復(fù)數(shù)數(shù)據(jù)作為基礎(chǔ)類型,具有如表1所示的原子操作定義.
復(fù)數(shù)類型作為編譯器中的基礎(chǔ)類型,表1中列出的操作在編譯器中需要識(shí)別并實(shí)現(xiàn)為單條操作.對(duì)于編譯器預(yù)期的結(jié)果則是匯編代碼中除了復(fù)數(shù)其他操作對(duì)應(yīng)于一條單周期的指令就可以完成對(duì)應(yīng)的語義.
表1 復(fù)數(shù)數(shù)據(jù)類型的ADT
在魂芯DSP處理器提供了豐富的單周期復(fù)數(shù)指令.包括復(fù)數(shù)加減法、復(fù)數(shù)乘法、共軛復(fù)數(shù)運(yùn)算[6]等.其中Macro表示該指令的分簇情況,由指令可以看出可以僅僅利用一條指令來解決一種復(fù)數(shù)運(yùn)算操作.然而通常編譯器對(duì)于復(fù)數(shù)的運(yùn)算都會(huì)轉(zhuǎn)化到實(shí)數(shù)范圍內(nèi)對(duì)復(fù)數(shù)的實(shí)部和虛部分別進(jìn)行多次的實(shí)數(shù)運(yùn)算之后再將實(shí)部和虛部分別寫回,這樣的處理方法使得程序并不能利用到DSP自身提供的各種復(fù)數(shù)運(yùn)算指令.
{Macro}CFRs+1:s = CFRm+1:m + CFRn+1:n
{Macro}CFRs+1:s = CFRm+1:m - CFRn+1:n
{Macro}CFRs+1:s = CFRm+1:m * CFRn+1:n
{Macro}CFRs+1:s = conj CFRn+1:n
研究發(fā)現(xiàn)Open64開源編譯器在編譯優(yōu)化的后期為了通用性考慮,把復(fù)數(shù)操作展開為實(shí)部和虛部的單獨(dú)運(yùn)算操作[7].所以重點(diǎn)工作在編譯器框架的中端和后端部分.
Open64中經(jīng)過前端詞法和語法的分析會(huì)生成中間語法樹WHIRL.WHIRL樹中定義了一些列的操作算子opcode[8],其中每一個(gè)opcode就代表了程序的一個(gè)算子,可以通過識(shí)別復(fù)數(shù)操作的算子在WHIRL下降到CGIR的過程中增加針對(duì)魂芯DSP目標(biāo)體系結(jié)構(gòu)的處理邏輯,通過指令注釋生成對(duì)應(yīng)的匯編代碼.
對(duì)于復(fù)數(shù)類型操作支持的解決方案流程如圖2所示.主要分為三步:(1)前端禁止編譯器把復(fù)數(shù)展開為實(shí)部和虛部;(2)修改編譯器中端WHIRL節(jié)點(diǎn)定義增加復(fù)數(shù)操作的opcode碼;(3)在編譯器機(jī)器描述文件中增加復(fù)數(shù)操作的指令描述,修改編譯器后端CGIR框架,增加對(duì)應(yīng)WHIRL樹種新增的復(fù)數(shù)的opcode的處理邏輯.
圖2 復(fù)數(shù)類型支持流程
魂芯DSP芯片除了提供復(fù)數(shù)基本的加減乘單周期指令外還提供了許多和復(fù)數(shù)操作相關(guān)的高效指令.指令形式如下:
{Macro}CFRs+1:s = CFRm+1:m + jCFRn+1:n
{Macro}CFRs+1:s = (CFRm+1:m + CFRn+1:n)/2
{Macro}CFRs+1:s = (CFRm+1:m + jCFRn+1:n)/2
{Macro}CFACCs+1:s += CFRn+1:n (conc,con=Rm)
第一個(gè)指令是一個(gè)復(fù)數(shù)同另一個(gè)復(fù)數(shù)乘上j后的浮點(diǎn)加法(等價(jià)于一個(gè)復(fù)數(shù)先乘上一個(gè)實(shí)數(shù),然后運(yùn)算的結(jié)果會(huì)存儲(chǔ)為一個(gè)中間結(jié)果,然后中間結(jié)果再加上另外一個(gè)復(fù)數(shù)得到最后結(jié)果),第二條和第三條指令分別是復(fù)數(shù)相加除2指令和第一條指令運(yùn)算結(jié)果再除2指令.最后一條指令是復(fù)數(shù)累加指令,累加的結(jié)果存在累加寄存器ACC中.因?yàn)榫幾g器到后端一般是三地址代碼,這些指令在Open64的中間WHIRL樹中對(duì)應(yīng)的并不是一條單一的opcode操作碼,無法通過簡(jiǎn)單的代碼翻譯就可以利用到對(duì)應(yīng)的高效指令,要通過合并幾條特有的操作算子來翻譯到魂芯DSP上高效的指令.
WHILR中節(jié)點(diǎn)是樹的結(jié)構(gòu)組織的,那么可以從樹的根節(jié)點(diǎn),也就是一個(gè)程序的region入口處開始遍歷樹的節(jié)點(diǎn),當(dāng)發(fā)現(xiàn)某一個(gè)子節(jié)點(diǎn)中的孩子節(jié)點(diǎn)有符合我們要優(yōu)化的模式時(shí)就去匹配定義好的模式處理邏輯,把本來要好幾條處理指令才能完成的邏輯用魂芯DSP上一條指令就可以完成,提高程序的指令效率.所以需要定義我們的遍歷樹節(jié)點(diǎn)的算法,對(duì)應(yīng)的模式串和匹配到模式串后處理的算法.對(duì)WHIRL樹節(jié)點(diǎn)的編譯算法如圖3所示.
圖3 復(fù)數(shù)高效指令優(yōu)化流程
算法首先判斷WHIRL樹節(jié)點(diǎn)中是否含有和復(fù)數(shù)操作有關(guān)的節(jié)點(diǎn),如果包含復(fù)數(shù)操作的節(jié)點(diǎn),那么就按已經(jīng)確定好的優(yōu)化模式串來對(duì)樹的節(jié)點(diǎn)進(jìn)行遍歷,如果Match_Rule返回結(jié)果是真,那么就說明此樹種有節(jié)點(diǎn)符合我們優(yōu)化的模式.然后針對(duì)此節(jié)點(diǎn)進(jìn)行優(yōu)化處理,處理的邏輯在Do_Opt_Redule,這個(gè)子函數(shù)是用來對(duì)WHIRL中它包含的符合優(yōu)化處理的一系列指令到CGIR的下降處理剪切我們預(yù)先定義的模式處理流程,然后在經(jīng)過指令注釋生成DSP上的高效的指令.
對(duì)于一個(gè)節(jié)點(diǎn)如何滿足某個(gè)模式優(yōu)化串,也就是Mach_Rule的流程,我們定義如下的模式串流程,如果WHIRL樹種節(jié)點(diǎn)符合這種規(guī)則,則優(yōu)化邏輯就對(duì)次節(jié)點(diǎn)進(jìn)行優(yōu)化,以上面列出的高效指令的第一個(gè)指令為例,其中模式串的規(guī)則定義如圖4所示.首先判斷tree節(jié)點(diǎn)中是否為復(fù)數(shù)加法操作,如果是然后在判斷是否第二個(gè)操作數(shù)的孩子節(jié)點(diǎn)類型是否是復(fù)數(shù)和浮點(diǎn)數(shù)類型,如果條件都滿足,那么就說明符合預(yù)定義的優(yōu)化規(guī)則.
但是這種優(yōu)化算法會(huì)帶來編譯器的編譯速度的降低,對(duì)于DSP嵌入式設(shè)備來說,代碼效率和代碼大小是很重要的考量,這種優(yōu)化邏輯既可以減少程序的執(zhí)行周期又可以減少DSP上代碼的大小.
圖4 復(fù)數(shù)加乘優(yōu)化Rule規(guī)則
Open64在從WHIRL樹轉(zhuǎn)換到CGIR的過程會(huì)進(jìn)行一系列的優(yōu)化,VHO,IPA,LNO,WOPT,CG[9].在最后一個(gè)優(yōu)化階段CG中增加對(duì)魂芯DSP目標(biāo)平臺(tái)的宏定義,禁止編譯器框架把復(fù)數(shù)展開為復(fù)合操作,令WHIRL轉(zhuǎn)換到CGIR模塊則可以識(shí)別出復(fù)數(shù)為基礎(chǔ)數(shù)據(jù)類型.
通過在編譯器后端增加復(fù)數(shù)類型運(yùn)算的操作碼(opcode),來支持復(fù)數(shù)操作,在操作碼文件opcode.h中增加復(fù)數(shù)運(yùn)算操作碼.例如增加復(fù)數(shù)加操作,OPC_C4ADD操作碼表示是一條加法操作,輸入的源操作的類型是32位的復(fù)數(shù)類型.通過增加轉(zhuǎn)換條件來支持轉(zhuǎn)換WHIRL轉(zhuǎn)化為CGIR的中間表示,轉(zhuǎn)化后的CGIR中的每條指令與魂芯DSP目標(biāo)處理器指令集中的匯編指令格式一一對(duì)應(yīng).
MTYPE_C4=17 /* for 32-bit complex */
OPC_C4ADD=OPR_ADD+RTYPE(MTYPE_C4)+DESC(MTYPE_V)
在WHIRL轉(zhuǎn)換到CGIR過程中通過識(shí)別出OPR_ADD操作,繼而再判斷操作數(shù)是復(fù)數(shù)類型,轉(zhuǎn)到復(fù)數(shù)操作數(shù)的處理流程.
由于復(fù)數(shù)類型包含實(shí)部和虛部,所以對(duì)復(fù)數(shù)類型要分配兩個(gè)連續(xù)編號(hào)的寄存器,即寄存器對(duì).實(shí)部存放奇序號(hào)寄存器,虛部存放偶序號(hào)寄存器.對(duì)于連續(xù)編號(hào)寄存器對(duì)[10]的保證可以通過TN_Pair在寄存器分配中申請(qǐng),TN_Pair表示兩個(gè)連續(xù)編號(hào)的寄存器對(duì),且較小編號(hào)為偶數(shù).
TN_Pair的實(shí)現(xiàn)需要修改原有的框架中寄存器分配的算法.魂芯DSP編譯器使用啟發(fā)式的圖著色算法進(jìn)行全局的寄存器分配.基本的算法流程是先為函數(shù)中的寄存器建立寄存器干涉圖[11],然后統(tǒng)計(jì)虛擬寄存器的使用頻率,依照使用頻率的大小依次進(jìn)行著色.針對(duì)復(fù)數(shù)操作對(duì)寄存器的特殊要求,對(duì)寄存器分配算法修改.將復(fù)數(shù)指令上的所有寄存器看成是一個(gè)整體分配相應(yīng)的連續(xù)寄存器.具體的實(shí)現(xiàn)是在寄存器分派階段,為復(fù)數(shù)指令操作數(shù)分配寄存器時(shí),將寄存器屬性標(biāo)記為R_CONTAINS_COMPLEX,并將這些寄存器添加到vreg_complex_list中,表示寄存器對(duì)為復(fù)數(shù)操作所需的寄存器.
在利用目標(biāo)機(jī)器提供了有關(guān)復(fù)數(shù)運(yùn)算的指令時(shí),首先要對(duì)相關(guān)的目標(biāo)或機(jī)器指令進(jìn)行描述,以便在后端的分簇、指令調(diào)度等相關(guān)階段使用.Open64編譯器框架采用了二次編譯的方式設(shè)計(jì)機(jī)器描述文件的架構(gòu).在編譯器后端的寄存器描述文件中增加復(fù)數(shù)運(yùn)算的指令,對(duì)指令進(jìn)行描述和注釋.最終生成對(duì)應(yīng)格式的匯編代碼.魂芯DSP機(jī)器描述主要通過描述目標(biāo)機(jī)器的指令格式信息、資源使用信息、延遲信息和指令信息來將目標(biāo)機(jī)器的指令集[12]信息提供給編譯器.機(jī)器描述的抽象表示主要由以下五個(gè)部分組成:
(1)SECTION opcode_desc描述了機(jī)制指令操作碼;
(2)SECTION Operation_Format描述了源操作數(shù)和后的操作數(shù)的數(shù)后以及類型;
(3)SECTION Resource Usage描述資源使用信息;
(4)SECTION Table_Option描述資源選項(xiàng);
(5)SECTION Scheduling_Alternative描述指令調(diào)度信息.
例如在機(jī)器描述文件中opcodes.knb文件中增加復(fù)數(shù)加法指令,opcode表示增加了復(fù)數(shù)加法的c4add機(jī)器描述,需要占用浮點(diǎn)ALU算術(shù)單元,這條指令的操作數(shù)描述碼是112.操作數(shù)描述中,負(fù)號(hào)表示輸入操作數(shù),正號(hào)表示輸出操作數(shù),復(fù)數(shù)加法的指令表示有4個(gè)32位的浮點(diǎn)操作數(shù),輸出的是2個(gè)32位的浮點(diǎn)數(shù).
opcode+=“230,c4add,fuALU,intel1,112,NULL”;
opndsgrp+=“112,?pr/OU_predicate,-fp32/OU_opnd1,-fp32/OU_opnd2,-fp32/OU_opnd3,-fp32/OU_opnd4,+fp32,+fp32”;
復(fù)數(shù)的加減和乘法都可以從過從CGIR在到指令注釋的過程直接一一對(duì)應(yīng)到魂芯DSP上的一條復(fù)數(shù)操作指令,但是魂芯DSP上并沒有針對(duì)復(fù)數(shù)除法的單周期指令,針對(duì)復(fù)數(shù)除法必須利用一組指令的結(jié)合運(yùn)算來得到最后的除法結(jié)果.根據(jù)第1節(jié)對(duì)復(fù)數(shù)除法的定義可以知道,要先算出除數(shù)的結(jié)果,利用魂芯DSP上特有的指令,我們知道這個(gè)平方和的結(jié)果就等于一個(gè)復(fù)數(shù)和他的共軛復(fù)數(shù)的乘積,利用魂芯DSP上特有的指令可以把復(fù)數(shù)的除法指令由原來的12條指令減少到只需要7條就可以完成.
要在源代碼級(jí)別識(shí)別復(fù)數(shù)的實(shí)部和虛部,可以通過intrinsic[13]技術(shù),利用編譯器把函數(shù)轉(zhuǎn)換為匯編指令.intrinsic函數(shù)又稱為built_in內(nèi)建函數(shù),是一種通過使用C函數(shù)方式來封裝BWDSP底層系統(tǒng)結(jié)構(gòu)的特殊匯編指令的編譯器功能模塊.編程人員可以通過使用C函數(shù),編譯器能夠在內(nèi)部將該C函數(shù)直接轉(zhuǎn)換為指令系統(tǒng)所支持的一條或若干條高效的特殊匯編指令.通過將creal和cimag定義為intrinsic操作來在源碼級(jí)獲得復(fù)數(shù)類型的實(shí)部和虛部.復(fù)數(shù)虛部的實(shí)現(xiàn)結(jié)果如圖5所示,把求復(fù)數(shù)虛部操作_image_f定義為一個(gè)F4INTRINSIC_OP操作.通過后端的指令注釋可以直接得到復(fù)數(shù)的虛部,其實(shí)就是取代表復(fù)數(shù)寄存器對(duì)的較大序號(hào)的寄存器中的值.
在完成了復(fù)數(shù)類型的支持和優(yōu)化后,為了測(cè)試效果,選取了DSP經(jīng)典的測(cè)試集[14]來測(cè)試編譯器性能,測(cè)試是和以前編譯器未針對(duì)復(fù)數(shù)類型進(jìn)行優(yōu)化的對(duì)比.在ECS(Effective Coding Studio)統(tǒng)計(jì)程序執(zhí)行的周期數(shù),程序優(yōu)化前后執(zhí)行的時(shí)鐘周期數(shù)如表2所示.
涉及大量復(fù)數(shù)運(yùn)算的是FFT和復(fù)數(shù)求點(diǎn)積算法,并行度比較高可以看出其加速比效果是原來的5~6倍,而復(fù)數(shù)求點(diǎn)和和規(guī)約求和因?yàn)楸旧頂?shù)據(jù)并行度不大,優(yōu)化效果是原來的2~3倍.至此,基于開源編譯器框架Open64完成了針對(duì)魂芯DSP上新增復(fù)數(shù)類型為基礎(chǔ)類型的開發(fā).
優(yōu)化復(fù)數(shù)支持后程序的加速比效果如圖6所示,從圖中可以看出,在完成編譯器對(duì)復(fù)數(shù)類型的基本支持后,對(duì)復(fù)數(shù)程序的編譯優(yōu)化取得了較好的結(jié)果.相關(guān)算法的平均加速比達(dá)到了5.28倍.
圖5 復(fù)數(shù)虛部intrinsic轉(zhuǎn)換
表2 優(yōu)化前后的時(shí)鐘周期數(shù)(cycles)
圖6 編譯器優(yōu)化加速比
本文針對(duì)魂芯DSP高性能處理芯片,利用其提供的復(fù)數(shù)運(yùn)算指令,提出了32位復(fù)數(shù)數(shù)據(jù)類型作為編譯器基礎(chǔ)數(shù)據(jù)類型的模型,抽象出了復(fù)數(shù)作為編程基礎(chǔ)數(shù)據(jù)類型具有的原子操作語義.基于開源的Open64編譯器基礎(chǔ)上,利用魂芯DSP特有的復(fù)數(shù)指令對(duì)復(fù)數(shù)操作進(jìn)行了優(yōu)化.通過對(duì)魂芯DSP芯片現(xiàn)有的高效的復(fù)數(shù)指令,提出了基于模式匹配的優(yōu)化算法,此算法也可以通過擴(kuò)展對(duì)其他的匹配模式進(jìn)行優(yōu)化.為了驗(yàn)證優(yōu)化的效果,測(cè)試了編譯器優(yōu)化前后程序執(zhí)行的時(shí)鐘周期數(shù),實(shí)驗(yàn)結(jié)果表明平均加速比為5.28.所提出的復(fù)數(shù)類型作為基礎(chǔ)數(shù)據(jù)模型的一種通用增加數(shù)據(jù)模型的方法,以及基于模式匹配的優(yōu)化算法也可以抽象推廣到其他需要優(yōu)化指令的平臺(tái).
1 CETC38TM.BWDSP100硬件用戶手冊(cè).合肥:中國電子科技集團(tuán)公司第三十八研究所,2011:1–2.
2 李欣,劉峰,龍騰.定點(diǎn)FFT在TS201上的高效實(shí)現(xiàn).北京理工大學(xué)學(xué)報(bào),2010,30(1):88–91.
3 王國棟,侯朝煥.GCC在高性能微處理器DSP和CPU上的移植.計(jì)算機(jī)工程與設(shè)計(jì),2005,26(4):891–920.
4 Sui YL.Open64 introduction.http://www.cse.unsw.edu.au/~ysui/saber/open64.pdf.[2015-03-17].
5 Open64.Open64 compiler whirl intermediate representation.http://www.mcs.anl.gov/OpenAD/open64A.pdf.[2015-03-17].
6 CETC38TM.BWDSP100軟件用戶手冊(cè).合肥:中國電子科技集團(tuán)公司第三十八研究所,2011:181–191.
7 丁陳飛,鄭啟龍,徐華葉,等.多簇超長指令字DSP復(fù)數(shù)運(yùn)算的編譯優(yōu)化.計(jì)算機(jī)應(yīng)用與軟件,2015,32(2):14–17.
8 Cheong G,Lam MS.An optimizer for multimedia instruction sets.Proc.of the 2nd SUIF Compiler Workshop.Stanford,USA.1997.
9 黃勝兵,鄭啟龍,郭連偉.分簇VLIW DSP上支持單雙字模式選擇的SIMD編譯優(yōu)化.計(jì)算機(jī)應(yīng)用,2015,35(8):2371–2374.[doi:10.11772/j.issn.1001-9081.2015.08.2371]
10 張軍超.相連多寄存器組體系結(jié)構(gòu)上的寄存器分配技術(shù)[博士學(xué)位論文].北京:中國科學(xué)院計(jì)算技術(shù)研究所,2005:92–94.
11 姜軍,王超,尉紅梅.一種局部寄存器分配的優(yōu)化策略.計(jì)算機(jī)應(yīng)用與軟件,2013,30(12):215–217,254.[doi:10.3969/j.issn.1000-386x.2013.12.056]
12 王向前,洪一,王昊,等.魂芯DSP的編譯器設(shè)計(jì)與優(yōu)化.電子學(xué)報(bào),2015,43(8):1656–1661.
13 Batten D,Jinturkar S,Glossner J,et al.Interaction between optimizations and a new type of dsp intrinsic function.Proc.of International Conference on Signal Processing Applications and Technology (ICSPAT’99).Orlando,Florida,USA.1999.
14 ?ivojnovi? V,Velarde JM,Schl?ger C,et al.DSPstone:A DSP-oriented benchmarking methodology.Proc.of International Conference on Signal Processing Applications and Technology (ICSPAT 1994).Dallas,USA.1994.
Complex Data Type Support and Optimization for BWDSP
WANG Yu-Lin,ZHENG Qi-Long,ZHAO Gao-Yi
1(School of Computer Science and Technology,University of Science and Technology of China,Hefei 230027,China)2(Anhui High Performance Computing Key Laboratory,University of Science and Technology of China,Hefei 230027,China)
BWDSP is a 32bit static scalar digital signal processor with VLIW and SIMD features,which is designed for high performance computing.In order to meet the performance requirements of digital high-performance computing,the soul core DSP provides a rich set of complex instructions,and the compiler cannot directly use these complex instructions to improve the compilation performance.Since BWDSP has a wealth of complex type of instructions,and it has high performance demands in the radar digital signal field,the implementation is researched according to the characteristics of BWDSP features based on the traditional open-source Open64 compiler framework to achieve the complex data type and complex operations support operations,and further optimization of complex instruction is realized by identifying a specific type of complex operation of a series of patterns.The experimental results show that the implementation on BWDSP compiler can achieve 5.28 time performance improvement on average.
compiler optimization;multi-cluster DSP;complex instructions;Open64 compiler
王玉林,鄭啟龍,趙高義.魂芯DSP上復(fù)數(shù)類型的支持和優(yōu)化.計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(9):40–45.http://www.c-s-a.org.cn/1003-3254/5954.html
① 基金項(xiàng)后:“核高基”重大專項(xiàng)(2012ZX01034-001-001)
2016-12-28;采用時(shí)間:2017-01-18