余子濠 陳 璐 孫凝暉 包云崗
(處理器芯片全國重點實驗室(中國科學院計算技術(shù)研究所) 北京 100190)
(中國科學院大學 北京 100049)
生態(tài)系統(tǒng)是一款指令集架構(gòu)(instruction set architecture,ISA)以及相應(yīng)芯片的生命力所在.目前主流的兩大生態(tài)系統(tǒng)是以Windows 和Intel 為聯(lián)盟的Wintel 生態(tài)系統(tǒng),以及以Android 和ARM 為聯(lián)盟的AA 生態(tài)系統(tǒng).對于其他ISA(尤其是新興ISA,如RISC-V),其生態(tài)系統(tǒng)建設(shè)面臨生態(tài)系統(tǒng)壁壘問題:生態(tài)系統(tǒng)構(gòu)成龐大,而且與ISA 的耦合度非常高,要將一個生態(tài)系統(tǒng)從一款I(lǐng)SA 完美地移植到另一款是一項非常困難的工作.因此,生態(tài)系統(tǒng)建設(shè)需要投入大量人員和精力.以RISC-V 為例,自2011 年5 月第1 版發(fā)布起,Linux 內(nèi)核和Binutils 工具鏈分別經(jīng)過78 個月和71 個月才進入主線分支[1];而Debian 發(fā)行版自宣布開始往RISC-V移植至正式發(fā)布,則花費41個月[1].
解決生態(tài)系統(tǒng)壁壘問題的主流技術(shù)是動態(tài)二進制翻譯技術(shù).動態(tài)二進制翻譯技術(shù)的思想與編譯技術(shù)十分類似,編譯技術(shù)負責將程序從源代碼靜態(tài)地翻譯成行為等價的二進制指令;而動態(tài)二進制翻譯技術(shù)則通過二進制翻譯程序在運行時刻將二進制程序從一種源指令翻譯成另一種目標指令.但在生態(tài)系統(tǒng)復(fù)用的場景中,大部分缺失源代碼的二進制程序無法通過編譯技術(shù)重新生成目標ISA 的二進制文件,故編譯技術(shù)不能解決此問題.相對地,動態(tài)二進制翻譯技術(shù)在提供二進制程序的場景下即可使用,同時可通過收集運行時刻的信息輔助翻譯,因此成為解決生態(tài)系統(tǒng)壁壘問題的主流技術(shù).
動態(tài)二進制翻譯技術(shù)的效率受3 個因素影響:翻譯程序的翻譯效率(是否翻譯得快);翻譯的目標代碼質(zhì)量(是否翻譯得好);動態(tài)二進制翻譯機制的維護開銷(是否維護得好).對于大部分具有明顯熱點的程序,如SPEC CPU2006 基準程序[2],其執(zhí)行時間主要集中在若干熱點代碼片段中,能否翻譯出質(zhì)量更高的目標代碼,對這些程序的執(zhí)行效率影響很大.因此本文將重點討論動態(tài)二進制翻譯的目標代碼質(zhì)量優(yōu)化方法.
為分析出潛在的優(yōu)化點,本文選定了一種目標ISA,然后按照語義差異由小到大分析從其他ISA 翻譯到該目標ISA 時,影響動態(tài)二進制翻譯技術(shù)目標代碼質(zhì)量的因素.具體地,本文以當前流行的RISCV64 為目標ISA,分別將RISC-V64,RISC-V32,MIPS32,x86 作為源ISA 進行分析,并將影響目標代碼質(zhì)量的因素總結(jié)成3 點:1)目標寄存器的使用.一方面,動態(tài)二進制翻譯機制需要占用部分目標寄存器;另一方面,目標代碼與運行時環(huán)境進行交互時也需要對目標寄存器進行保存和恢復(fù).2)源程序和動態(tài)二進制翻譯器的地址空間存在差異.為保證目標代碼正確訪問源程序的數(shù)據(jù),需要對所有訪存進行段式地址轉(zhuǎn)換.3)源ISA 與目標ISA 存在語義差異.語義差異過大會導(dǎo)致翻譯程序需要將1 條源指令翻譯成若干條目標指令,從而降低目標代碼的執(zhí)行效率.
為解決這3 個問題,本文針對動態(tài)二進制翻譯的翻譯質(zhì)量提出了若干優(yōu)化方法:
1)為優(yōu)化目標寄存器的使用,本文提出一套兼容應(yīng)用程序二進制接口(application binary interface,ABI)的目標寄存器分配方案,將常用的源寄存器分配在靜態(tài)的目標寄存器中,減少由運行時環(huán)境交互引入的狀態(tài)保存和恢復(fù)開銷;
2)為解決因源程序和動態(tài)二進制翻譯器的地址空間差異引入的開銷,本文提出一種基于位置無關(guān)可執(zhí)行(position-independent executable,PIE)文件的虛擬地址空間復(fù)用方法,借助PIE 可加載到任意地址的特性,消除段式地址轉(zhuǎn)換引入的開銷;
3)為減少源ISA 與目標ISA 間的語義差異,本文運用B 擴展(位操作擴展)[3]和P 擴展(DSP 定點運算擴展)[4]中的指令來實現(xiàn)若干條簡單目標指令的功能,提升目標代碼的質(zhì)量.
本文在一個新的動態(tài)二進制翻譯程序DBT-FEMU中實現(xiàn)這些優(yōu)化方法,在FPGA(field programmable gate array)中通過DBT-FEMU 和QEMU-i386 分別將x86 源程序翻譯成RISC-V64 目標程序并運行.評估數(shù)據(jù)顯示,在運行SPEC CPU2006的整數(shù)基準程序時,與QEMU-i386 相比,DBT-FEMU 翻譯出的目標程序所執(zhí)行的動態(tài)指令數(shù)平均減少57%,平均性能達到QEMU-i386 的4.12 倍.
動態(tài)二進制翻譯技術(shù)主要涉及3 個程序:源程序(source program)是翻譯過程的輸入;目標程序(target program)是翻譯過程的輸出,其ISA 通常與本地環(huán)境的ISA 相同,可直接在本地環(huán)境運行;翻譯程序(translation program)是執(zhí)行翻譯操作的主體,負責讀入源程序并輸出目標程序.源程序的指令稱為源指令(source instruction),目標程序的指令稱為目標指令(target instruction).
圖1 展示了動態(tài)二進制翻譯的基本工作流程.在翻譯過程中,源程序的指令以基本塊(basic block)為單位劃分.對于即將執(zhí)行的基本塊,翻譯程序首先檢查該基本塊是否已被翻譯.若否,翻譯程序首先將該基本塊中的源指令翻譯成行為等價的目標指令;若是,翻譯程序?qū)⒅苯尤〕鲈摶緣K的翻譯結(jié)果.接下來翻譯程序?qū)褕?zhí)行控制權(quán)交給翻譯后的目標指令.執(zhí)行該基本塊之后,翻譯程序?qū)⒎治鲈闯绦虻南乱粋€基本塊.此過程將循環(huán)進行.

