一種基于采樣剖析的輕量級程序代碼重排方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,更具體地說,本發(fā)明涉及一種基于采樣剖析的輕量級程序代碼重排方法。
【背景技術(shù)】
[0002]Cache (高速緩存)失效是影響Cache性能進(jìn)而影響處理器性能的一個重要因素?,F(xiàn)代高性能處理器都采用每拍多發(fā)射的體系結(jié)構(gòu),快速的指令發(fā)射要求快速的指令讀取。因此,如何減少Cache失效,提高指令Cache命中率成了優(yōu)化技術(shù)關(guān)注的一個焦點。
[0003]Cache失效可以分為強(qiáng)制失效、容量失效和沖突失效三類,采用軟件實現(xiàn)的代碼重排技術(shù)可以很大程度上降低Cache容量失效和沖突失效的頻率。代碼重排是指以提高Cache命中率為目的,根據(jù)一定規(guī)則改變代碼排列次序的技術(shù)。當(dāng)前,代碼重排可以分為兩類:一類是靜態(tài)排序法,即在程序編譯優(yōu)化或鏈接時實現(xiàn)的代碼重排;另一類是動態(tài)重排法,即在程序運(yùn)行過程中根據(jù)程序運(yùn)行時的動態(tài)信息實現(xiàn)代碼重排。
[0004]然而,現(xiàn)有的靜態(tài)排序法和動態(tài)重排法都存在自身的缺陷。
[0005]靜態(tài)排序法通過程序中分支的轉(zhuǎn)移頻率計算代碼的調(diào)用頻率,指導(dǎo)代碼的排序。分支的轉(zhuǎn)移頻率和代碼執(zhí)行頻率既可以在編譯時根據(jù)啟發(fā)信息預(yù)測,也可以通過程序以往的運(yùn)行信息而獲得。前者預(yù)測的準(zhǔn)確率不如后者。后者需要兩遍編譯,第一遍在程序中插粧并運(yùn)行一個小的數(shù)據(jù)集來收集程序運(yùn)行時輪廓(profile)信息,第二遍編譯則根據(jù)反饋的輪廓信息指導(dǎo)優(yōu)化。靜態(tài)排序法的缺點是對編譯器的改動較大,編譯開銷較大。
[0006]動態(tài)重排法是在程序運(yùn)行過程中借助于其他工具,根據(jù)程序運(yùn)行的動態(tài)信息實現(xiàn)代碼的重排。該技術(shù)的缺點是程序運(yùn)行時開銷較大。
【發(fā)明內(nèi)容】
[0007]本發(fā)明所要解決的技術(shù)問題是針對現(xiàn)有技術(shù)中存在上述缺陷,提供一種能夠優(yōu)化程序局部性、提高指令Cache命中率以提升程序性能的基于采樣剖析的輕量級程序代碼重排方法。
[0008]為了實現(xiàn)上述技術(shù)目的,根據(jù)本發(fā)明,提供了一種基于采樣剖析的輕量級程序代碼重排方法,包括:
[0009]第一步驟:編譯鏈接程序,其中預(yù)留一段代碼空間;
[0010]第二步驟:加載器讀入目標(biāo)程序;
[0011]第三步驟:使得目標(biāo)程序運(yùn)行一遍,加載器收集目標(biāo)程序運(yùn)行時運(yùn)行信息;
[0012]第四步驟:利用收集到的運(yùn)行信息指導(dǎo)代碼重排;
[0013]第五步驟:對代碼執(zhí)行墊塞優(yōu)化;
[0014]第六步驟:將墊塞優(yōu)化后的代碼寫進(jìn)新的目標(biāo)程序。
[0015]優(yōu)選地,在第二步驟中,加載器讀入程序信息。
[0016]優(yōu)選地,程序信息包括目標(biāo)程序的文件頭、代碼段和數(shù)據(jù)段。
[0017]優(yōu)選地,在第三步驟中,加載器通過插粧手段收集程序運(yùn)行時各函數(shù)代碼段的運(yùn)行信息。
[0018]優(yōu)選地,運(yùn)行信息包括調(diào)用頻率、調(diào)用關(guān)系和運(yùn)行時間。
[0019]優(yōu)選地,在第四步驟中,根據(jù)收集到的運(yùn)行信息進(jìn)行分析以獲知程序熱點函數(shù)信息,進(jìn)而拷貝熱點函數(shù)代碼至預(yù)留的代碼空間,相應(yīng)地更新代碼空間中的熱點函數(shù)的符號表與全局變量表信息,調(diào)整指令跳轉(zhuǎn)地址。
[0020]優(yōu)選地,在第五步驟中,將代碼空間中的熱點函數(shù)代碼在代碼空間中進(jìn)行多份拷貝并對拷貝的副本進(jìn)行偏移。
[0021]本發(fā)明結(jié)合靜態(tài)排序法和動態(tài)重排法兩者的特點,提出一種基于采樣剖析的輕量級程序代碼重排裝置,通過加載器實現(xiàn),加載器讀入目標(biāo)程序,在第一遍程序運(yùn)行時采用插粧采樣的方式動態(tài)收集程序運(yùn)行時信息并用于指導(dǎo)代碼重排與墊塞優(yōu)化,生成優(yōu)化的目標(biāo)程序,達(dá)到優(yōu)化程序局部性、提高指令cache命中率以提升程序性能的目的。
【附圖說明】
[0022]結(jié)合附圖,并通過參考下面的詳細(xì)描述,將會更容易地對本發(fā)明有更完整的理解并且更容易地理解其伴隨的優(yōu)點和特征,其中:
[0023]圖1示意性地示出了根據(jù)本發(fā)明優(yōu)選實施例的基于采樣剖析的輕量級程序代碼重排方法的流程圖。
[0024]需要說明的是,附圖用于說明本發(fā)明,而非限制本發(fā)明。注意,表示結(jié)構(gòu)的附圖可能并非按比例繪制。并且,附圖中,相同或者類似的元件標(biāo)有相同或者類似的標(biāo)號。
【具體實施方式】
[0025]為了使本發(fā)明的內(nèi)容更加清楚和易懂,下面結(jié)合具體實施例和附圖對本發(fā)明的內(nèi)容進(jìn)行詳細(xì)描述。
[0026]本發(fā)明提出一種基于采樣剖析的輕量級程序代碼重排裝置,結(jié)合靜態(tài)排序法和動態(tài)重排法兩者的特點,實現(xiàn)流程如圖1所示。首先,在編譯鏈接程序時預(yù)留一段代碼空間用于代碼重排與墊塞;然后,加載器讀入文件頭、代碼段、數(shù)據(jù)段等程序信息,在程序第一遍運(yùn)行時通過插粧手段收集程序運(yùn)行時各函數(shù)代碼段的調(diào)用頻率、調(diào)用關(guān)系、運(yùn)行時間等信息,并將收集的信息用于指導(dǎo)代碼重排,將頻繁調(diào)用的熱點函數(shù)代碼段提取出來并排列在一起拷貝到預(yù)留的代碼空間,同時對熱點函數(shù)的符號表和got表做相應(yīng)的拷貝或修改;最后,將拷貝的熱點函數(shù)代碼段寫入到新的目標(biāo)代碼。
[0027]單靠代碼重排并不能完全避免指令Cache沖突不命中,存在調(diào)用關(guān)系的兩個熱點函數(shù)經(jīng)過代碼重排后映射到Cache行時仍有可能發(fā)生沖突不命中的情況,如果這兩個熱點函數(shù)存在循環(huán)調(diào)用的關(guān)系,則會導(dǎo)致連續(xù)的指令Cache不命中,大大降低程序的運(yùn)行性能,針對這種情況我們在代碼重排的基礎(chǔ)上增加墊塞優(yōu)化。墊塞優(yōu)化是將拷貝重排后的熱點函數(shù)代碼繼續(xù)進(jìn)行多份拷貝并做一定的偏移,使得程序調(diào)用時的跳轉(zhuǎn)地址可以有多種選擇,從中選擇最優(yōu)的一份拷貝進(jìn)行跳轉(zhuǎn),以此達(dá)到最大可能地避免指令Cache沖突不命中的發(fā)生。
[0028]圖1示意性地示出了根據(jù)本發(fā)明優(yōu)選實施例的基于采樣剖析的輕量級程序代碼重排方法的流程圖。
[0029]如圖1所示,根據(jù)本發(fā)明優(yōu)選實施例的基于采樣剖析的輕量級程序代碼重排方法包括:
[0030]第一步驟S1:編譯鏈接程序,其中預(yù)留一段代碼空間;具體地,代碼重排與墊塞優(yōu)化需用到一段代碼空間,編譯鏈接程序為其預(yù)留。
[0031]第二步驟S2:加載器讀入目標(biāo)程序;具體地,在第二步驟中,加載器讀入目標(biāo)程序的文件頭、代碼段、數(shù)據(jù)段等程序信息。
[0032]第三步驟S3:使得目標(biāo)程序運(yùn)行一遍,加載器收集目標(biāo)程序運(yùn)行時運(yùn)行信息;具體地,在第三步驟中,加載器通過插粧手段收集程序運(yùn)行時各函數(shù)代碼段的調(diào)用頻率、調(diào)用關(guān)系、運(yùn)行時間等運(yùn)行信息。
[0033]第四步驟S4:用收集到的運(yùn)行信息指導(dǎo)代碼重排;具體地,在第四步驟中,根據(jù)收集到的運(yùn)行信息進(jìn)行分析以獲知程序熱點函數(shù)信息,進(jìn)而拷貝熱點函數(shù)代碼至預(yù)留的代碼空間,相應(yīng)地更新代碼空間中的熱點函數(shù)的符號表與全局變量(GOT,Global OffsetTable)表信息,調(diào)整指令跳轉(zhuǎn)地址(即重排)。
[0034]第五步驟S5:對代碼執(zhí)行墊塞優(yōu)化;優(yōu)選地,在第五步驟中,將代碼空間中的熱點函數(shù)代碼在代碼空間中進(jìn)行多份拷貝并對拷貝的副本進(jìn)行偏移,這樣程序調(diào)用時的跳轉(zhuǎn)地址可以有多種選擇,可以有利地從中選擇指令Cache沖突最小的一份拷貝進(jìn)行跳轉(zhuǎn),調(diào)整指令跳轉(zhuǎn)地址。
[0035]第六步驟S6:將墊塞優(yōu)化后的代碼寫進(jìn)新的目標(biāo)程序。
[0036]本發(fā)明結(jié)合采用動態(tài)獲取程序運(yùn)行時信息和靜態(tài)排序的方式,實現(xiàn)代碼重排。而且本發(fā)明針對存在調(diào)用關(guān)系的兩個函數(shù)有可能發(fā)生指令Cache沖突不命中的情況,采用墊塞優(yōu)化處理。
[0037]本發(fā)明針對用戶程序執(zhí)行時的指令Cache失效問題,結(jié)合采用動態(tài)獲取程序運(yùn)行時信息和靜態(tài)排序的方式實現(xiàn)代碼重排和墊塞優(yōu)化,能夠有效避免靜態(tài)排序法帶來的編譯開銷和動態(tài)重排法帶來的運(yùn)行時開銷。同時本發(fā)明在目標(biāo)碼級進(jìn)行優(yōu)化,能夠完全獲得程序指令的虛地址與指令Cache的映射關(guān)系,在此基礎(chǔ)上可以進(jìn)行更有針對性的優(yōu)化。本發(fā)明以增加少量代碼空間的代價達(dá)到了優(yōu)化程序局部性提高指令Cache命中率的目的,提升了程序的性能。
[0038]此外,需要說明的是,除非特別說明或者指出,否則說明書中的術(shù)語“第一”、“第二”、“第三”等描述僅僅用于區(qū)分說明書中的各個組件、元素、步驟等,而不是用于表示各個組件、元素、步驟之間的邏輯關(guān)系或者順序關(guān)系等。
[0039]可以理解的是,雖然本發(fā)明已以較佳實施例披露如上,然而上述實施例并非用以限定本發(fā)明。對于任何熟悉本領(lǐng)域的技術(shù)人員而言,在不脫離本發(fā)明技術(shù)方案范圍情況下,都可利用上述揭示的技術(shù)內(nèi)容對本發(fā)明技術(shù)方案作出許多可能的變動和修飾,或修改為等同變化的等效實施例。因此,凡是未脫離本發(fā)明技術(shù)方案的內(nèi)容,依據(jù)本發(fā)明的技術(shù)實質(zhì)對以上實施例所做的任何簡單修改、等同變化及修飾,均仍屬于本發(fā)明技術(shù)方案保護(hù)的范圍內(nèi)。
【主權(quán)項】
1.一種基于采樣剖析的輕量級程序代碼重排方法,其特征在于包括:第一步驟:編譯鏈接程序,其中預(yù)留一段代碼空間;第二步驟:加載器讀入目標(biāo)程序;第三步驟:使得目標(biāo)程序運(yùn)行一遍,加載器收集目標(biāo)程序運(yùn)行時運(yùn)行信息;第四步驟:利用收集到的運(yùn)行信息指導(dǎo)代碼重排;第五步驟:對代碼執(zhí)行墊塞優(yōu)化;第六步驟:將墊塞優(yōu)化后的代碼寫進(jìn)新的目標(biāo)程序。2.根據(jù)權(quán)利要求1所述的基于采樣剖析的輕量級程序代碼重排方法,其特征在于,在第二步驟中,加載器讀入程序信息。3.根據(jù)權(quán)利要求1或2所述的基于采樣剖析的輕量級程序代碼重排方法,其特征在于,程序信息包括目標(biāo)程序的文件頭、代碼段和數(shù)據(jù)段。4.根據(jù)權(quán)利要求1或2所述的基于采樣剖析的輕量級程序代碼重排方法,其特征在于,在第三步驟中,加載器通過插粧手段收集程序運(yùn)行時各函數(shù)代碼段的運(yùn)行信息。5.根據(jù)權(quán)利要求1或2所述的基于采樣剖析的輕量級程序代碼重排方法,其特征在于,運(yùn)行信息包括調(diào)用頻率、調(diào)用關(guān)系和運(yùn)行時間。6.根據(jù)權(quán)利要求1或2所述的基于采樣剖析的輕量級程序代碼重排方法,其特征在于,在第四步驟中,根據(jù)收集到的運(yùn)行信息進(jìn)行分析以獲知程序熱點函數(shù)信息,進(jìn)而拷貝熱點函數(shù)代碼至預(yù)留的代碼空間,相應(yīng)地更新代碼空間中的熱點函數(shù)的符號表與全局變量表信息,調(diào)整指令跳轉(zhuǎn)地址。7.根據(jù)權(quán)利要求1或2所述的基于采樣剖析的輕量級程序代碼重排方法,其特征在于,在第五步驟中,將代碼空間中的熱點函數(shù)代碼在代碼空間中進(jìn)行多份拷貝并對拷貝的副本進(jìn)行偏移。
【專利摘要】本發(fā)明提供了一種基于采樣剖析的輕量級程序代碼重排方法,包括:編譯鏈接程序,其中預(yù)留一段代碼空間;加載器讀入目標(biāo)程序;使得目標(biāo)程序運(yùn)行一遍,加載器收集目標(biāo)程序運(yùn)行時運(yùn)行信息;利用收集到的運(yùn)行信息指導(dǎo)代碼重排;對代碼執(zhí)行墊塞優(yōu)化;將墊塞優(yōu)化后的代碼寫進(jìn)新的目標(biāo)程序。
【IPC分類】G06F9/445, G06F12/0802
【公開號】CN105279004
【申請?zhí)枴緾N201510830299
【發(fā)明人】錢宏, 王飛, 吳偉, 李中升, 尉紅梅, 漆鋒濱
【申請人】無錫江南計算技術(shù)研究所
【公開日】2016年1月27日
【申請日】2015年11月24日