欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于龍芯3a向量訪存的編譯優(yōu)化方法

文檔序號:6561554閱讀:298來源:國知局
專利名稱:一種基于龍芯3a向量訪存的編譯優(yōu)化方法
技術(shù)領(lǐng)域
本發(fā)明屬于計算機編譯技術(shù)領(lǐng)域,具體涉及基于龍芯3A向量訪存的編譯優(yōu)化及后端代碼生成方法。
背景技術(shù)
根據(jù)龍芯3A處理器的用戶手冊,現(xiàn)有龍芯3A處理器設(shè)計了向量訪存指令,一次可以從內(nèi)存中讀取128位的數(shù)據(jù),放在兩個不同的寄存器中。在編譯器中對向量訪存的優(yōu)化, 傳統(tǒng)的方法是采用自動向量化的方法,但這需要硬件有向量寄存器的支持。由于現(xiàn)有龍芯 3A處理器中并沒有設(shè)計向量寄存器,所以不能直接用自動向量化的方法來進行編譯優(yōu)化。龍芯處理器官方指定的編譯器是開源編譯器套裝(GCC),可以利用GCC現(xiàn)有自動向量化的前端,生成向量形式的樹結(jié)構(gòu),再擴展成向量形式的中間表示,進而生成向量訪存指令。