Fig.1 Basic workflow of dynamic binary translation圖1 動態(tài)二進制翻譯的基本工作流程
與將源代碼編譯成目標指令并直接在目標機器上運行相比,通過動態(tài)二進制翻譯技術(shù)運行源程序的運行效率一般有所下降.影響運行效率的原因主要有3 點:1)翻譯程序翻譯的速度.由于動態(tài)二進制翻譯技術(shù)需要在運行時刻進行翻譯,故翻譯的時間開銷會算入程序運行時間,若翻譯耗時過長,將降低程序運行的效率.2)目標指令的質(zhì)量.翻譯程序翻譯出目標指令之后,將執(zhí)行這些目標指令,若目標指令質(zhì)量較低,則需執(zhí)行更多指令,從而降低程序運行的效率.3)維護二進制翻譯機制所需開銷.動態(tài)二進制翻譯技術(shù)需要在翻譯程序和目標程序間來回切換執(zhí)行,同時需要正確處理翻譯程序和目標程序的地址空間,還要正確維護源基本塊和目標基本塊的映射關(guān)系.在這一系列開銷中,有的體現(xiàn)為翻譯過程的開銷,有的體現(xiàn)為額外數(shù)量的目標指令,有的則體現(xiàn)為支持目標程序運行時環(huán)境的開銷.
RISC-V B 擴展由若干擴展組件組成,旨在縮減代碼大小、提升性能和節(jié)約功耗.B 擴展中的大部分指令具有通用性,但小部分指令在某些特定領(lǐng)域中更有用.因此B 擴展以若干個較小的子擴展組成,根據(jù)功能和使用場景對子擴展進行分組.每個子擴展包含一些作用相近的指令,故通常共享相同的硬件邏輯.這些子擴展覆蓋的功能包括地址生成(Zba 子擴展)、基礎(chǔ)位操作(Zbb 子擴展)、無進位乘法(Zbc子擴展)、單比特操作(Zbs 子擴展)、交叉排列(Zbkx子擴展)和面向密碼算法的位操作(Zbkb 子擴展).
RISC-V P 擴展旨在提升數(shù)字信號處理(digital signal processing,DSP)算法在RISC-V 處理器上的處理能力,這些算法覆蓋了傳感器融合、伺服電機控制、音頻編解碼、語音合成和編碼、視頻解碼、醫(yī)學成像、計算機視覺、嵌入式控制、機器人、人機接口等領(lǐng)域.通過添加RISC-V P 擴展,RISC-V 處理器運行上述DSP 應(yīng)用程序時可降低功耗并提升性能.具體地,RISC-V P 擴展通過引入面向整數(shù)以及8b,16b,32b 定點數(shù)據(jù)類型的單指令多數(shù)據(jù)(single instruction multiple data,SIMD)指令來實現(xiàn)上述優(yōu)化.與其他 SIMD 指令不同,RISC-V P 擴展使用通用寄存器而不是專用寄存器來執(zhí)行SIMD 操作,對嵌入式應(yīng)用具有更好的效果.此外,RISC-V P 擴展還包括一些用于定點運算的非SIMD 指令.
動態(tài)二進制翻譯技術(shù)在2000 年前后是一個研究熱點.一個經(jīng)典的工作是Transmeta 公司通過動態(tài)二進制翻譯技術(shù)運行x86 的Windows 生態(tài)系統(tǒng).Transmeta公司的處理器是順序的超長指令字(very long instruction word,VLIW)架構(gòu),其上運行專門開發(fā)的代碼變換軟件(code morphing software,CMS),通過軟硬件協(xié)同實現(xiàn)x86 架構(gòu)的兼容性[5].CMS 由解釋器、運行時系統(tǒng)和動態(tài)二進制翻譯器組成.CMS 的解釋器通過記錄x86 指令的執(zhí)行頻率和一些啟發(fā)性指標,為后續(xù)的翻譯優(yōu)化過程提供指導(dǎo).這種做法與Shade 軟件[6]類似,但CMS 的翻譯開銷比Shade 大很多,生成的代碼質(zhì)量也高很多.在軟硬件協(xié)同設(shè)計方面,CMS 和硬件處理器協(xié)同實現(xiàn)一套“推測執(zhí)行-檢查恢復(fù)-自適應(yīng)重翻譯”機制[7].具體地,CMS 首先進行激進的推測,包括假設(shè)不發(fā)生異常,假設(shè)沒有內(nèi)存映射輸入輸出(memorymapped I/O,MMIO)的訪存,假設(shè)訪存操作沒有重名,假設(shè)不存在自修改代碼.在這些假設(shè)的前提下,CMS可生成高度優(yōu)化的推測執(zhí)行代碼.然后處理器執(zhí)行代碼時檢查這些假設(shè)是否成立,若不成立,則回滾到最近一次提交的狀態(tài)并進行解釋,來保證程序正確執(zhí)行.CMS 也會統(tǒng)計回滾頻率,若回滾操作頻繁發(fā)生,將在激進程度較低的假設(shè)下重新翻譯代碼,以減少回滾操作的開銷.CMS 中包含的解釋器可模擬用戶模式和系統(tǒng)模式的操作,同時CMS 支持從初始版本到最新多媒體指令的所有x86 指令,故對x86 指令的兼容性高于同期的動態(tài)二進制翻譯器.
同期還有不少著名的動態(tài)二進制翻譯器.DEC公司的FX!32 是一個程序分析導(dǎo)向的動態(tài)二進制翻譯器[8].其他的動態(tài)二進制翻譯系統(tǒng)還有IBM 公司的Daisy 和BOA[9-10].一些系統(tǒng)結(jié)合了解釋與動態(tài)二進制翻譯.例如,Java HotSpot 客戶端編譯器包含Java虛擬機(Java virtual machine,JVM)解釋器和即時編譯器,以實現(xiàn)機器代碼性能與編譯速度之間的平衡[11].HP 公司的Aries 模擬器結(jié)合了代碼的快速解釋與動態(tài)翻譯,在IA-64 系統(tǒng)上通過HP-UX 透明并正確地執(zhí)行PA-RISC 應(yīng)用程序[12].此外,也有一些機器自適應(yīng)的動態(tài)二進制翻譯器可根據(jù)機器特性規(guī)范及其ISA 來支持不同的源和目標機器的二進制翻譯,例如UQDBT[13]和Walkabout/Yirr-Ma 框架[14].
QEMU[15]是一個開源的ISA 模擬器,可通過動態(tài)二進制翻譯模擬處理器行為,并為機器提供不同的硬件和設(shè)備模型,使其運行于各種客戶操作系統(tǒng).QEMU還支持運行Linux 用戶級程序,甚至允許將編譯成一種ISA 的應(yīng)用程序運行在另一種ISA 的處理器上.QEMU 支持多種ISA 的模擬,包括x86、MIPS64(支持到第6 版)、SPARC、ARM、SuperH、PowerPC、ETRAX CRIS、MicroBlaze 和RISC-V.
QEMU 支持多種源ISA 和多種目標ISA,這是通過QEMU 中的目標代碼生成器TCG 實現(xiàn)的.具體地,TCG 將QEMU 的動態(tài)二進制翻譯過程劃分成2 部分:1)將源程序以基本塊為單位翻譯成TCG 指令,其中TCG 指令是一種機器無關(guān)的中間表示;2)通過目標代碼生成器TCG 將這些TCG 指令編譯成目標代碼.通過對過程的劃分,QEMU 可對TCG 指令進行優(yōu)化,如活躍變量分析、可達性分析、消除冗余數(shù)據(jù)移動等.QEMU 從0.10.0 版本引入TCG,消除了早期版本中dyngen 模塊依賴特定版本GCC 編譯器的缺陷[16],方便QEMU 在運行時刻與代碼生成和其他任務(wù)交互(如支持插件等).
QEMU 支持將x86 源程序翻譯成RISC-V64 目標程序,但翻譯質(zhì)量較低.據(jù)測試,運行SPEC CPU2006整數(shù)基準程序的test 輸入時,QEMU 將源程序從x86翻譯到RISC-V64 后,目標程序的平均運行效率只有本地的8.04%.
一些面向QEMU 的優(yōu)化工作包括通過信息靜態(tài)預(yù)處理方法優(yōu)化源程序的庫函數(shù)調(diào)用[17];通過對目標處理器的指令緩存和數(shù)據(jù)緩存的訪問進行動態(tài)負載均衡調(diào)度,緩解QEMU 產(chǎn)生的目標代碼對緩存的壓力,從而提升目標程序執(zhí)行的效率[18].
2015 年后,學術(shù)界開始圍繞RISC-V 開展動態(tài)二進制翻譯的研究工作.Rv8[19]利用ISA、ABI 和當前的x86-64 微結(jié)構(gòu)特征,將31 個RISC-V 源寄存器更合理地映射到16 個x86-64 目標寄存器.同時Rv8 還利用行為復(fù)雜的指令提升目標代碼密度,并將微操作融合成復(fù)雜指令,生成最少數(shù)量的目標微結(jié)構(gòu)微操作.Ilbeyi 等人[20]為ISA 模擬器生成器Pydgin 添加RISC-V支持,方便用戶生成一個易于個性化的動態(tài)二進制翻譯引擎.R2VM[21]利用二進制翻譯來實現(xiàn)周期精確的全系統(tǒng)快速模擬,支持運行時刻在功能模式和時序模式之間按需切換.但這些動態(tài)二進制翻譯程序都是將RISC-V64 源程序翻譯成x86-64 目標程序,而本文探究的是將x86 源程序翻譯成RISC-V64 目標程序的翻譯質(zhì)量.
目前RISC-V B 擴展標準已經(jīng)凍結(jié),近年來學術(shù)界也有一些研究工作圍繞RISC-V B 擴展開展.Marshall 等人[22-23]受到RISC-V B 擴展的啟發(fā),介紹了第1 個完整的32b RISC-V加密擴展的開源實現(xiàn).Babu 等人[24]實現(xiàn)了RISC-V B 擴展,并從代碼密度和速度提升2 個方面對位操作指令進行了量化分析,結(jié)果顯示,某些程序采用RISC-V B 擴展后,運行效率提升28%,同時代碼長度降低20%.而對于RISC-V P擴展,雖然其標準目前尚未完全凍結(jié),但也有一些研究工作圍繞RISC-V P 擴展開展.例如Chen 等人[25]提出了一個端到端系統(tǒng)棧,通過在TVM 和LLVM 上支持RISC-V P 擴展指令,使RISC-V 架構(gòu)可高效運行機器學習模型.與上述研究工作不同,本工作期望通過RISC-V B 擴展和RISC-V P 擴展提升動態(tài)二進制翻譯的目標代碼質(zhì)量.
為保證正確運行目標代碼,在不同ISA 間進行動態(tài)二進制翻譯,通常需要翻譯出多條目標指令.本文以RISC-V64 作為目標ISA,按照語義差異由小到大的順序,討論從其他ISA 翻譯到RISC-V64 時影響目標代碼質(zhì)量的因素,為動態(tài)二進制翻譯的代碼質(zhì)量優(yōu)化提供依據(jù).
為簡單起見,本文首先討論RISC-V64 作為源ISA的情況,即將RISC-V64 源程序通過二進制翻譯技術(shù)翻譯到相同的目標指令并執(zhí)行.在這種情況下,由于源ISA 和目標ISA 完全相同,故運行目標代碼的額外開銷主要源于動態(tài)二進制翻譯機制的固有開銷.具體地,本文對常見整數(shù)指令進行分類,并分別討論動態(tài)二進制翻譯在翻譯相應(yīng)類型指令時引入的開銷.
整數(shù)計算指令只會在寄存器間進行計算,包括算術(shù)運算指令、邏輯運算指令、移位指令、立即數(shù)加載指令.但在動態(tài)二進制翻譯機制中,為保證運行時環(huán)境的正確性,并非所有目標寄存器都可直接分配給目標代碼使用.如gp 寄存器用于存放指向全局偏移量表(global offset table,GOT)的指針,供運行時環(huán)境的動態(tài)鏈接機制使用,覆蓋它將導(dǎo)致相關(guān)功能出錯.故即使源ISA 與目標ISA 完全相同,動態(tài)二進制翻譯的機制仍需占用部分目標寄存器,使部分源寄存器只能分配到目標內(nèi)存中.若源程序讀取這部分源寄存器,則需額外翻譯一條目標訪存指令,將源寄存器的值從目標內(nèi)存讀入臨時寄存器;若源程序?qū)懭脒@部分源寄存器,也需額外翻譯一條目標訪存指令,將訪存數(shù)據(jù)從臨時寄存器寫回源寄存器對應(yīng)的目標內(nèi)存中.
對于訪存指令,因源程序的地址空間與動態(tài)二進制翻譯器的地址空間不同,動態(tài)二進制翻譯器會在其地址空間中分配一段連續(xù)的內(nèi)存區(qū)間供源程序訪問,如圖2 所示.為了讓翻譯出的目標訪存指令訪問到正確的內(nèi)存位置,還需額外翻譯出1 條加法指令進行段式地址轉(zhuǎn)換,對源程序的訪存地址加上該內(nèi)存區(qū)間的基地址,使其結(jié)果落在該內(nèi)存區(qū)間內(nèi).

