• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于Open64上的特殊指令合成策略研究與實現(xiàn)

    2018-03-28 06:03:14陳金娥黃勝兵
    軟件工程 2018年2期

    陳金娥 黃勝兵

    摘 要:Open64是一個擁有GNU通用公共許可證的開源高性能編譯器,設(shè)計結(jié)構(gòu)好,分析優(yōu)化全面,是編譯器高級研究的理想平臺。本文針對BWDSP處理器所提供的高效特殊運算指令,在Open64基礎(chǔ)上研究并實現(xiàn)了面向BWDSP中的特殊指令合成策略。該策略通過擴展并重定向編譯器后端模塊,能夠充分地利用BWDSP中的復(fù)數(shù)指令、累加指令、乘累加指令和平方和指令等特殊指令。實驗結(jié)果表明,本文提出的特殊指令合成策略能夠很大程度上提高程序的性能。

    關(guān)鍵詞:Open64編譯器;特殊指令合成;超長指令字

    中圖分類號:TP311.54 文獻(xiàn)標(biāo)識碼: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ù)字信號處理器。根據(jù)其面向的計算領(lǐng)域提供了大量的特殊指令[1,2],包括復(fù)數(shù)指令、累加指令、乘累加指令和平方和指令等。

    本文以O(shè)pen64作為面向BWDSP體系結(jié)構(gòu)的編譯器研究框架。Open64是一個運行在Linux下的C、C++、Fortran編譯器基礎(chǔ)設(shè)施[3],其前端將源程序轉(zhuǎn)化為中間表示W(wǎng)HIRL,后端讀入中間語言WHIRL,經(jīng)過翻譯生成CG階段(Code Generation)的中間表示(CGIR),再經(jīng)過一系列優(yōu)化,最終CGIR經(jīng)過代碼輸出生成匯編程序[4]。Open64編譯器的架構(gòu)如圖1所示。

    本文主要解決如何將高級程序語言代碼通過編譯器直接生成BWDSP指令系統(tǒng)中的特殊指令,并在Open64編譯基礎(chǔ)設(shè)施上提出并實現(xiàn)了面向BWDSP體系結(jié)構(gòu)的特殊指令合成策略,能夠較好地利用BWDSP的特殊指令來提高應(yīng)用程序的性能。

    2 特殊指令合成策略(Special instruction synthesis strategy)

    2.1 復(fù)數(shù)指令合成

    原Open64編譯基礎(chǔ)設(shè)施內(nèi)部提供了浮點復(fù)數(shù)類型,因此編譯器前端能夠直接處理浮點復(fù)數(shù)類型源代碼。然而編譯器后端為了能夠生成處理復(fù)數(shù)形式的匯編代碼,在中間語言WHIRL的Middle WHIRL上又將復(fù)數(shù)類型C4下降為Float類型來進(jìn)行處理。為了充分利用BWDSP處理器的特點,必須將復(fù)數(shù)類型到浮點類型的轉(zhuǎn)換過程進(jìn)行屏蔽,使其直接處理復(fù)數(shù)類型的中間語言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ù)類型C4的中間語言WHIRL在后端的代碼生成階段(CG_Generate_Code)直接將其注釋為BWDSP體系結(jié)構(gòu)中的復(fù)數(shù)指令。

    2.2 累加和乘累加類指令合成

    原Open64編譯器基礎(chǔ)設(shè)施中累加和乘累加類指令通常是由數(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編譯器在中間語言WHIRL上生成的累加操作直接進(jì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>

    該類指令與復(fù)數(shù)指令的處理類似,將生成帶累加操作的中間語言WHIRL,在后端代碼生成階段直接將其注釋為BWDSP體系結(jié)構(gòu)中的累加和乘累加類指令。

    2.3 平方和類指令合成

    平方和類指令合成與上述的兩類特殊指令合成策略有所不同。由于Open64編譯器基礎(chǔ)設(shè)施中并沒有提供相應(yīng)的平方和類指令表示,因此需要在中間語言WHIRL中增加相應(yīng)的WHIRL操作。面向BWDSP的Open64編譯器中的平方和類特殊指令的合成策略框架如圖2所示。

    例如,平方和操作(例如c=a*a+b*b)在中間語言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)的階段,因此需要對代碼生成內(nèi)部的各個階段進(jìn)行相應(yīng)的擴展和重定向,具體包括四個階段。

    3.1 機器描述

    Open64中的機器描述文件稱為Knobsfile[5],可將其按照硬件資源信息分為指令集描述、運算資源描述、寄存器描述和匯編輸出描述等四類信息。Open64的機器描述采用的是二次編譯的方式設(shè)計的,編譯器通過采用Intel提供的可解析特點格式的信息文件工具KAPI來生成BWDSP使用的數(shù)據(jù)和文件,即只需在v11-itanium-extra.knb和v12-itanium-extra.knb文件中添加相應(yīng)特殊指令的機器描述,就可以生成相應(yīng)動態(tài)鏈接庫供編譯器在使用過程中調(diào)用。

    3.2 指令注釋

    Open64中的指令注釋主要是將中間語言WHIRL轉(zhuǎn)換為代碼生成內(nèi)部的中間表示CGIR,該過程位于CG_Expand中,特殊指令的注釋主要分為如下幾類。

    (1)復(fù)數(shù)指令注釋

    原Open64框架中并沒有提供復(fù)數(shù)寄存器對的概念,因此需要擴展虛擬寄存器的數(shù)據(jù)結(jié)構(gòu)TN,在其中增加數(shù)據(jù)域TN_Pair用來表示復(fù)數(shù)寄存器對。指令注釋過程中直接將帶復(fù)數(shù)類型C4的WHIRL節(jié)點注釋成為復(fù)數(shù)指令。此外,對于復(fù)數(shù)乘法運算(如c=a*b),BWDSP指令系統(tǒng)并沒有提供完整的復(fù)數(shù)指令,因此需要在其中插入兩條運算指令,如下所示:

    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

    //插入運算指令

    FRs+1=FRn+FRm

    FRs=FRn+1-FRm+1

    [Us+=2,0]=Rs+1:s //存儲復(fù)數(shù)c

    (2)累加和乘累加類指令注釋

    對于該類指令的注釋,需要在虛擬寄存器數(shù)據(jù)結(jié)構(gòu)TN中增加表示累加信息的數(shù)據(jù)域TN_Acc和乘累加信息的數(shù)據(jù)域TN_Macc,以便后面的寄存器分配處理。另外還需要在該類指令前面插入一條初始化指令。例如c+=a*b運算的指令注釋如下所示:

    Clr Macc //初始化清零

    Rm=[Um+=1,0] //源操作數(shù)a

    Rn=[Un+=1,0] //源操作數(shù)b

    Macc0+=Rm*Rn //乘累加操作

    Rs=Macc0

    [Us+=1,0]=Rs //存儲目的操作數(shù)c

    (3)平方和類指令注釋

    平方和指令的注釋與普通指令的注釋完全一致,只需按照普通指令的注釋方式進(jìn)行指令注釋即可。

    3.3 寄存器分配

    寄存器分配階段是根據(jù)虛擬寄存器TN中的相關(guān)寄存器信息為每個虛擬寄存器TN分配相應(yīng)的物理寄存器。Open64中的寄存器分配包括全局寄存器分配和局部寄存器分配[5]。傳統(tǒng)的通用處理器中并沒有提供A/B面寄存器,即復(fù)數(shù)寄存器對,故該處需要考慮寄存器對信息并進(jìn)行相應(yīng)的特殊處理。

    面向BWDSP的Open64編譯器沿用并擴展了原Open64中的寄存器分配算法,這里采用的策略是優(yōu)先考慮A/B面寄存器等特殊情況。通過TN中的TN_Pair數(shù)據(jù)域,將TN寄存器對作為一個整體來處理,在寄存器分配時給其分配連續(xù)并且低位寄存器編號為偶數(shù)的兩個物理寄存器,即復(fù)數(shù)寄存器對。

    對于累加指令和乘累加指令的寄存器分配,則只需要根據(jù)虛擬寄存器TN中的數(shù)據(jù)域TN_Pair和TN_Macc分別分配相應(yīng)的累加寄存器ACC和乘累加寄存器MACC即可。

    3.4 匯編代碼輸出

    面向BWDSP的Open64編譯器中的匯編代碼輸出模塊主要是根據(jù)BWDSP中的指令集特點,按照其相應(yīng)的匯編格式輸出相應(yīng)的匯編代碼程序。該過程位于cgemit.cxx文件中。對于復(fù)數(shù)指令的匯編代碼,其中的兩個寄存器對之間必須用”:”來表示,并且低位寄存器編號必須有偶數(shù);對于累加指令則需要在累加寄存器的編號前面加上標(biāo)識Acc;對于乘累加指令,則加上標(biāo)識Macc等。

    4 結(jié)論(Conclusion)

    本文在Open64編譯基礎(chǔ)設(shè)施上設(shè)計并實現(xiàn)了上述的特殊指令合成策略,為了驗證該方案的效果,我們選取用于測試DSP編譯器性能的、在DSP數(shù)字信號處理領(lǐng)域具有典型應(yīng)用的部分運算作為測試集,詳見表1。

    本文采用加速比來表示程序優(yōu)化前后性能的好壞,加速比越大,表示程序經(jīng)過特殊指令合成前后周期之間的差距越大,程序的優(yōu)化性能越顯著;相反則表示程序的優(yōu)化性能不夠明顯。實驗結(jié)果詳見表2。

    從表2中可以看出,針對表1中的7個基準(zhǔn)測試用例,采用本文提出的特殊指令合成策略,其平均加速比大約為1.05。因此,通過本文提出的特殊指令合成策略,能夠使得DSP中一些常用的特殊操作運算程序的性能得到很大的提升。

    參考文獻(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的傳播分簇算法研究與實現(xiàn)[J].中國集成電路,2014,23(8):24-28.

    [5] 蔣奕.龍芯1編譯器中的指令調(diào)度相關(guān)優(yōu)化[D].北京:中國科學(xué)院研究生,2004:8-11.

    作者簡介:

    陳金娥(1979-),女,碩士,助教.研究領(lǐng)域:軟件工程.

    黃勝兵(1990-),男,碩士,工程師.研究領(lǐng)域:系統(tǒng)軟件開發(fā).

    睢宁县| 石嘴山市| 喀喇| 临泉县| 荃湾区| 呼图壁县| 龙口市| 延寿县| 东台市| 颍上县| 玛沁县| 曲沃县| 南部县| 昌江| 合江县| 成都市| 万山特区| 五家渠市| 治多县| 德安县| 新河县| 阿合奇县| 华阴市| 锡林浩特市| 中阳县| 宁夏| 黑河市| 洛隆县| 汾阳市| 金堂县| 绥芬河市| 新平| 九龙坡区| 自治县| 长沙县| 香河县| 临泽县| 奉贤区| 安徽省| 珲春市| 汝阳县|