發(fā)明內(nèi)容
本發(fā)明提出一種基于龍芯3A向量訪存的編譯優(yōu)化方法,以克服現(xiàn)有技術(shù)的上述缺陷,達到編譯器自動生成龍芯3A特有向量訪存指令的目的。本發(fā)明基于龍芯3A向量訪存的編譯優(yōu)化方法,利用開源編譯器套裝(GCC)自動向量化的前端生成向量形式的樹結(jié)構(gòu),進而擴展成對應(yīng)的中間表示,再轉(zhuǎn)化為向量指令;其特征在于先將向量形式的樹結(jié)構(gòu)轉(zhuǎn)化為對應(yīng)的中間表示,在該中間表示層次上進行循環(huán)語句中間表示層次上的多樣性處理,再生成向量形式的匯編指令;具體操作步驟如下第一步、向量擴展在原有路徑的基礎(chǔ)上新增一條從向量樹結(jié)構(gòu)到中間表示的擴展路徑;依次遍歷樹結(jié)構(gòu)的各個節(jié)點,將向量形式的樹結(jié)構(gòu)擴展成龍芯3A向量指令對應(yīng)的中間寄存器傳輸語言表示方式;在擴展過程中,如果是正常模式,則沿著原有的路徑進行擴展;如果是向量化的模式,則從新的路徑進行擴展;第二步、多樣性處理對于含有公共運算變量的循環(huán),將其生成的中間表示建立賦值鏈,更新賦值鏈上的操作數(shù);在從樹擴展到寄存器傳輸語言(RTL)表示后,即GCC中的擴展(expand)遍之后,增加一個寄存器替換(paSS_ri5place_reg)的優(yōu)化遍,該優(yōu)化遍的算法
如下
replace—reg—for—v2df(void) { F0R_ALL BB (bb) {S掃描每一個基本塊*/ FOR—BB—INSNS(bb, insn) {
/*掃描基本塊中的每一條語句*/找到需要克隆的語句;/*公共運算變量被提取的語句*/ 克隆該語句,并將內(nèi)存地址加8,賦值給新的寄存器; FOR BB INSNS (bb, insnparallel){
/*公共運算變量是賦值語句的右值*/ if(該語句是要被修改的語句) 用新分配的寄存器替換原來的寄存器;
FOR BB INSNS (bb, insnmult){
/*公共運算變量是乘法語句的右值*/ if(該語句是要被修改的語句) 用新分配的寄存器替換原來的寄存器; replace—reg—Ι O; /*處理替換鏈上的寄存器*/
FOR BB INSNS (bb, insnadd){
/*公共運算變量是加法語句的右值*/ if(該語句是要被修改的語句) 用新分配的寄存器替換原來的寄存器; replace—reg—Ι O; /*處理替換鏈上的寄存器*/}}}第三步、向量訪存指令的生成在GCC后端指令描述文件中,增加向量指令的后端指令描述,再由GCC自動將生成的中間表示轉(zhuǎn)化為匯編指令。由于本發(fā)明設(shè)計了新的擴展路徑,并對生成的中間表示進行多樣性處理,然后將中間表示轉(zhuǎn)化為對應(yīng)的龍芯3A向量指令,克服了傳統(tǒng)自動向量化方法需要依賴向量寄存器的缺點,從而使得編譯器能夠自動生成龍芯3A的向量指令,節(jié)省了大量手工寫匯編指令的時間。并且本發(fā)明還利用了現(xiàn)有自動向量化的前端來生成向量形式的樹結(jié)構(gòu),再擴展成向量形式的中間表示,進而生成向量訪存指令,從而很好的利用了 GCC現(xiàn)有的編譯器功能模塊,節(jié)省了大量實現(xiàn)上的工作量。
具體實施方式

實施例1
本實施例基于龍芯3A向量訪存的編譯優(yōu)化方法,初步的編譯優(yōu)化方案是先利用開源編譯器套裝(GCC)自動向量化的前端生成向量形式的樹結(jié)構(gòu),再將該向量形式的樹結(jié)構(gòu)擴展成向量形式的中間表示;然后對向量形式的中間表示進行多樣性處理;最后將向量形式的中間表示轉(zhuǎn)化成向量訪存指令。具體操作步驟如下第一步、向量擴展龍芯向量1 位訪存的指令格式為gsLQCl fq, ft, offset (base) ;gsSDCl fq, ft, offset (base)。自動向量化生成向量形式的樹結(jié)構(gòu),但是此時的樹結(jié)構(gòu)中訪存和計算都是默認有1 位寄存器的,即原操作數(shù)和目標操作數(shù)都只有一個,為1 位模式。而龍芯向量訪存的W的目的操作數(shù)和SD得原操作數(shù)都是兩個操作數(shù)。所有在進行向量擴展的時候,需要進行轉(zhuǎn)化,將1 為的操作數(shù)變成兩個64位操作數(shù),并且模擬向量運算。正常的向量擴展路徑如下所示源程序段double a[20], b[20];for(i = 0 ;i < 20 ;i++)b[i] = b[i]+c[i]向量形式樹結(jié)構(gòu)
MEM[base:&a+ivtmp.71] = MEM[base:&b+ivtmp.71] + MEM[base:&c+ivtmp.71] ivtmp.71 = ivtmp.71 +16 if(ivtmp.71 != 160)
goto <bb3> else
goto <bb4>源程序段經(jīng)過自動向量化后轉(zhuǎn)化為向量形式樹結(jié)構(gòu)。表達式都是按照樹結(jié)構(gòu)深度優(yōu)先轉(zhuǎn)換樹結(jié)點為RTL表示。龍芯3A沒有設(shè)計1 位的向量寄存器,而是通過兩個浮點寄存器完成1 位數(shù)據(jù)存放的任務(wù)。針對這種模式,本發(fā)明在原有龍芯3A向量擴展路徑的基礎(chǔ)上新增了一條從向量樹結(jié)構(gòu)到中間表示的擴展路徑在擴展過程中,如果是正常模式,則沿著原有的路徑進行擴展;如果是向量化的模式,則從新的路徑進行擴展。經(jīng)過這種處理后,向量化模式的表達式和非向量化的表達式擴展過程仍會共用部分函數(shù)接口,避免代碼的冗余開銷。第二步、多樣性處理通過對大量應(yīng)用程序的統(tǒng)計,發(fā)現(xiàn)多樣性的特點表現(xiàn)為以下幾個方面(1)語句在循環(huán)結(jié)構(gòu)中,并且能自動向量化。(2)語句中,有公共的運算變量,如示例1的for循環(huán)結(jié)構(gòu)中的C[i]。示例 1 for(i = 0 ;i < N ;i++){A[i] = B[i]+C[i];
E[i] = D[i]+C[i];}示例 2 for(i = 0 ;i < N ;i++){A[i] = B[i]+C[i];E[i] = D[i]+C[i];}(3)有公共運算變量的某條語句的左值可能是另外一個語句的右值,形成一條賦值鏈條。如示例2的for循環(huán)結(jié)構(gòu)中的A[i]。在具體的程序中,多樣性主要體現(xiàn)在以下3類循環(huán)程序上多樣性1:
for(i=0; i<N; i++){ x = b[i]; b[i] = c[i]; a[i] = x;
}多樣性2
for(i=0; i<N; i++){
a[i]=b[i]*c[i]+d[i]*b[i] or x = b[i];
a[i] = a[i] + x*x;
}多樣性3
for(i=0; i<N; i++){ a[i]=b[i] + c[i]; d[i] = e[i] + c[i];
fli] = g[i] + a[i];
}這三類程序分別代表的特性是(1)公共運算變量是賦值語句的右值,如多樣性1中的χ變量。(2)公共運算變量是乘法語句的右值,如多樣性2中的b[i]或χ。(3)公共運算變量是加法語句的右值,如多樣性3中的c[i]。
多樣性1、2、3所示的程序向量化后樹結(jié)構(gòu)會出現(xiàn)如下所示的情形
vect—var—.44 = MEM[base: &b + ivtmp.71]; MEM[base: &a + ivtmp.71] = [plus expr] vect—var—.44 * MEM[base: &c + ivtmp.71] + vect—var—.44 * MEM[base: &d + ivtmp.71]; ivtmp.71 = ivtmp.71 + 16; if (ivtmp.71 != 160) goto <bb 3>;
else
goto <bb 4>;以上為多樣性2生成的樹結(jié)構(gòu)代碼,a[i] =b[i]*c[i]+d[i]*b[i]語句的向量形式的樹表示并不是一條語句,而是分裂成兩條語句。其中b[i]被提取出來vect_var_.44 =MEM[base :&b+ivtmp. 71]。而擴展過程是以單條語句為單位進行擴展的。當對vect_ var_. 44 = MEM [base :&b+ivtmp. 71]進行 RTL 擴展的時候,vect_var_. 44 只分配一個寄存器,而接下來的語句也只能使用該寄存器,而不是連續(xù)的兩個變量值。這種情況可能會被傳遞,如上面的示例2,雖然A[i] =B[i]+C[i]中的A[i]分配了兩個寄存器,但是在接下來的G[i] =H[i]+A[i]依然只能使用其中一個寄存器,出現(xiàn)語義問題。根據(jù)多樣性的特點和表現(xiàn),本發(fā)明設(shè)計了一個替換算法來解決向量化后樹結(jié)構(gòu)的多樣性問題。在從樹擴展到RTL過程后,即GCC中的expand遍之后,增加一個新的優(yōu)化遍, 取名pasLRplace^eg (寄存器替換),加入替換算法。之所以選擇在此插入新的優(yōu)化遍是因為(1)在樹結(jié)構(gòu)上做變換牽涉的內(nèi)容更多,更復(fù)雜。(2) expand遍之后的RTL表示是最原始的RTL表示,語句沒有經(jīng)過變換,更容易處理。算法如下
replace—reg—for—v2df(void) { F0R_ALL BB (bb) { /*掃描每一個基本塊*/FOR—BB—INSNS(bb, insn) {
/*掃描基本塊中的每一條語句*/
找到需要克隆的語句;/*公共運算變量被提取的語句*/ 克隆該語句,并將內(nèi)存地址加8,賦值給新的寄存器; FOR BB INSNS (bb, insnparallel){
/*公共運算變量是賦值語句的右值*/ if(該語句是要被修改的語句) 用新分配的寄存器替換原來的寄存器;
FOR BB INSNS (bb, insnmult){
/*公共運算變量是乘法語句的右值*/ if(該語句是要被修改的語句) 用新分配的寄存器替換原來的寄存器; replace—reg—Ι O; /*處理替換鏈上的寄存器*/
FOR BB INSNS (bb, insnadd){
/*公共運算變量是加法語句的右值*/ if(該語句是要被修改的語句) 用新分配的寄存器替換原來的寄存器; replace—reg—Ι O; /*處理替換鏈上的寄存器*/該算法中,判斷某條語句是否需要修改用到了擴展遍之后原始RTL的位置屬性 高位運算總是出現(xiàn)在奇數(shù)位置,低位運算總是出現(xiàn)在偶數(shù)位置。函數(shù)r印lace_reg_l()是一個類似于r印lace_reg_f0r_V2df (void)的遞歸函數(shù),處理如示例2情形中的賦值鏈條。第三步、向量訪存指令的生成 在GCC后端指令描述文件中,增加向量指令的后端指令描述,再由GCC自動將生成的中間表示轉(zhuǎn)化為匯編指令。該優(yōu)化方案已經(jīng)在GCC編譯器中得到了實現(xiàn)。由于本發(fā)明設(shè)計了新的擴展路徑,并對生成的中間表示進行多樣性處理,然后將中間表示轉(zhuǎn)化為對應(yīng)的龍芯3A向量指令,克服了傳統(tǒng)自動向量化方法需要依賴向量寄存器的缺點,從而使得編譯器能夠自動生成龍芯3A的向量指令,節(jié)省了大量手工寫匯編指令的時間。并且本發(fā)明還利用了現(xiàn)有自動向量化的前端來生成向量形式的樹結(jié)構(gòu),再擴展成向量形式的中間表示,進而生成向量訪存指令,從而很好的利用了 GCC現(xiàn)有的編譯器功能模塊,節(jié)省了大量實現(xiàn)上的工作量。
權(quán)利要求
1. 一種基于龍芯3A向量訪存的編譯優(yōu)化方法,利用編譯器自動向量化的前端生成向量形式的樹結(jié)構(gòu),進而擴展成對應(yīng)的中間表示,再轉(zhuǎn)化為向量指令;其特征在于先將向量形式的樹結(jié)構(gòu)轉(zhuǎn)化為對應(yīng)的中間表示,在該中間表示層次上進行循環(huán)語句中間表示層次上的多樣性處理,再生成向量形式的匯編指令;具體操作步驟如下第一步、向量擴展在原有路徑的基礎(chǔ)上新增一條從向量樹結(jié)構(gòu)到中間表示的擴展路徑;依次遍歷樹結(jié)構(gòu)的各個節(jié)點,將向量形式的樹結(jié)構(gòu)擴展成龍芯3A向量指令對應(yīng)的中間寄存器傳輸語言表示方式;在擴展過程中,如果是正常模式,則沿著原有的路徑進行擴展; 如果是向量化的模式,則從新的路徑進行擴展;第二步、多樣性處理對于含有公共運算變量的循環(huán),將其生成的中間表示建立賦值鏈,更新賦值鏈上的操作數(shù);在從樹擴展到寄存器傳輸語言表示后,即編譯器中的擴展遍之后,增加一個寄存器替換的優(yōu)化遍,該優(yōu)化遍的算法如下 replace—reg—for—v2df {FOR—ALL—BB丨f掃描每一個基本塊*/ FOR—BB—INSNS—{/*掃描基本塊中的每一條語句*/找到需要克隆的語句;/*公共運算變量被提取的語句*/ 克隆該語句,并將內(nèi)存地址加8,賦值給新的寄存器; FOR—BB—INSNS {/*公共運算變量是賦值語句的右值*/ if該語句是要被修改的語句用新分配的寄存器替換原來的寄存器;FOR BB INSNS {/*公共運算變量是乘法語句的右值*/ if該語句是要被修改的語句用新分配的寄存器替換原來的寄存器; call replace—reg—1; /*處理替換鏈上的寄存器*/FOR BB INSNS {/*公共運算變量是加法語句的右值*/ if該語句是要被修改的語句用新分配的寄存器替換原來的寄存器;call replace—reg—1; /*處理替換鏈上的寄存器*/第三步、向量訪存指令的生成在編譯器后端指令描述文件中,增加向量指令的后端指令描述,再由編譯器自動將生成的中間表示轉(zhuǎn)化為匯編指令。
全文摘要
本發(fā)明公開了一種基于龍芯3A向量訪存的編譯優(yōu)化方法,特征是新增一條從向量樹結(jié)構(gòu)到中間表示的擴展路徑,將向量形式的樹結(jié)構(gòu)轉(zhuǎn)化為對應(yīng)的中間表示;在擴展過程中,如果是正常模式,則沿著原有的路徑進行擴展;如果是向量化的模式,則從新的路徑進行擴展;對于含有公共運算變量的循環(huán),將其生成的中間表示建立賦值鏈,更新賦值鏈上的操作數(shù);在從樹擴展到寄存器傳輸語言表示后,增加一個寄存器替換的優(yōu)化遍;在編譯器后端指令描述文件中,增加向量指令的后端指令描述,再由編譯器自動將生成的中間表示轉(zhuǎn)化為匯編指令。這樣,編譯器就可以自動生成高性能的向量訪存指令,節(jié)約了程序員手寫匯編的工作,并大幅提高了應(yīng)用程序運行時的效率。
文檔編號G06F9/45GK102231118SQ20111020864
公開日2011年11月2日 申請日期2011年7月25日 優(yōu)先權(quán)日2011年7月25日
發(fā)明者彭飛, 林傳文, 郭利財, 顧乃杰 申請人:中國科學(xué)技術(shù)大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
抚远县| 文成县| 太保市| 潮州市| 呼玛县| 昌图县| 磐安县| 永安市| 凌云县| 寿宁县| 泸水县| 克山县| 永川市| 开化县| 礼泉县| 中西区| 合阳县| 青川县| 长海县| 贡山| 元谋县| 石首市| 霍山县| 勐海县| 罗江县| 博湖县| 凤台县| 榕江县| 科技| 会泽县| 中宁县| 屏山县| 泰州市| 永嘉县| 子长县| 时尚| 积石山| 雅安市| 固镇县| 英吉沙县| 信阳市|