Fig.2 Difference of address space between source program and translation program圖2 源程序和翻譯程序的地址空間的不同
對于控制轉(zhuǎn)移指令,由于源指令長度與目標指令長度不存在明確對應(yīng)關(guān)系,故翻譯程序須正確維護每個基本塊的源地址和目標地址間的映射關(guān)系.源程序執(zhí)行控制轉(zhuǎn)移指令時,需通過源地址查詢該映射關(guān)系,得到目標地址并跳轉(zhuǎn).對于直接跳轉(zhuǎn)指令(如jal 和beq 等),可以通過塊鏈接技術(shù)(block chaining)[15]節(jié)省查詢開銷.但因目標指令中跳轉(zhuǎn)范圍有限(如RISC-V64 中beq 指令跳轉(zhuǎn)范圍是±4KB),若跳轉(zhuǎn)距離較遠,則需通過額外1 或2 條目標指令將跳轉(zhuǎn)目標地址裝載到臨時寄存器中,再通過間接跳轉(zhuǎn)指令進行跳轉(zhuǎn).
除上述指令的翻譯外,調(diào)用運行時環(huán)境的輔助函數(shù)也會引入開銷.具體地,函數(shù)調(diào)用需遵循ABI 規(guī)范的調(diào)用約定(calling convention),其中規(guī)定了每個寄存器由何者保存(調(diào)用者或被調(diào)用者).因此,若目標代碼調(diào)用運行環(huán)境的輔助函數(shù)時,希望某由調(diào)用者保存的目標寄存器不被破壞,則需在調(diào)用前把該目標寄存器的值保存到棧上,并從輔助函數(shù)返回后恢復(fù)該寄存器.
RISC-V32 是RISC-V64 的子集,大部分RISC-V32指令均可翻譯成一條RISC-V64 指令.但因ABI 規(guī)范中定義的數(shù)據(jù)模型(data model)的差異,部分情況下需翻譯出額外的目標指令.具體地,RISC-V32 采用ILP32 數(shù)據(jù)模型,即整數(shù)、長整數(shù)、指針類型變量的長度均為32 b;而RISC-V64 采用LP64 數(shù)據(jù)模型,即整數(shù)類型變量的長度為32 b,長整數(shù)、指針類型變量的長度均為64 b,同時其ABI 規(guī)范的調(diào)用約定規(guī)定,32 b 數(shù)據(jù)以符號擴展的形式在64 b 寄存器中存儲[26-27].故目標訪存指令訪存時,可能因訪存地址的高32 b存放了符號擴展的結(jié)果,使其落在0~4 GB 外,觸發(fā)非法訪問異常,如圖3 所示.為解決此問題,翻譯程序需在目標訪存指令前生成額外的目標指令,對訪存有效地址合規(guī)化,即對訪存地址的高32 b 清零,保證訪存有效地址位于0~4 GB 內(nèi).

