高秀武,姜軍,白書敬,黃亮明
(江南計(jì)算技術(shù)研究所,江蘇 無錫 214083)
隨著大數(shù)據(jù)、云計(jì)算、物聯(lián)網(wǎng)等新興技術(shù)的快速發(fā)展,許多應(yīng)用軟件的計(jì)算量呈指數(shù)級(jí)增長(zhǎng),人們對(duì)高性能處理器需求也逐漸增加[1]?;趪?guó)產(chǎn)異構(gòu)眾核處理器研制的“神威-太湖之光”超級(jí)計(jì)算機(jī)連續(xù)多年在高性能計(jì)算機(jī)排行榜TOP500[2-3]中位于第一梯隊(duì)。由此可見,國(guó)產(chǎn)高性能處理器已經(jīng)達(dá)到世界領(lǐng)先水平,但由于國(guó)產(chǎn)處理器軟件生態(tài)不成熟,應(yīng)用程序?qū)嶋H性能與處理器峰值性能還存在較大差距[4]。另外,用戶不熟悉國(guó)產(chǎn)處理器微結(jié)構(gòu),且手工優(yōu)化代價(jià)高,難以發(fā)揮國(guó)產(chǎn)處理器高性能的內(nèi)部操作能力,容易導(dǎo)致應(yīng)用程序性能低下。編譯優(yōu)化是在一定處理器資源的前提下,通過對(duì)程序代碼進(jìn)行重組、對(duì)指令的執(zhí)行順序進(jìn)行調(diào)度等手段,充分發(fā)揮處理器的內(nèi)部操作能力,達(dá)到提高應(yīng)用程序運(yùn)行性能的目的。因此,針對(duì)國(guó)產(chǎn)處理器指令集架構(gòu)與微結(jié)構(gòu)特征,進(jìn)行深層次的編譯優(yōu)化,進(jìn)一步挖掘國(guó)產(chǎn)處理器的計(jì)算能力是十分必要的。
現(xiàn)代處理器普遍采用馮·諾依曼體系結(jié)構(gòu),代碼與數(shù)據(jù)存儲(chǔ)在內(nèi)存中,與處理器計(jì)算控制單元相隔離。處理器的任何操作都要首先從內(nèi)存中取得指令與數(shù)據(jù),然后進(jìn)行相應(yīng)操作,最后將運(yùn)算結(jié)果寫回內(nèi)存。然而,由于制造工藝的不同,存儲(chǔ)器與處理器性能發(fā)展呈現(xiàn)不均衡增長(zhǎng),由此引發(fā)的“存儲(chǔ)墻”[5-6]問題成為阻礙處理器性能發(fā)揮的主要因素之一。因此,如何設(shè)計(jì)高性能的存儲(chǔ)器系統(tǒng)以及提升片上存儲(chǔ)系統(tǒng)利用率與訪問效率,成為處理器系統(tǒng)性能優(yōu)化長(zhǎng)期以來研究和關(guān)注的熱點(diǎn)。本文針對(duì)應(yīng)用程序中頻繁出現(xiàn)的內(nèi)存地址計(jì)算低效問題,基于國(guó)產(chǎn)多核申威(SW)處理器提供的帶擴(kuò)展因子的運(yùn)算指令,提出一種加速訪存地址計(jì)算的編譯優(yōu)化方法,充分發(fā)揮國(guó)產(chǎn)高性能處理器計(jì)算能力來快速計(jì)算內(nèi)存地址,進(jìn)而加快訪存指令的發(fā)射與執(zhí)行,以此達(dá)到提高存儲(chǔ)器系統(tǒng)訪問效率的目的。
為解決處理器與存儲(chǔ)器之間的速度差異,SMITH 等[7]提出了Cache 概念,并在Intel Pentium 處理器中實(shí)現(xiàn)了Cache。Cache 是存儲(chǔ)器與處理器之間的過渡橋梁,容量小但訪問速度快,幾乎接近處理器的處理速度。Cache 利用程序的局部性原理[8-9],將處理器所需要的指令與數(shù)據(jù)存放在Cache 中,減少了對(duì)片外主存的直接訪問次數(shù),從而提高處理器對(duì)數(shù)據(jù)和指令的訪問速度。采用Cache 這種方式能夠有效緩解處理器與存儲(chǔ)器之間速度不匹配的“存儲(chǔ)墻”問題,但隨著片上多核處理器的出現(xiàn)與單芯片執(zhí)行核數(shù)的增加,單位時(shí)間內(nèi)整個(gè)芯片執(zhí)行的指令與數(shù)據(jù)也隨核數(shù)增加呈線性增長(zhǎng),“存儲(chǔ)墻”問題也越來越嚴(yán)重。應(yīng)用程序的執(zhí)行時(shí)間也越來越受限于數(shù)據(jù)的訪問延遲,對(duì)存儲(chǔ)器與處理器之間訪存帶寬與訪問速率都有更高的需求。為滿足片上多核更高的訪存帶寬與更快的訪問速率,現(xiàn)代處理器在Cache的基礎(chǔ)上引入了層次化存儲(chǔ)結(jié)構(gòu)[10],并且隨著多核處理器的不斷發(fā)展,層次化的存儲(chǔ)結(jié)構(gòu)也變得十分復(fù)雜。至此,學(xué)術(shù)界與工業(yè)界都開始著重研究如何利用多核處理器片上豐富的Cache 資源來優(yōu)化應(yīng)用程序的執(zhí)行性能,主要包括Cache 管理策略優(yōu)化、內(nèi)存管理以及編譯優(yōu)化等。
Cache 管理策略優(yōu)化主要涉及Cache 淘汰算法優(yōu)化、Cache 劃分與調(diào)度機(jī)制以及Cache 一致性維護(hù)協(xié)議開銷優(yōu)化?,F(xiàn)代處理器普遍采用最近最少使用(Least Recently Used,LRU)淘汰策略[11],這種策略的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單且對(duì)局部性較好的程序效果較好,但對(duì)于抖動(dòng)訪問模式與混合訪問模式[12]的程序不友好,會(huì)降低Cache 的利用率。針對(duì)數(shù)據(jù)抖動(dòng)訪存,QURESHI 等[13]提出一種通過保護(hù)局部性較強(qiáng)的數(shù)據(jù)來防止數(shù)據(jù)的動(dòng)態(tài)插入策略(Dynamic Insertion Policy,DIP)。JALEEL 等[12]在替換算法中加入重引用距離預(yù)測(cè)(Re-Reference Interval Prediction,RRIP)機(jī)制,并提出基于RRIP 的緩存塊替換算法,進(jìn)一步提高Cache 命中率。文獻(xiàn)[14-15]研究Cache 劃分機(jī)制,根據(jù)程序運(yùn)行時(shí)的行為將運(yùn)行程序的數(shù)據(jù)固定在某一Cache 區(qū)間,防止不同特征程序相互干擾,從而提升系統(tǒng)的整體性能。文獻(xiàn)[16]提出數(shù)據(jù)局部性感知的Cache 數(shù)據(jù)一致性維護(hù)協(xié)議,高效地管理片上多核處理器中的分布式和私有Cache。
在內(nèi)存管理方面,現(xiàn)代處理器都會(huì)采用TLB 來加速虛擬地址到物理地址的映射。但由于TLB 容量有限,無法同時(shí)存儲(chǔ)所有工作負(fù)載的虛實(shí)映射關(guān)系,當(dāng)工作負(fù)載的數(shù)據(jù)量超過一定的范圍時(shí),會(huì)導(dǎo)致程序在查詢TLB 時(shí)頻繁發(fā)生TLB 缺頁,這將極大影響程序的訪存性能。因此,研究人員普遍采用大頁技術(shù)[17]、預(yù)取技術(shù)[18]、分級(jí)分區(qū)的轉(zhuǎn)換緩存[19-20]等方法來提高TLB 的命中率。
編譯優(yōu)化是在一定處理器資源的前提下,通過對(duì)程序代碼進(jìn)行重組、對(duì)指令執(zhí)行順序進(jìn)行調(diào)度等手段,充分發(fā)揮處理器的內(nèi)部操作能力,達(dá)到提高應(yīng)用程序運(yùn)行性能的目的。文獻(xiàn)[21]提出使用靜態(tài)單賦值圖作為程序中間表示,并采用分區(qū)布爾二次型問題來尋找最優(yōu)指令選擇。文獻(xiàn)[22]介紹了一種針對(duì)寄存器分配與指令調(diào)度的組合優(yōu)化方法,通過犧牲編譯時(shí)間獲取更多的優(yōu)化機(jī)會(huì)。文獻(xiàn)[23]針對(duì)嵌入CPU C-SKY 的地址立即數(shù)管理問題,通過編譯優(yōu)化來減少內(nèi)存訪問指令的生成,從而提高應(yīng)用程序的性能。文獻(xiàn)[24]介紹了GCC 編譯器預(yù)取技術(shù)的實(shí)現(xiàn)與分析,通過編譯器為應(yīng)用程序生成預(yù)取指令,通過預(yù)取技術(shù)來提高應(yīng)用程序的Cache 命中率。所以,通過編譯優(yōu)化可以進(jìn)一步挖掘處理器系統(tǒng)的潛能。本文針對(duì)給定的處理器系統(tǒng),基于其指令集特征,提出一種加快訪存地址計(jì)算的編譯優(yōu)化,加速訪存指令的執(zhí)行與發(fā)射,從而提高存儲(chǔ)系統(tǒng)的訪存效率。
國(guó)產(chǎn)SW 處理器基于具有自主知識(shí)產(chǎn)權(quán)的“SW指令集系統(tǒng)”自主設(shè)計(jì)研制完成,是一種RISC 架構(gòu)的高性能處理器,采用多核架構(gòu)和片上系統(tǒng)技術(shù)。其核心采用亂序發(fā)射、亂序執(zhí)行以及推測(cè)執(zhí)行等技術(shù)實(shí)現(xiàn)4 譯碼7 發(fā)射的超標(biāo)量結(jié)構(gòu),支持256 位整數(shù)/浮點(diǎn)向量運(yùn)算。核心微結(jié)構(gòu)如圖1 所示。
圖1 SW 處理器核心微結(jié)構(gòu)Fig.1 Core microstructure of SW processor
國(guó)產(chǎn)SW 處理器為64 位字長(zhǎng)的Load/Store 型多核處理器,存儲(chǔ)管理機(jī)制支持小端地址格式的字節(jié)尋址,尋址方式包括寄存器尋址、立即尋址、偏移尋址以及相對(duì)PC 尋址4 種模式。寄存器尋址與立即尋址用于運(yùn)算類、比較類指令,PC 尋址用于跳轉(zhuǎn)類指令,偏移尋址用于存儲(chǔ)器訪問指令。因此,國(guó)產(chǎn)SW 處理器的內(nèi)存訪問使用偏移尋址方式,即內(nèi)存的有效地址由指令中的寄存器內(nèi)容與包含在指令中的偏移量求和形成。如存儲(chǔ)裝入指令LDx Ra.wl disp.ab(Rb.ab),其指令格式如圖2 所示。該指令低16 位立即數(shù)為偏移量(disp),寄存器Rb 存儲(chǔ)基址的值,寄存器Ra 為目標(biāo)寄存器。內(nèi)存的有效地址(Vaddr)即是16 位偏移量(disp)經(jīng)符號(hào)擴(kuò)展到64 位后加上寄存器Rb 的值。
圖2 SW 處理器的內(nèi)存指令格式Fig.2 Memory instruction format of SW processor
國(guó)產(chǎn)SW 處理器核心采用超標(biāo)量流水線結(jié)構(gòu),支持亂序發(fā)射、亂序執(zhí)行、推測(cè)執(zhí)行和順序退出。因此,一條訪存指令執(zhí)行過程包括取指、譯碼、發(fā)射、地址計(jì)算、讀數(shù)據(jù)、數(shù)據(jù)選擇、指令完成以及指令提交等步驟,其中地址計(jì)算由地址生成單元AGU 完成。往往訪存指令中的基址寄存器的值依賴于訪存指令之前的運(yùn)算指令,且只有當(dāng)運(yùn)算指令完成指令提交時(shí)才能發(fā)射執(zhí)行。只有及時(shí)獲得基址寄存器的值,才能加快訪存指令的發(fā)射與執(zhí)行,從而提高處理器計(jì)算部件與訪存部件的并行性。
國(guó)產(chǎn)SW 處理器提供了帶擴(kuò)展因子的運(yùn)算指令,即一條指令可以完成擴(kuò)展因子乘法與加法或減法的組合操作。帶擴(kuò)展因子的運(yùn)算指令包括帶擴(kuò)展因子的字加、帶擴(kuò)展因子的字減、帶擴(kuò)展因子的長(zhǎng)字加、帶擴(kuò)展因子的長(zhǎng)字減等4 類指令,其指令功能如表1 所示。
表1 SW 處理器帶擴(kuò)展因子運(yùn)算指令功能描述Table 1 Function description of SW processor with extension factor operation instruction
通過分析帶擴(kuò)展因子的運(yùn)算指令功能可知,該類指令主要進(jìn)行乘4 的加減法運(yùn)算與乘8 的加減法運(yùn)算。應(yīng)用程序中存在大量以字或雙字為地址單元的數(shù)據(jù)結(jié)構(gòu),其成員的內(nèi)存地址計(jì)算涉及乘4 加減或者乘8 加減的運(yùn)算。合理使用帶擴(kuò)展因子的運(yùn)算指令可以加速這些數(shù)據(jù)結(jié)構(gòu)成員地址的計(jì)算,從而提升訪存速度。
GCC 編譯器代碼生成在其后端實(shí)現(xiàn),完成中間表示向匯編指令代碼的轉(zhuǎn)換,同時(shí)進(jìn)行一系列與架構(gòu)相關(guān)的優(yōu)化。GCC 編譯器代碼生成過程可以分為GIMPLE 中間形式轉(zhuǎn)化為IR-RTL(Intermediate Representation RTL)與IR-RTL 匹配指令模板生成匯編代碼兩個(gè)階段[25]。具體流程如圖3 所示,每一條GIMPLE 語句首先根據(jù)具有標(biāo)準(zhǔn)模板名稱(Standard Pattern Name,SPN)的指令模板構(gòu)造IR-RTL,然后對(duì)IR-RTL 序列進(jìn)行進(jìn)一步的處理,包括循環(huán)優(yōu)化、指令調(diào)度、寄存器分配、窺孔優(yōu)化等過程,最后根據(jù)包含目標(biāo)機(jī)器信息的指令模板與RTL 進(jìn)行匹配生成目標(biāo)機(jī)器的匯編代碼。
圖3 GCC 編譯器代碼生成流程Fig.3 Generation procedure of GCC compiler code
數(shù)組是在內(nèi)存中連續(xù)存儲(chǔ)的具有相同類型的一組數(shù)據(jù)的集合,廣泛地應(yīng)用于高級(jí)程序語言中。在高級(jí)程序語言中,數(shù)組元素按照“數(shù)組名[下標(biāo)]”的形式進(jìn)行訪問,形如a[i](a 為數(shù)組名,i 為下標(biāo))表示數(shù)組a 中的第i+1 個(gè)元素。為簡(jiǎn)化描述,本文以C 語言中對(duì)數(shù)組(數(shù)據(jù)類型為long int)循環(huán)賦值為示例來分析GCC 編譯器訪存地址代碼生成過程。
C 語言源代碼如下:
C 語言數(shù)組賦值會(huì)被轉(zhuǎn)換成一條GIMPLE 賦值語句,其中數(shù)組元素a[i*i]也轉(zhuǎn)化為ARRAY_REF 類型的表達(dá)式a[_1]。GCC 編譯器數(shù)組訪問代碼生成主要完成GIMPLE 賦值語句中表達(dá)式a[_1]的展開,其算法步驟如下:
步驟1通過TREE_OPERAND 接口獲取數(shù)組索引,構(gòu)建形如_1*8 的數(shù)組元素地址偏移量表達(dá)式,并將其展開為一個(gè)乘法RTX 表達(dá)式。
步驟2將數(shù)組變量基址的RTX 表達(dá)式與數(shù)組元素地址偏移量表達(dá)式合并,生成完整的數(shù)組元素地址計(jì)算表達(dá)式,即一個(gè)先乘后加的RTX 表達(dá)式。
步驟3對(duì)步驟2 產(chǎn)生的地址計(jì)算表達(dá)式進(jìn)行合法性檢查,判斷是否能對(duì)應(yīng)目標(biāo)機(jī)器的一條指令。合法性檢查是內(nèi)存地址計(jì)算代碼生成十分關(guān)鍵的一步,決定地址計(jì)算生成的代碼是否高效。SW 編譯器支持常量、寄存器以及常量加寄存器等三類地址生成方式。符合以上方式則發(fā)射對(duì)應(yīng)指令,否則對(duì)地址計(jì)算RTX 表達(dá)式進(jìn)行遞歸拆分,直至拆分的RTX滿足上述三類方式,合法性檢查流程如圖4 所示。內(nèi)存地址計(jì)算RTX 表達(dá)式經(jīng)過合法性檢驗(yàn)后,生成相應(yīng)的地址計(jì)算INSN 序列,并返回最終的內(nèi)存引用RTX 表達(dá)式。
圖4 GCC 編譯器內(nèi)存地址合法性檢查流程Fig.4 Procedure of memory address validity inspection in GCC compiler
步驟4根據(jù)步驟3 返回的內(nèi)存引用RTX 完成最后訪存指令的生成,數(shù)組訪問完整INSN 序列如下所示。數(shù)組元素a[_1]的訪問共產(chǎn)生左移(ashift)、加法(plus)以及存儲(chǔ)(mem)三條INSN 指令,地址表達(dá)式a+_1*8 被轉(zhuǎn)化為R78=R65+R76<<3。
步驟5匹配機(jī)器指令模板,將INSN 指令序列轉(zhuǎn)化成匯編代碼,如把C 語言循環(huán)語句轉(zhuǎn)換為匯編代碼。
C 語言循壞語句如下:
通過分析匯編代碼可知,數(shù)組內(nèi)存地址計(jì)算總共包括裝入立即數(shù)(ldi)、邏輯左移(sll)與長(zhǎng)字加(addl)三條指令,裝入立即數(shù)指令用于獲得數(shù)組基址,邏輯左移指令計(jì)算地址偏移,加法指令計(jì)算完整的數(shù)組地址。其中加法指令數(shù)據(jù)依賴于裝入立即數(shù)與邏輯左移指令,會(huì)阻斷處理器流水。若能合并以上指令,消除指令間的相關(guān)性,則能快速計(jì)算數(shù)組地址,加快訪存指令的發(fā)射與執(zhí)行。
通過分析GCC 編譯器數(shù)組訪問代碼生成算法可知,其核心步驟在于地址表達(dá)式合法性的檢驗(yàn)及INSN 指令的生成,即表示地址計(jì)算的RTX 表達(dá)式能否對(duì)應(yīng)目標(biāo)機(jī)器后端指令模板中的一條指令。若能則生成相應(yīng)INSN 指令,否則遞歸拆分表達(dá)式生成INSN 指令序列。
針對(duì)申威處理器的訪存地址計(jì)算編譯優(yōu)化方法就是在滿足合法性檢驗(yàn)的基礎(chǔ)上,采用申威處理器自主指令集支持的帶擴(kuò)展因子的運(yùn)算指令,替代原本要生成的多條指令來完成地址計(jì)算過程中的乘加操作,從而解決指令間存在強(qiáng)相關(guān)性帶來的處理器斷流水問題,并減少指令數(shù)量。該優(yōu)化方法主要在編譯器后端進(jìn)行實(shí)現(xiàn),包括地址合法性檢驗(yàn)算法設(shè)計(jì)與后端代碼生成兩個(gè)部分。
地址合法性檢查算法設(shè)計(jì)主要針對(duì)國(guó)產(chǎn)處理器SW3231 支持的帶擴(kuò)展因子的運(yùn)算指令新增一個(gè)合法的乘加地址模式,并基于該地址模式去識(shí)別或者檢查內(nèi)存地址計(jì)算過程中的乘加表達(dá)式,最后指導(dǎo)后端生成帶擴(kuò)展因子的加減法指令,其具體流程如圖5 所示。
圖5 地址合法性檢查算法流程Fig.5 Procedure of address validity inspection algorithm
首先,識(shí)別數(shù)組元素訪問地址計(jì)算中的乘加RTX 表達(dá)式,判斷依據(jù)為RTX 表達(dá)式類型為加法操作,且該加法操作的第一個(gè)操作數(shù)類型為乘法操作,即進(jìn)行一次先乘后加運(yùn)算。然后,判斷目標(biāo)處理器是否支持帶擴(kuò)展因子的加法操作,如不支持則遞歸拆分該乘加表達(dá)式。最后,判斷RTX 表達(dá)式乘法操作常量操作數(shù)是否為4 或者8,滿足則調(diào)用gen_sxaddl 函數(shù)并發(fā)射sxaddl 指令,否則退出遞歸拆分乘加表達(dá)式。其中g(shù)en_sxaddl 函數(shù)實(shí)現(xiàn)依賴于后端代碼生成,將在4.2 節(jié)進(jìn)行描述。合法性檢查算法修改后數(shù)組地址計(jì)算的乘加RTX 表達(dá)式不再拆分為左移與加法兩條INSN 指令,而只發(fā)射一條匹配sxaddl 指令模板的乘加IR-RTL 形式的INSN,如圖6所示。
圖6 乘加表達(dá)式展開示意圖Fig.6 Schematic diagram of multiply and add expression expansion
編譯器后端主要進(jìn)行與目標(biāo)機(jī)器緊密相關(guān)的處理與優(yōu)化,最后輸出目標(biāo)機(jī)器的匯編指令。現(xiàn)代編譯器為了提高靈活性和可移植性,通常將機(jī)器相關(guān)信息相對(duì)集中地組織到一個(gè)模塊,稱作機(jī)器描述(Machine Descriptions,MD)。MD 主要包括編譯環(huán)境、機(jī)器基本屬性、指令模板、應(yīng)用二進(jìn)制編程接口(ABI)等內(nèi)容。
為簡(jiǎn)化編譯優(yōu)化方法的代碼生成過程,帶擴(kuò)展因子的加法指令定義為具有SPN 的指令模板,并采用適合生成單條或少數(shù)條指令的define_insn 類型用于指令生成。模板中的match_operand 是第n個(gè)操作數(shù)的占位符,用來進(jìn)行操作數(shù)屬性匹配,比如第1 個(gè)match_opreand 中的DI 表示數(shù)據(jù)模式為雙字整數(shù),0是match_opreand 的第1 個(gè)參數(shù),表示第1 個(gè)操作數(shù),register_opreand 是第2 個(gè)參數(shù),表示該操作數(shù)的類型為寄存器。模板中的(INTVAL(operands[2])==4 ||INTVAL(operands[2])==8)表示指令模板的前置條件,即第2 個(gè)操作數(shù)值為4 或者8,該模板才起作用。大括號(hào)包括的內(nèi)容為模板的執(zhí)行語句,即根據(jù)第2 個(gè)操作數(shù)的值輸出對(duì)應(yīng)的匯編代碼。
sxaddl 指令模板如下:
定義了sxaddl 指令模板后,編譯器自身生成過程中會(huì)創(chuàng)建gen_sxaddl 函數(shù),該函數(shù)會(huì)構(gòu)造sxaddl 指令對(duì)應(yīng)的IR-RTL 語句,最后在Final 過程中匹配指令模板輸出匯編代碼。示例程序經(jīng)過地址優(yōu)化后,邏輯左移指令(sll)和加法指令(addl)被帶擴(kuò)展因子的加法指令替換,緩解了地址計(jì)算指令斷流水情況,從而加快數(shù)組地址計(jì)算。
優(yōu)化前匯編代碼如下:
本文基于開源編譯器GCC(版本GCC8.3.0)實(shí)現(xiàn)了地址快速運(yùn)算編譯優(yōu)化方法,并在一臺(tái)多核服務(wù)器上進(jìn)行了優(yōu)化效果評(píng)測(cè)。服務(wù)器采用國(guó)產(chǎn)多核處理器SW3231,具有運(yùn)算性能強(qiáng)、訪存帶寬高、可靠性好等特點(diǎn),同時(shí)安裝配套的Linux 操作系統(tǒng)(內(nèi)核版本4.19)。評(píng)測(cè)程序采用CPU 標(biāo)準(zhǔn)性能評(píng)估測(cè)試集SPEC2006(版本v1.2),包括SPECint 和SPECfp 兩套基準(zhǔn)測(cè)試程序。CINT2006 用于評(píng)測(cè)整數(shù)性能,包含12 道測(cè)試課題,如表2 所示。CFP2006 用于評(píng)測(cè)浮點(diǎn)性能,包含17 道測(cè)試課題,如表3 所示。
表2 SPECint 2006 課題說明Table 2 SPECint 2006 project instructions
表3 SPECfp 2006 課題說明Table 3 SPECfp 2006 project instructions
針對(duì)本文實(shí)現(xiàn)的編譯優(yōu)化,采用SPEC2006 speed 模式進(jìn)行優(yōu)化效果評(píng)測(cè)。對(duì)程序進(jìn)行編譯時(shí),基準(zhǔn)測(cè)試采用-O2 選項(xiàng)編譯,優(yōu)化選項(xiàng)只額外打開地址運(yùn)算編譯優(yōu)化選項(xiàng),課題執(zhí)行均使用標(biāo)準(zhǔn)的ref規(guī)模。
圖7 所示為SPECint 2006 課題的性能提升情況,12 道課題幾何平均性能提升2.53%。其中9 個(gè)課題有不同幅度的性能提升,401、429 課題性能提升超過7%。403、462、483 等課題性能略有下降,但下降幅度均小于1%。圖8 所示為SPECfp 2006 課題的性能提升情況,17 道課題幾何平均性能提升1.50%。其中9 個(gè)課題有不同幅度的性能提升,433、450 課題性能提升超過6%。435、453、459 等課題性能略有下降,但下降幅度均小于1%。
圖7 SPECint 2006 課題性能提升比例Fig.7 SPECint 2006 project performance improvement ratio
圖8 SPECfp 2006 課題性能提升比例Fig.8 SPECfp 2006 project performance improvement ratio
性能提升最大的課題為整數(shù)課題401.bzip2,幅度為9.16%。該課題為解壓縮程序,基于Julian Seward 的bzip2 v1.03 改寫。負(fù)載包括JPEG 圖片、可執(zhí)行程序、源程序tar 包、HTML 文件以及混合文件等部分,覆蓋了高可壓縮文件與低可壓縮文件,測(cè)試分別使用了三個(gè)不同壓縮等級(jí)進(jìn)行解壓縮[26]。在本文使用的實(shí)驗(yàn)平臺(tái)上,通過gprof 性能工具對(duì)課題函數(shù)運(yùn)行時(shí)間進(jìn)行統(tǒng)計(jì),時(shí)間占比前二的函數(shù)依次為fallbacksort、mainSort,總共占據(jù)了整個(gè)課題的60%。進(jìn)一步對(duì)兩個(gè)函數(shù)源碼進(jìn)行分析發(fā)現(xiàn),兩個(gè)函數(shù)核心段均是對(duì)數(shù)組進(jìn)行頻繁操作且為間接訪問,如fallbacksort 函數(shù)中的fmap 與eclass 數(shù)組訪問和mainSort 函數(shù)中的quadrants 數(shù)組訪問。因此,通過地址編譯優(yōu)化可以大幅提升該課題性能。
401.bzip2 課題熱點(diǎn)函數(shù)fallbacksort 核心代碼如下:
雖然多數(shù)課題都能通過地址優(yōu)化獲得正加速效果,但也有少數(shù)課題出現(xiàn)負(fù)加速效果,比如403.gcc 課題性能下降幅度最大為0.99%。通過分析該課題程序核心段匯編代碼,發(fā)現(xiàn)使用地址優(yōu)化后指令數(shù)量變化引起了指令排布不合理,從而出現(xiàn)負(fù)加速的情況。
本文針對(duì)編譯器生成的訪存地址計(jì)算代碼效率低的問題,基于國(guó)產(chǎn)SW 處理器支持的帶擴(kuò)展因子運(yùn)算指令,提出一種加速訪存地址計(jì)算的編譯優(yōu)化方法。通過在編譯器內(nèi)存地址表達(dá)式合法性檢查算法中識(shí)別乘加模式,并在代碼生成階段匹配生成帶擴(kuò)展因子的運(yùn)算指令來計(jì)算訪存地址,加快訪存指令的發(fā)射與執(zhí)行,從而提高國(guó)產(chǎn)SW 處理器訪存效率。實(shí)驗(yàn)結(jié)果表明,該優(yōu)化方法能夠有效解決內(nèi)存地址計(jì)算低效問題,提高國(guó)產(chǎn)SW 處理器系統(tǒng)的計(jì)算能力。下一步將分析SPEC CPU2006 部分程序倒加速原因,總結(jié)內(nèi)存地址計(jì)算不同情形下的最優(yōu)代碼生成方案,完善GCC 編譯器內(nèi)存地址計(jì)算代碼生成優(yōu)化。