李 男,龐建民,單 征
(解放軍信息工程大學,河南 鄭州 450002)
以龍芯[1]、申威[2]、飛騰等為代表的國產處理器的問世不僅顯示出我國在自主核心芯片研發(fā)上的實力,也大大增強了國家的信息安全防護能力;同時,以神威、天河、曙光等為代表的國產超級計算機的計算能力在世界上也處于領先水平,2016年以來,在全球超級計算機500強榜單上,神威·太湖之光與天河二號三次攜手奪得前兩名。與國產硬件水平不斷提升相比,其上支持的軟件棧的數量和規(guī)模仍有待提高,面向國產平臺借助二進制翻譯手段進行軟件移植的意義重大。
二進制翻譯技術[3,4]是作為程序等價變換工具產生并發(fā)展起來的,被定義為一種機器上的指令序列到另一種機器上指令序列的等價轉換過程。按照翻譯方式可以分為三種[5]:解釋執(zhí)行,靜態(tài)翻譯和動態(tài)翻譯[6]。動態(tài)二進制翻譯采用了“查找→翻譯→執(zhí)行”的工作模型,如圖 1所示,先在翻譯緩存T-Cache(Translated Code Cache)中進行查找,如果命中,則進入執(zhí)行階段,否則進入翻譯階段。翻譯階段以基本塊為單位進行,將翻譯后的代碼以翻譯塊TB(Translated Block)為單位存入到T-Cache中,執(zhí)行階段以TB為單位進行,一個TB執(zhí)行完畢后檢查是否存在塊鏈,如果存在則繼續(xù)執(zhí)行代碼,否則轉入到查找階段。T-Cache作為連接查找、翻譯和執(zhí)行三個過程的紐帶,是構成動態(tài)二進制翻譯的重要內容,也是優(yōu)化工作的一個關注點。
Figure 1 Model of dynamic binary translator圖1 動態(tài)二進制翻譯器的工作模型
為了緩存翻譯代碼并提高其復用性,動態(tài)二進制翻譯建立了一套T-Cache管理機制,將動態(tài)翻譯產生的本地碼以TB的形式存入緩存區(qū)T-Cache中,當程序運行過程中需要重復調用某TB時,翻譯平臺會在T-Cache中進行查找。T-Cache機制由于需要暫存TB,需要在內存中開辟一段存儲空間,理想的狀態(tài)是T-Cache無限大,能夠容納所有的TB,但是有限的物理資源決定了T-Cache只能是有限空間。為了在有限的T-Cache空間下盡可能地提高翻譯效率,必須對T-Cache進行有效的分配和管理。
程序局部性原理表明,程序中20%的指令占用了80%的執(zhí)行時間,如果能夠使執(zhí)行頻度高的代碼較長時間駐留在T-Cache中,無疑會提高執(zhí)行效率。
為實現(xiàn)這個目的,需要解決好兩個問題:一是熱代碼的有效識別問題。本文將待翻譯程序中頻繁執(zhí)行的二進制代碼片段稱為熱代碼,識別熱代碼的工作必須在動態(tài)二進制翻譯中完成,這就需要在翻譯器的合適位置進行程序插樁,動態(tài)監(jiān)控基本塊的執(zhí)行情況,另外,還需要確定熱代碼的起始位置和終止條件。二是保證熱代碼能夠被整體地執(zhí)行。熱代碼往往包含多個基本塊,而執(zhí)行階段T-Cache中的代碼以TB為單位執(zhí)行,這就會造成熱代碼執(zhí)行時程序控制流會在執(zhí)行線索與翻譯線索間頻繁切換,造成額外的時間開銷。
為此,文本提出了“熱代碼識別→超塊緩存STB(Super Translated Block)構造→T-Cache管理策略改進”的解決思路,針對第一個問題,本文提出了一種基于頻度統(tǒng)計的熱代碼識別算法,通過在翻譯器的適當位置進行程序插樁,動態(tài)更新每個基本塊的執(zhí)行次數——即“熱度”,把熱度超過預定閾值的基本塊及其后續(xù)若干基本塊認定為熱代碼。針對第二個問題,本文提出了構造超塊緩存的思想,將熱代碼中的基本塊翻譯后鏈接為緩存容量更大的超塊提供給T-Cache系統(tǒng)?;跓岽a和超塊,本文最后提出了改進的T-Cache管理策略。
本文的主要貢獻在于:
(1) 提出了一種基于頻度統(tǒng)計的熱代碼識別算法,通過程序插樁和動態(tài)監(jiān)控對每個基本塊的執(zhí)行情況進行profiling統(tǒng)計,在動態(tài)翻譯過程中實現(xiàn)了有效識別執(zhí)行頻度高的代碼片段。
(2) 提出了構建超塊緩存的思想,將熱代碼中包含的基本塊翻譯后鏈接成緩存容量更大的超塊,能夠有效減少上下文切換次數,降低時間開銷,也為T-Cache系統(tǒng)提供了新的緩存資源。
(3) 改進了T-Cache系統(tǒng)的查找方法,提出了雙層查找策略,針對新引進的超塊緩存進行快速查找,針對常規(guī)緩存進行慢速查找;同時,改進了T-Cache系統(tǒng)原有的替換策略,對超塊緩存和常規(guī)緩存使用了不同的內容替換策略,提高了T-Cache的命中率。
動態(tài)二進制翻譯主要有三種熱代碼識別方法[7]:一是基于塊的識別。該策略記錄每個基本塊的使用次數,一旦達到熱度即認定為熱塊,并開始建立熱路徑。這種方法造成的系統(tǒng)開銷較大,預測精度不高。二是基于跳轉邊的識別。該策略通過統(tǒng)計基本塊之間的跳轉次數取代收集基本塊的使用信息完成熱路徑識別,文獻[8]對該策略進行了詳細闡述。該策略實現(xiàn)簡單,準確性較高。但是,由于跳轉邊僅僅反映局部跳轉關系,無法應對基本塊重疊的情況。三是基于路徑的識別。該策略不需要像前兩種方法那樣,在每次基本塊發(fā)生跳轉時都進行計數統(tǒng)計,僅需要對整條路徑進行計數即可,可以有效減少統(tǒng)計開銷。文獻[9]表明,有效利用該方法的前提是找到一種適合當前動態(tài)翻譯平臺的高效算法。該策略需要有效解決預測路徑中包含的基本塊的表示問題,文獻[10]中提出了一種使用二進制編碼序列來標識路徑中包含基本塊的方法,該方法使用0、1編碼來分別標識條件跳轉發(fā)生后的不同目標基本塊,這樣,每一條路徑對應一個二進制編碼序列,所有路徑可以構成一個哈夫曼樹的結構。
但是,文獻[10]在表示路徑構成時僅對條件跳轉后的基本塊進行了編碼標識,沒有對直接跳轉后的基本塊進行編碼,即忽略了直接跳轉的情況。雖然這樣可以有效壓縮路徑長度、節(jié)省查找開銷,但同時也可能導致路徑表示不完整,影響熱路徑判定的命中率。
綜合考慮多種因素,本文提出了一種基于頻度統(tǒng)計的熱代碼識別算法,該算法結合了塊識別和路徑識別兩種策略的特點,借助程序插樁和profiling技術[11]實現(xiàn)了在動態(tài)執(zhí)行過程中對基本塊的頻度統(tǒng)計。算法在循環(huán)終止條件中增加了對于回路的判斷,這對于識別程序中最容易成為熱代碼的循環(huán)結構特別有效。
雖然算法會造成部分統(tǒng)計開銷,但本文更多的是考慮熱路徑的有效識別問題,后續(xù)內容提到的構造超塊緩存方法和T-Cache管理策略的改進才是本文帶來效率提升的關鍵。
基于頻度統(tǒng)計的熱代碼識別HCFS(Hot Code Based on Frequency Statistic)算法將“一個執(zhí)行頻度高的基本塊與其后若干連續(xù)執(zhí)行的基本塊組成的路徑”作為熱代碼預測條件,遵循“先熱先選擇”的設計原則,從頻度值高的基本塊開始,把其后連續(xù)執(zhí)行的若干基本塊也納入熱代碼范圍。理論上熱代碼路徑越長意味著基本塊的復用率越高,更多的基本塊能夠被連續(xù)執(zhí)行,有利于縮減基本塊的翻譯次數,降低翻譯開銷。但是,由于受到緩存區(qū)大小的物理限制,熱代碼不能過長,因此確定熱代碼識別的終止條件是一個關鍵問題。本文對熱代碼的終止條件做出了限制:對于非循環(huán)結構,算法規(guī)定當熱代碼長度達到預定上限時,終止熱代碼識別;對于循環(huán)結構,由于其成為熱代碼的概率高,算法將形成回路作為算法終止的另一個條件,即當基本塊跳轉到熱代碼的頭部形成回路時,算法終止。
HCFS算法是基于頻度統(tǒng)計實現(xiàn)的,頻度統(tǒng)計代碼插樁在基本塊開始執(zhí)行前,在獲取當前基本塊的PC(地址)后,開始對profiling進行遞增處理,更新基本塊的使用次數,完成基本塊執(zhí)行頻度統(tǒng)計。頻度統(tǒng)計函數tb_update_profiling( )的實現(xiàn)如下所示:
//功能:基本塊熱度統(tǒng)計
static inline TranslationBlock *tb_update_profiling(void){
TranslationBlock *tb;
int flags;
cpu_get_tb_cpu_state(env,&pc,&cs_base,&flags);/*獲取當前執(zhí)行到的PC*/
if(tb→pc)
{
++tb→profiling;//更新profiling
}
returntb;
}
其中,tb為指向當前基本塊的指針;pc代表基本塊的本地地址,負責對基本塊進行唯一標識;profiling代表基本塊的頻度,負責統(tǒng)計基本塊的執(zhí)行次數。
基于頻度統(tǒng)計,HCFS算法的偽代碼如算法 1所示,算法的工作過程如下所示:
步驟1依次讀取可執(zhí)行文件中的每個基本塊信息。
步驟2獲取當前基本塊的地址pc。
步驟3檢查是否為最后一個基本塊,如果是,跳轉到步驟7;否則,跳轉到步驟4。
步驟4判斷當前基本塊是否處于熱代碼中,如果是,跳轉回步驟2進行下一個基本塊判斷;否則,進入步驟5,提取新的熱代碼。
步驟5判斷當前基本塊的頻度值是否超過閾值,如果是,進入步驟6;否則,跳轉回步驟2。
步驟6將當前基本塊預設為新熱代碼的頭部,啟動熱代碼預測。每次讀入一個基本塊,判斷是否滿足兩個條件:一是當前基本塊是否指向熱代碼頭部,如果是,說明出現(xiàn)回路,跳轉到步驟7;二是熱代碼長度是否達到上限,如果達到,退出本次預測,跳轉到步驟2;如果兩個條件都不滿足,將當前基本塊納入熱路徑,并繼續(xù)讀入下一個基本塊。
步驟7算法結束,輸出熱代碼。
算法1HCFS算法描述
//功能:熱路徑局部預測
//輸入:可執(zhí)行文件句柄elf-file
//輸出:熱路徑頭指針headpc
Foreachtbinelf-file
pc=env→pc;//從全局變量env中獲取當前基本塊pc
if當前基本塊不處于當前熱路徑中
if基本塊profiling大于熱度閾值
headpc=pc;//當前基本塊為熱路徑頭部
foreachtb→nextinelf-file∥啟動熱路徑預測循環(huán)
將基本塊納入熱路徑序列;
if(基本塊pc等于headpc) or (熱路徑長度大于設定長度上限) 輸出當前熱路徑頭指針headpc;//結束熱路徑識別
break;
Endif
Endfor
else
tb=tb→next;//指向下一個基本塊
Endif
else
tb=tb→next;//指向下一個基本塊
Endif
iftb→next=NULL
break;//終止動態(tài)翻譯循環(huán)
Endif
Endfor
識別出熱代碼后,其包含的基本塊被翻譯并存儲到T-Cache中,但T-Cache以TB為單位的傳統(tǒng)執(zhí)行方式,使得熱代碼不能被一次性執(zhí)行完畢,無法充分發(fā)揮熱代碼的功效。為此,本文提出了構造超塊緩存的思路,將HCFS算法識別出的熱代碼中包含的基本塊有序地組織起來,翻譯后形成緩存容量更大的翻譯塊—“超塊”STB提供給T-Cache使用,不僅使得執(zhí)行頻率較高的代碼保存在T-Cache中,也能擴大一次執(zhí)行的代碼量,有效減少線索切換產生的上下文開銷。需要說明的是,本文提出的超塊概念特指的是在翻譯緩存中新開辟的一段特殊區(qū)域。
STB的構造過程從熱代碼的頭指針開始,依次判斷當前基本塊結尾是否為直接跳轉,如果是,直接插入后繼基本塊代碼;否則,保留跳轉出口信息。圖2展示了STB使用前后的對比情況,假設TB1和TB2屬于同一個熱代碼區(qū)域,且存在直接跳轉關系。圖2a展示了未使用STB的情況,TB1執(zhí)行后和TB2執(zhí)行前,必須進行相關環(huán)境變量的保存工作和恢復工作,環(huán)境變量主要包含一些本地寄存器的相關信息;圖2b展示了使用STB的情況,將TB1和TB2之間的直接跳轉語句刪除,合并兩個基本塊后形成超塊STB。
Figure 2 Construction of super translated block圖2 STB的構造
作為TB的有益補充,STB豐富了T-Cache的管理范圍,但同時也對T-Cache原有的管理方法提出了新的要求。下面從查找方法和清空策略兩個方面討論在增加超塊緩存后,對于T-Cache管理的優(yōu)化。
T-Cache系統(tǒng)原有的查找方法只涉及TB,未涉及STB。引進STB后,需要改進原有的T-Cache查找算法,增加對STB的處理。為了不引起混淆,下文將由常規(guī)TB構成的翻譯緩存區(qū)域稱為OldCache,由STB構成的翻譯緩存區(qū)域稱為NewCache。
為充分發(fā)揮STB的作用,本文提出了分層查找的思想,將查找過程分成兩個階段,先在NewCache中進行快速查找,再在常規(guī)OldCache中進行慢速查找,算法描述如算法 2所示。工作流程如下所示:
步驟1從環(huán)境變量env中提取當前基本塊PC等參數。
步驟2在NewCache中進行快查,取出由PC標識的STB。
步驟3判斷STB是否為空,如果是,轉入步驟4進行慢查;否則,說明查找命中,轉入步驟7。
步驟4在OldCache中進行慢查,取出由PC標識的常規(guī)TB。
步驟5判斷TB是否為空,如果是,跳轉至步驟6,進入翻譯過程;否則,說明查找命中,輸出TB,算法結束。
步驟6翻譯基本塊,將翻譯后的本地代碼存入OldCache中。
步驟7輸出STB,算法結束。
在上述步驟中,步驟2中的快查針對NewCache,步驟4中的慢查針對OldCache??觳楹吐槎际褂昧薍ash查找方法,將PC作為鍵值。查找過程的順序是先進行快查再進行慢查,如果慢查也未命中,則進行翻譯工作。
算法2改進的T-Cache查找算法
//功能:查找T-Cache
//輸入:環(huán)境變量env
//輸出:翻譯緩存tb
cpu_get_tb_cpu_state(env,&pc,&cs_base,&flags);//獲取env中的相關成員值
tb=env→th_jmp_NewCache[tb_jump_NewCache_hash_func(pc)];/*在NewCache中進行查找*/
if(!tb)//如果沒有找到所需超塊
{
{tb=env→tb_jmp_OldCache[tb_jmp_OldCache_hash_func(pc)];/*進入OldCache中查找*/
if(!tb)
{
tb=tb_gen_code(env,pc,cs_base,flags,0);/*進入翻譯模塊*/
env→tb_jmp_OldCache[tb_jmp_OldCache_hash_func(pc)]=tb;/*將tb寫入OldCache中*/
}
}
輸出tb;
改進的T-Cache查找算法,加入了針對STB的處理,一旦命中,立即執(zhí)行熱代碼對應的翻譯緩存,并且一次執(zhí)行的代碼量大,使得程序經常執(zhí)行的代碼部分可以駐留在T-Cache中,能夠有效延長執(zhí)行線索在T-Cache的駐留時間,提升了系統(tǒng)效率。
T-Cache的替換策略在T-Cache管理優(yōu)化中發(fā)揮著重要作用,由于STB的引入,需要改進原有的替換策略。
T-Cache已有的替換策略包括:全清空策略(Full Cache Flush)采用的方法是一旦T-Cache空間不足,則清空全部T-Cache內容。該算法實現(xiàn)簡單,但性能不高,未考慮基本塊的熱度;最近最少使用策略(Least-Recently-Used)考慮了熱度的影響因素,一旦T-Cache空間不足,淘汰最近使用最少的基本塊,但該策略由于替入塊與替出塊的大小不同,容易形成存儲空間的碎片;先進先出策略(First-In-First-Out)采用隊列作為數據結構,一旦T-Cache空間不足,淘汰排在隊頭的基本塊。該策略可以有效減少空間碎片,但未考慮熱度影響。分時清空策略(Preemptive Flush)根據程序的運行情況,在特定時域內采用全清空處理。該策略被Dynamo[12]平臺采用,可以有效降低熱塊的損失。
由于新構建的NewCache豐富了T-Cache系統(tǒng)的翻譯緩存類型,結合工程實際,本文針對不同緩存類型采用不同的替換策略。針對OldCache,仍然使用簡單的全清空策略;針對NewCache,為了提高管理效率,采用先入先出的替換策略,將超塊按照先后順序從地址低位向高位依次存放,當NewCache滿時,將先進入的超級塊淘汰。該策略實現(xiàn)簡單,和全清空策略相比,可以較好地提升查找效率,延長STB的存活時間。
本文將提出的優(yōu)化方法在開源二進制翻譯器QEMU1.7.2[13]中進行了實現(xiàn)。使用了如表 1所示的實驗環(huán)境,源平臺采用的是X86-64架構處理器;本地平臺采用的是國產SW410處理器。測試用例選取了SPEC 2006(Standard Performance Evaluation Corporation)測試集,它是由標準性能評估公司組織建立的一套用于計算機系統(tǒng)評估的業(yè)界標準測試集。
Table 1 Test environment表1 實驗環(huán)境
使用SPEC 2006中的部分用例對HCFS算法的識別效果進行了測試,因為此項測試只涉及熱代碼的識別,不涉及超塊的構造及T-Cache管理策略的改進,為此,測試時注釋掉了T-Cache優(yōu)化部分的代碼,圖3和表2分別展示了熱代碼識別情況和對應的頻度統(tǒng)計造成的開銷情況。
圖3中,定義熱代碼識別率HCR(Hot Code Ratio)來描述識別效果,HCR=Nhotcode/Nallcode×100%。公式中,Nhotcode代表用例的熱代碼包含的基本塊數量;Nallcode代表用例的基本塊的總數;HCR代表熱代碼中的基本塊占用例基本塊總數的比率,HCR數值越大,說明用例的熱代碼識別效果越好。從測試結果可以看出,用例h264ref和sjeng的識別效果較好,識別率分別達到29.73%和23.45%,gobmk和libquantum的識別效果較差,識別率只有0.14%和0.98%。
表2展示了每個用例的profiling開銷情況,第二列Time1表示未進行頻度統(tǒng)計時的用例執(zhí)行時間;第三列Time2表示進行頻度統(tǒng)計時的用例執(zhí)行時間;第四列表示頻度統(tǒng)計造成的開銷情況,Profiling開銷比=(Time2-Time1)/Time1×100%。
Table 2 Cost of profiling for hot code表2 熱代碼profiling開銷
測試數據說明,識別熱代碼時造成的profiling開銷與熱代碼的識別情況直接相關,識別效果越好的用例,profiling時間開銷越大,反之,開銷越小。例如,用例sjeng和h264ref的開銷分別達到5.02%和5.86%,而用例gobmk的開銷只有0.14%。另外,測試結果也說明在未使用T-Cache優(yōu)化方法前,熱代碼識別只能帶來負收益。
Figure 3 Performance test of HCFS algorithm圖3 HCFS算法性能測試
為測試改進的T-Cache查找算法和替換策略效果,實驗記錄了對OldCache和NewCache使用分層查找方法并配合使用改進的替換策略時的運行時間,此項測試包含了全部優(yōu)化代碼。表3和圖4以不同形式展現(xiàn)了使用改進的T-Cache管理策略時的優(yōu)化效果。表3以表格的形式展現(xiàn)了測試用例使用優(yōu)化方法前后的時間以及優(yōu)化加速情況,Tori表示優(yōu)化前的運行時間,Topt表示優(yōu)化后的運行時間,定義加速比Ratio=1-Topt/Tori×100%描述加速效果,Ratio值越小,表明優(yōu)化效果越好。圖4以柱狀圖的形式展現(xiàn)了各個用例的加速情況。
Table 3 Test of optimization method of T-Cache表3 T-Cache優(yōu)化方法測試
Figure 4 Test of optimization method of T-Cache圖4 T-Cache優(yōu)化方法測試
顯然,使用改進方法后,翻譯系統(tǒng)的執(zhí)行效率得到了明顯提升,測試用例sjeng和h264ref的加速效果最明顯,分別達到了19.52%和15.73%。所有用例的平均加速比達到9.34%。
本文以“熱代碼識別→超塊緩存構造→T-Cache管理策略改進”為優(yōu)化線索,提出了一個提升動態(tài)二進制翻譯效率的方法。通過熱代碼的識別和超塊的構造,為改進T-Cache的原有管理策略打下了基礎。引入了熱代碼的概念,通過在動態(tài)翻譯過程中對基本塊的執(zhí)行情況進行即時監(jiān)控和統(tǒng)計,實現(xiàn)了對執(zhí)行頻度高的熱代碼的識別。為了使熱代碼能夠常駐翻譯緩存,通過構造“超塊”的方法,將熱代碼中的基本塊重新鏈接,形成了容量更大的翻譯緩存。引進超塊后,通過引入雙層查找策略,以及采用新的替換策略,提高了超塊的使用率,同時也增加了T-Cache的命中率。該優(yōu)化方法的正確性和帶來的收益在國產申威處理器平臺上進行了實驗驗證。下一步,需要進一步考慮翻譯緩存中OldCache和NewCache的不同占比情況對優(yōu)化效果的影響。
參考文獻:
[1] Cai Song-song,Liu Qi,Wang Jian,et al.Optimization of binary translator based on GODSON CPU[J].Computer Engineering,2009,35(7):280-282.(in Chinese)
[2] SW410[EB/OL].[2014-03-26].http://www.shenweimicro.com/.
[3] Altman E,Kaeli D,Sheffer Y.Welcome to the opportunities of binary translation[J].IEEE Computer,2000,33(3):40-45.
[4] Gschwind M, Altman E R,Sathaye S,et al.Dynamic and transparent binary translation[J].IEEE Computer,2000,33(3):54-59.
[5] Cifuentes C,Malhotra V.Binary translation:Static,dynamic,retargetable?[C]∥Proc of International Conference on Software Maintenance,1996:340-349.
[6] Li Jian-hui, Ma Xiang-ning,Zhu Chuan-qi.Dynamic binary translation and optimization[J].Journal of Computer Research and Development,2007,44(1):161-168.(in Chinese)
[7] Shi H,Wang Y,Guan H,et al.An intermediate language level optimization framework for dynamic binary translation[J].ACM SIGPLAN Notices,2007,42(5):3-9.
[8] Ball T,Mataga P,Sagiv M.Edge profiling versus path profiling:The showdown[C]∥Proc of the 25th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages,1998:734-148.
[9] Dhodapkar A S,Smith J E.Comparing program phase detection techniques[C]∥Proc of the 36th Annual IEEE/ACM International Symposium on Microarchitecture,2003:217.
[10] Shi Hui-hui,Guan Hai-bing,Liang A-lei.Hot path optimization in software dynamic binary translation[J].Journal of Computer Engineering,2007,33(23):78-80.(in Chinese)
[11] Spink T,Wagstaff H,Franke B,et al.Efficient code generation in a region-based dynamic binary translator[C]∥Proc of the 2014 SIGPLAN/SIGBED Conference on Languages,Compilers and Tools for Embedded Systems,2014:3-12.
[12] Bala V,Duesterwald E,Banerjia S.Dynamo:A transparent dynamic optimization system[J].Proceeding of ACM SIGPLAN Notices,2000,35(5):1-12.
[13] Bellard F.QEMU,a fast and portable dynamic translator [C]∥Proc of the Annual Conference on USENIX Annual Technical Conference,2005:41-46.
附中文參考文獻:
[1] 蔡嵩松,劉淇,王劍,等.基于龍芯處理器的二進制翻譯器優(yōu)化[J].計算機工程,2009,35(7):280-282.
[6] 李劍慧,馬湘寧,朱傳琪.動態(tài)二進制翻譯與優(yōu)化技術研究[J].計算機研究與發(fā)展,2007,44(1):161-168.
[10] 史輝輝,管海兵,梁阿磊.動態(tài)二進制翻譯中熱路徑優(yōu)化的軟件實現(xiàn)[J].計算機工程,2007,33(23):78-80.