Fig.3 Legalization for effective address圖3 對有效地址合規(guī)化
與將RISC-V32 作為源ISA 的情況相比,翻譯程序還需為另外2 種情況翻譯出額外的目標指令:1)對于行為稍復(fù)雜的源指令,需多條目標指令組合實現(xiàn)其功能,如MIPS32 的nor 指令需翻譯成or 和xori這2 條RISC-V64 指令,而MIPS32 的條件傳輸指令movz 則需翻譯成8 條RISC-V64 指令;2)MIPS32 的I型指令中的立即數(shù)長度為16b,但因RISC-V64 指令中的立即數(shù)為12b 有符號數(shù),其表示范圍為-2 048~+2 047,故若源指令的立即數(shù)大于2 047,則翻譯程序需翻譯出額外的目標指令用于裝載立即數(shù).
因x86 更復(fù)雜,故有更多因素影響動態(tài)二進制翻譯的目標代碼質(zhì)量:1)與MIPS32 的復(fù)雜指令類似,翻譯程序需將x86 的復(fù)雜指令翻譯出多條目標指令來完成其功能,如bswap 指令用于對源寄存器按字節(jié)反向排序.特別地,x86 支持多種尋址方式,其中最復(fù)雜的是相對基址變址尋址,如mov $0x1,-0x2000(%ecx,%ebx,4),其有效地址需通過計算ECX+EBX×4-0x2000得到,故翻譯程序需為該源指令額外翻譯出3 條目標指令用于計算有效地址.2)x86 通過標志寄存器EFLAGS 存儲某些指令執(zhí)行的結(jié)果(如算術(shù)比較指令cmp),并在后續(xù)指令中讀出標志來決定如何執(zhí)行該指令(如條件跳轉(zhuǎn)指令je).RISC-V64 不支持標志寄存器,故需通過較多目標指令維護EFLAGS 寄存器的狀態(tài).一般通過條件碼惰性求值(lazy condition code evaluation)技術(shù)[15]優(yōu)化冗余的條件碼計算,以減少目標指令.3)x86 通用寄存器的組織方式類似C 語言的聯(lián)合體,可通過字節(jié)和半字方式讀寫通用寄存器的低位,如圖4 所示.但RISC-V64 的通用寄存器僅支持整體讀寫,要支持x86 通用寄存器的特性,需通過多條目標指令讀出目標寄存器的一部分,對讀出結(jié)果與待寫入數(shù)據(jù)進行拼接,最后將拼接結(jié)果整體寫入目標寄存器.

Fig.4 Accessing x86 source register by byte granularity圖4 通過字節(jié)粒度訪問 x86 源寄存器
如圖5 所示,在RISC-V64 平臺上運行的QEMU-i386將1 條采用基址變址尋址方式的x86 源指令翻譯成8 條RISC-V64 目標指令.由于QEMU 采用簡單的基本塊內(nèi)數(shù)據(jù)流分析技術(shù),可對多條x86 源指令翻譯出的RISC-V64 目標指令進行優(yōu)化,故本案例中,在RISC-V64 目標指令①前,EDX 源寄存器的值已被讀入s3 目標寄存器.基于該前提,QEMU-i386 翻譯出的8 條RISC-V64 目標指令說明為:①從目標內(nèi)存中讀取變址寄存器EBX 的值到臨時寄存器s5 中;②通過邏輯左移操作將EBX 的值左移1 b,計算EBX×2;③從目標內(nèi)存中讀取基址寄存器EBP 的值到臨時寄存器s7 中;④將基址與變址相加,計算訪存的有效地址,即EBP+EBX×2;⑤將④計算出的有效地址邏輯左移32 b;⑥將⑤的結(jié)果邏輯右移32 b,⑤⑥這2 步用于對訪存地址合規(guī)化,得到合法的32 b 有效地址;⑦對該合法的有效地址進行段式地址轉(zhuǎn)換,加上源程序的內(nèi)存在動態(tài)二進制翻譯器中的基地址(提前存放在目標寄存器s1 中),計算出目標程序需訪問的內(nèi)存地址;⑧把DX 寄存器的值寫入該內(nèi)存地址.

Fig.5 An example of translated target code of QEMU-i386圖5 QEMU-i386 翻譯出的目標代碼示例
從圖5 案例可見,翻譯出的8 條目標指令中只有目標指令⑧反映出該x86 源指令本質(zhì)的寫入內(nèi)存操作,其余目標指令均因動態(tài)二進制翻譯而被額外引入.具體地:1)指令①和指令③的引入是由于QEMU-i386把部分源寄存器(包括EBP 和EBX)分配到目標內(nèi)存,需通過額外的目標訪存指令訪問.2)指令②和指令④的引入是由于x86 的編程模型與RISC-V64 存在較大差異,此處體現(xiàn)在尋址模式的差異,RISC-V64 需通過指令②和指令④實現(xiàn)x86 基址變址尋址方式.3)指令⑤和指令⑥的引入是由于ABI 規(guī)范中數(shù)據(jù)模型的差異,具體地,x86 是32 b 的ISA,采用ILP32 數(shù)據(jù)模型,其指針長度為32 b,只能訪問0~4GB 的地址空間;而RISC-V64 是64 b 的ISA,采用LP64 數(shù)據(jù)模型,其指針長度為64 b,可訪問4 GB 以上的地址空間.故通過RISC-V64 目標指令計算出訪存地址后,還需通過指令⑤和指令⑥對訪存地址合規(guī)化,即將地址的高32 位清零,保證訪存地址位于0~4 GB 內(nèi).4)指令⑦的引入是由于源程序的地址空間與QEMU-i386 不同,需加上提前存放在目標寄存器s1 中的基地址進行段式地址轉(zhuǎn)換.
針對上述動態(tài)二進制翻譯代碼質(zhì)量分析結(jié)果,本文提出若干方法提升動態(tài)二進制翻譯的代碼質(zhì)量,如表1 所示.其中塊鏈接技術(shù)和條件碼惰性求值技術(shù)已被廣泛應(yīng)用于動態(tài)二進制翻譯領(lǐng)域[7].

Table 1 Summary of Code Quality Optimization Methods for Dynamic Binary Translation表1 動態(tài)二進制翻譯代碼質(zhì)量優(yōu)化方法總覽
QEMU-i386 默認不將任何x86 源寄存器分配到RISC-V64 目標寄存器中,而是將其分配在目標內(nèi)存中,需通過訪存指令訪問,并通過數(shù)據(jù)流分析技術(shù)對目標寄存器使用情況進行動態(tài)分析,優(yōu)化冗余的訪存指令.因RISC-V64 有32 個通用寄存器,遠多于x86 的8 個通用寄存器,故可將這8 個源通用寄存器均靜態(tài)地分配到RISC-V64 的目標通用寄存器中,以消除因訪問源通用寄存器而引入的目標訪存指令.
因翻譯后的目標程序會與翻譯程序提供的運行時環(huán)境交互,如調(diào)用輔助函數(shù)、處理系統(tǒng)調(diào)用,故可根據(jù)RISC-V64 的調(diào)用約定規(guī)范更合理地分配x86 源寄存器,實現(xiàn)按需保存寄存器.本文采用的寄存器分配方案如表2 所示.

Table 2 Target Register Allocation Scheme Compatible with RISC-V64 ABI表2 兼容RISC-V64 ABI 的目標寄存器分配方案
此分配方案的說明為:1)x86 的8 個源寄存器被分配到RISC-V64 的sp,s0 和s2~s7 中,在調(diào)用約定規(guī)范中,這些目標寄存器均為被調(diào)用者保存,若被調(diào)用者無需使用這些寄存器,則無需保存,達到按需保存寄存器的效果.2)因條件碼惰性求值所用寄存器的生存期可能跨越不同基本塊,故將其分配到s8,s9,s10,亦可借助調(diào)用約定規(guī)范實現(xiàn)按需保存寄存器的效果.3)s11 存放用于和運行時環(huán)境交互的全局指針,其作用類似于指向GOT 的指針.具體地,該全局指針指向內(nèi)存中預(yù)先分配的一張表,該表用于分配不常用的變量(如EFLAGS 中的DF 標志)以及運行時環(huán)境提供的輔助函數(shù)的地址,通過全局指針,翻譯后的目標程序可方便地訪問表中內(nèi)容.4)因RISC-V64的寄存器數(shù)量較多,故可將翻譯過程所用臨時寄存器靜態(tài)分配到固定的目標寄存器中,從而無需在翻譯程序中實現(xiàn)目標寄存器的動態(tài)分配,既簡化了翻譯程序的實現(xiàn),又提升了翻譯速度.此外,本方案將t0~t4 以及a3~a7 用作翻譯過程中的臨時變量,根據(jù)調(diào)用約定規(guī)范,雖然這些目標寄存器在函數(shù)調(diào)用過程中可能被覆蓋,但若臨時變量的生存期不會跨越1 條源指令,則目標程序無需保存相應(yīng)寄存器.5)翻譯程序可在目標寄存器中靜態(tài)分配若干常用的常數(shù)提升翻譯質(zhì)量,如長度分別為8 b,16 b,32 b 的掩碼,借助這些掩碼可方便實現(xiàn)x86 通用寄存器的字節(jié)和半字訪問,具體方法將在4.6 節(jié)介紹.6)目標寄存器zero,gp,tp 不向目標程序分配,其中zero 寄存器恒為0,不適合分配;gp 和tp 分別用于存放翻譯程序的全局指針和線程指針,破壞它們將導(dǎo)致翻譯程序運行錯誤.7)a0~a2 及ra 為空閑,翻譯程序未使用.
為優(yōu)化因源程序和動態(tài)二進制翻譯器的地址空間差異引入的開銷,本文利用了PIE 和虛擬地址空間的特性.具體地,動態(tài)二進制翻譯器可將源程序的代碼和數(shù)據(jù)加載到與源程序自身虛擬地址相同的內(nèi)存位置,以消除源程序和動態(tài)二進制翻譯地址空間的差異.此后,段式地址轉(zhuǎn)換所需加上的偏移量為0,故無需翻譯出加法指令,使目標程序直接通過源程序虛擬地址空間中的地址進行訪存時,亦可正確訪問加載的內(nèi)存位置.
但若加載源程序時,其內(nèi)存位置已被動態(tài)二進制翻譯器所使用,加載過程將破壞動態(tài)二進制翻譯器.為解決此問題,本文將動態(tài)二進制翻譯器自身編譯成PIE,此后操作系統(tǒng)可將PIE 加載到任意內(nèi)存位置正確運行.目前本地環(huán)境通常為64 b,其虛擬地址空間遠大于4 GB(如RISC-V64 支持 Sv39 分頁機制,默認的虛擬地址空間至少為512 GB),操作系統(tǒng)通常將PIE 加載到位于4 GB 以上的動態(tài)段(dynamic segment);而32 b 的源ISA 只支持32 b 的虛擬地址空間,故按照上述加載方案,源程序均會被加載到0~4 GB 的內(nèi)存范圍;對于64 b 的源ISA,雖然其虛擬地址空間多于4 GB,但根據(jù)ABI 規(guī)范,源程序的起始地址同樣位于0~4 GB.綜上,源程序的加載過程均不會破壞動態(tài)二進制翻譯器,從而保證優(yōu)化方法正確工作.
為優(yōu)化訪存地址合規(guī)化操作,需考慮如何高效進行“對64 b 寄存器的高32 位清0”的操作,以保證訪存地址位于0~4 GB 范圍.QEMU-i386 對該寄存器左移32 b,將原高32 b 移出,再將結(jié)果邏輯右移32 b,以實現(xiàn)地址的合規(guī)化.此方法需花費2 條目標指令.
為優(yōu)化訪存地址合規(guī)化操作,可預(yù)先在某目標寄存器中存放低32 b 的掩碼,即0x00000000ffffffff,再將此掩碼與需合規(guī)化的目標寄存器進行與操作.因可在翻譯程序初始化階段設(shè)置該掩碼,故翻譯程序只需額外翻譯出1 條and 目標指令,與QEMU-i386采用的方法相比可節(jié)省1 條目標指令.但該方法需占用1 個目標寄存器存放掩碼.為進一步節(jié)省該目標寄存器,可利用RISC-V B 擴展中的add.uw 指令.具體地,目標指令add.uw r,r,x0 可對目標寄存器r 的0~31 b 進行0 擴展.
可進一步利用編譯優(yōu)化技術(shù)中的數(shù)據(jù)流分析技術(shù)節(jié)省冗余的合規(guī)化操作.具體地,采用數(shù)據(jù)流分析技術(shù)可分析每條指令執(zhí)行后其目標寄存器是否已滿足“高32 b 為0”的條件,得知執(zhí)行訪存指令前地址是否已合規(guī)化.若是,則無需生成用于合規(guī)化的目標指令.
一些源指令的行為較復(fù)雜,如x86 中的bswap 指令需對源寄存器按字節(jié)反向排序.若僅翻譯到RISC-V64的基礎(chǔ)ISA,將花費約10 條目標指令;若使用RISC-V B擴展中的rev8 指令實現(xiàn)該功能,則可大幅度提升翻譯質(zhì)量.類似情況還有置位計數(shù)指令(如x86 中的popcnt指令)、前導(dǎo)0 和尾隨0 計數(shù)指令、循環(huán)移位指令等,皆可采用RISC-V B 擴展中行為相同的指令作為目標指令.
為優(yōu)化有效地址計算,需考慮如何高效計算“基址+變址×比例因子”.QEMU-i386 先通過移位指令計算“變址×比例因子”,再與基址相加得到有效地址.此方法需花費2 條目標指令.
為優(yōu)化上述操作,可采用RISC-V B 擴展中的sh1add,sh2add,sh3add 指令直接計算“基址+變址×比例因子”.上述指令在加法前分別對變址寄存器的值左移1 b,2 b,3 b,即分別乘以2,4,8,故可節(jié)省1 條用于移位的目標指令.
讀取x86 寄存器的字節(jié)和半字需抽取該寄存器部分數(shù)據(jù)到另一寄存器的低位.對于半字讀取,QEMU-i386 對該寄存器左移16 b,移出高16 b,再對結(jié)果的低32 b 邏輯右移16 b,從而把原來的16~63 b清0,實現(xiàn)抽取0~15 b 的效果.此方法需花費2 條目標指令.為優(yōu)化上述操作,可預(yù)先在某目標寄存器中存放低16 b 的掩碼,即0x000000000000ffff,再將此掩碼與代抽取寄存器進行與操作得到其低16 b,此方法只需花費1 條目標指令.為進一步節(jié)省該目標寄存器,可利用RISC-V B 擴展中的zext.h 指令.具體地,目標指令zext.h rd,rs 可對寄存器rs 的低16 b 進行0 擴展并寫入寄存器rd.
對于字節(jié)讀取,又分從0~7 b 讀取(如AL 寄存器)和從8~15 b 讀取(如AH 寄存器)2 種情況.從0~7 b 讀取的情況較簡單,其掩碼為0x00000000000000ff,可通過12 b 有符號數(shù)表示,故可通過目標指令andi rd,rs,0xff 實現(xiàn),無需進一步優(yōu)化.要從8~15 b 讀取,則需先對寄存器右移8 b,再借助上述目標指令抽取結(jié)果的低8 b,共計2 條目標指令.為進一步優(yōu)化,可利用RISC-V B 擴展中的xperm.b 指令.如圖6(a)所示,指令xperm.b rd,rs1,rs2 根據(jù)寄存器rs2 中的索引向量對寄存器rs1 中的值以字節(jié)為單位查找并重組,若索引向量中的元素大于7,則結(jié)果向量中相應(yīng)位置為0.故可通過目標指令序列l(wèi)i r,0xffffffffffffff01;xperm.b rd,rs,r 實現(xiàn)“從寄存器rs 讀取8~15 b 到寄存器rd”的功能.具體地,0xffffffffffffff01 為xperm.b 所用索引向量,其功能為“將寄存器rs 中索引為0x01 的字節(jié)寫入寄存器rd 的第0 字節(jié),并將rd 其余字節(jié)清0”.將該索引向量預(yù)先存放到某目標寄存器,可節(jié)省用于加載立即數(shù)的指令li,從而通過一條xperm.b 指令讀取x86 寄存器8~15 b 的字節(jié).

Fig.6 Behaviors of xperm.b instruction and the pack instruction in RISC-V B extension圖6 RISC-V B 擴展中 xperm.b 指令和 pack 指令的行為
寫入操作更復(fù)雜,因為寫入x86 寄存器的字節(jié)和半字要求其他字節(jié)保持不變.以半字寫入操作為例,需先將寫入目標的0~15 b 清0,再將待寫入數(shù)據(jù)的16~63 b 清0,最后對二者進行或操作,QEMU-i386 為該過程翻譯出5 條目標指令.為優(yōu)化此過程,可利用RISC-V B 擴展中pack 和xperm.b 指令,其中pack 指令的行為如圖6(b)所示.首先通過pack 指令把寫入目標的0~31 b 和待寫入數(shù)據(jù)的0~31 b 拼接起來,再借助合適的索引向量讓xperm.b 指令從拼接結(jié)果中選擇正確的字節(jié)并重組,得到寫入操作的結(jié)果.通過pack 指令拼接后,寫入目標的數(shù)據(jù)位于拼接結(jié)果的第2 字節(jié)(從0 開始計數(shù),下同)和第3 字節(jié),待寫入數(shù)據(jù)位于拼接結(jié)果的第4 字節(jié)和第5 字節(jié),故令索引向量為0xffffffff03020504.同理可實現(xiàn)0~7 b 的寫入和8~15 b 的寫入,索引向量分別為0xffffffff03020104和0xffffffff03020400.將索引向量預(yù)先存放到某目標寄存器,可通過2 條目標指令實現(xiàn)x86 寄存器的字節(jié)和半字寫入操作.
若采用RISC-V P 擴展,則可通過1 條目標指令實現(xiàn)x86 寄存器的字節(jié)和半字寫入操作.對于字節(jié)寫入操作,可通過insb 指令把待寫入字節(jié)插入到寫入目標中的正確位置;而對于半字寫入操作,可通過pktb16 rd,rs1,rs2 指令將rs1 的16~31 b 與rs2 的0~15 b 進行拼接.但RISC-V P 擴展的標準規(guī)范仍未完全凍結(jié),其指令語義還可能變化.
本文首先在模擬器上評估翻譯出的RISC-V64指令數(shù)量.本文選擇Spike 模擬器[28]作為RISC-V64模擬器,它被RISC-V 基金會指定為RISC-V 指令行為的標準參考實現(xiàn).本文在Spike 模擬器的基礎(chǔ)上新增了一個動態(tài)二進制翻譯模塊,得到DBT-Spike.DBTSpike 可在運行時刻從內(nèi)存中讀出x86 指令并譯碼,然后生成RISC-V64 目標指令并執(zhí)行.DBT-Spike 還為用戶態(tài)模式提供運行時環(huán)境的支持,包括加載x86程序以及系統(tǒng)調(diào)用的捕獲和轉(zhuǎn)發(fā).
本文選擇SPEC CPU2006 的整數(shù)基準程序,使用編譯目標為i686-linux-gnu 的GCC 10.2.1 編譯基準程序,編譯選項為-O2 和-static,其中使用-static 是因為DBT-Spike 暫不支持加載動態(tài)鏈接的程序.該編譯目標將編譯出靜態(tài)鏈接的32 b x86 程序,這些程序?qū)杂脩魬B(tài)模式在DBT-Spike 上運行,DBT-Spike 將統(tǒng)計執(zhí)行的RISC-V64 指令數(shù)量,從而體現(xiàn)動態(tài)二進制翻譯技術(shù)的翻譯質(zhì)量.本文采用test 輸入規(guī)模來運行SPEC CPU2006 的整數(shù)基準程序.實驗評估不采用浮點基準程序,一方面是因為QEMU 通過純軟件模擬方法翻譯浮點指令,難以準確統(tǒng)計其動態(tài)目標指令數(shù)量;另一方面,本文的優(yōu)化技術(shù)主要針對整數(shù)指令的翻譯.
圖7 展示依次添加各項優(yōu)化技術(shù)后,DBT-Spike通過動態(tài)二進制翻譯方式執(zhí)行基準程序所花費的動態(tài)目標指令數(shù)量,其中以QEMU-i386 的動態(tài)目標指令數(shù)量作為歸一化的基準,數(shù)值越小表示優(yōu)化效果越好.具體地,在這一基準上,“兼容RISC-V64 ABI的目標寄存器分配方案”平均節(jié)省41%的動態(tài)目標指令數(shù)量,對于483.xalancbmk 甚至可節(jié)省48%的動態(tài)目標指令數(shù)量.在此基礎(chǔ)上采用“基于PIE 的虛擬地址空間復(fù)用方法”,可平均節(jié)省總計48%的動態(tài)目標指令數(shù)量.進一步優(yōu)化地址合規(guī)化,則可平均節(jié)省總計56%的動態(tài)目標指令數(shù)量.繼續(xù)對復(fù)雜指令、有效地址計算方法和x86 寄存器訪問方式進行優(yōu)化后,最終可平均節(jié)省總計57%的動態(tài)目標指令數(shù)量,說明這3 種優(yōu)化技術(shù)在選定的基準程序上的優(yōu)化效果不明顯.分析后發(fā)現(xiàn),這是因為在基準程序的熱點基本塊中,復(fù)雜指令、復(fù)雜尋址模式以及x86 字節(jié)和半字訪問頻率較低.以復(fù)雜指令為例,占比最多的是400.perlbench 的pack 輸入集,其復(fù)雜指令占源程序動態(tài)指令數(shù)的比例達到0.13%;對于大部分基準程序,該比例均小于0.000 1%.

Fig.7 Number of dynamic target instructions after applying optimization for binary translation圖7 使用二進制翻譯優(yōu)化后的動態(tài)目標指令數(shù)量
本文在現(xiàn)場可編程門陣列(field programmable gate array,F(xiàn)PGA)平臺上評估動態(tài)二進制翻譯優(yōu)化技術(shù)的性能.為此,本文采用開源亂序超標量RISC-V處理器BOOM[29]作為目標處理器,并使用LargeBOOM的配置,其流水線的具體配置如表3 所示.LargeBOOM還分別配備32 KB 一級指令緩存和32 KB 一級數(shù)據(jù)緩存,以及1 MB 的二級聯(lián)合緩存.此外,本文在其流水線中實現(xiàn)了擴展指令.目標處理器被綜合并下載到Xilinx zu19eg FPGA[30]中,主頻為80 MHz.為緩解FPGA 中內(nèi)存主頻比CPU 主頻高的問題,本文在訪存通路上額外添加90 周期延遲,以得到更接近真實芯片場景的性能數(shù)據(jù).

Table 3 Pipeline Configuration of LargeBOOM表3 LargeBOOM 流水線配置
為在目標處理器上評估本文提出的動態(tài)二進制翻譯優(yōu)化技術(shù),本文將DBT-Spike 修改成翻譯程序DBT-FEMU.DBT-FEMU 在翻譯出目標指令后,將切換到執(zhí)行模式,并跳轉(zhuǎn)到目標指令執(zhí)行;而在遇到未翻譯的基本塊時,將切換到翻譯模式對基本塊進行翻譯.同時,DBT-FEMU 實現(xiàn)了塊鏈接技術(shù)和條件碼惰性求值技術(shù).
本節(jié)用于性能評估的基準程序及其編譯方法與5.1 節(jié)相同.同樣的x86 基準程序?qū)⑦\行在DBTFEMU 和QEMU-i386 6.2.0 中,二者均可將x86 指令翻譯為RISC-V64 指令,并在相同的目標處理器上運行.此外,目標處理器上將啟動RISC-V64 版本的Linux 5.6.0 操作系統(tǒng)內(nèi)核,并運行Debian 12 發(fā)行版,DBT-FEMU 和QEMU-i386 將在該發(fā)行版上運行,系統(tǒng)層次如圖8 所示:

Fig.8 System stack of FPGA platform圖8 FPGA 平臺的系統(tǒng)棧
圖9 展示了QEMU-i386 和DBT-FEMU 運行基準程序的性能.考慮總體性能,QEMU-i386 的平均運行效率是本地的8.04%;而DBT-FEMU 的平均運行效率達到本地的33.54%,是QEMU-i386 的4.17 倍.其中,執(zhí)行429.mcf 時,DBT-FEMU 的效率甚至達到本地運行效率的1.12 倍.這是因為429.mcf 的核心數(shù)據(jù)中包含指針,在RISC-V64 的本地程序中,429.mcf 大小是x86 程序的2 倍,因此x86 程序的工作集比RISC-V64本地程序小,對目標處理器數(shù)據(jù)緩存的壓力也更小.此外,執(zhí)行456.hmmer 時,DBT-FEMU 的效率是QEMU-i386的6.90 倍,這是因為雖然456.hmmer 屬于整數(shù)基準程序,但其運行過程中需執(zhí)行不少浮點指令.據(jù)統(tǒng)計,執(zhí)行x86 的456.hmmer,其動態(tài)浮點指令的比例達到所有動態(tài)指令的3.30%,而對其他整數(shù)基準程序來說,該比例不足1%.故456.hmmer 放大了QEMU-i386 執(zhí)行浮點指令較慢的效果,使執(zhí)行456.hmmer 時DBT-FEMU相對QEMU-i386 的效率高于執(zhí)行其他基準程序.

Fig.9 Performance ratio of DBT-FEMU and QEMU-i386圖9 DBT-FEMU 與QEMU-i386 的性能比例
考慮優(yōu)化技術(shù)點,以QEMU-i386 作為基線,“兼容RISC-V64 ABI 的目標寄存器分配方案”平均貢獻了2.64 倍的性能提升,因為該技術(shù)直接將源寄存器分配到目標寄存器,優(yōu)化了冗余的目標訪存指令.在此基礎(chǔ)上,優(yōu)化段式地址轉(zhuǎn)換可額外提升5.98%的性能;繼續(xù)優(yōu)化地址合規(guī)化可再次提升5.39%的性能.但優(yōu)化復(fù)雜指令幾乎未帶來性能提升(小于 0.01%),這是因為復(fù)雜指令的占比很低.在此基礎(chǔ)上,優(yōu)化有效地址的計算可額外提升2.44%的性能;若繼續(xù)對x86 寄存器的字節(jié)和半字訪問進行優(yōu)化,則性能只提升0.01%,這是因為在熱點基本塊中x86 寄存器的字節(jié)和半字訪問頻率較低.
總體而言,與寄存器分配方案的優(yōu)化相比,其他優(yōu)化技術(shù)只優(yōu)化了整數(shù)計算指令.而與訪存指令相比,目標處理器執(zhí)行整數(shù)計算指令的開銷較小,因此帶來的性能提升不如寄存器分配方案的優(yōu)化明顯,但對于翻譯質(zhì)量的提升仍然有重要意義.
本文以RISC-V64 作為目標ISA,分析了當RISCV64,RISC-V32,MIPS32,x86 分別作為源ISA 時,影響動態(tài)二進制翻譯技術(shù)翻譯質(zhì)量的因素.針對該因素,本文分別提出相應(yīng)的優(yōu)化方法,并借助RISC-V B 擴展和RISC-V P 擴展中的部分指令提升翻譯質(zhì)量.評估數(shù)據(jù)顯示,在運行SPEC CPU2006 的整數(shù)基準程序時,本文優(yōu)化方法可使目標程序所執(zhí)行動態(tài)指令數(shù)平均減少57%,平均性能達到QEMU-i386 的4.12 倍.
作者貢獻聲明:余子濠提出了文章總體思路,實現(xiàn)部分優(yōu)化技術(shù),分析數(shù)據(jù),撰寫和修訂論文;陳璐負責實現(xiàn)擴展指令、運行實驗、統(tǒng)計數(shù)據(jù)和修訂論文;孫凝暉和包云崗負責指導(dǎo)論文撰寫和論文審閱.