楊輝兵,管海兵,梁阿磊
傳統(tǒng)上,軟件開(kāi)發(fā)者已經(jīng)使用profile(程序輪廓)給編譯過(guò)程提供反饋。在profile開(kāi)銷和由于profile而自然增加的穩(wěn)定狀態(tài)下的性能獲益之間,存在一個(gè)重要的性能權(quán)衡。Profile開(kāi)銷由兩部分組成,一是為了放置程序分析探針而需要開(kāi)始分析程序結(jié)構(gòu)的時(shí)間,二是實(shí)際收集profile數(shù)據(jù)的時(shí)間。獲益是由于更好的優(yōu)化代碼而減少的執(zhí)行時(shí)間[1]。
由于程序的動(dòng)態(tài)行為對(duì)程序性能的影響是巨大的,同時(shí)動(dòng)態(tài)行為又顯著地受到了輸入模式的影響,而靜態(tài)分析是無(wú)法預(yù)知程序的動(dòng)態(tài)輸入模式的,因此有必要對(duì)靜態(tài)編譯生成的二進(jìn)制代碼在程序的運(yùn)行時(shí)刻,根據(jù)程序的動(dòng)態(tài)輸入模式及相關(guān)的動(dòng)態(tài)行為進(jìn)行進(jìn)一步的優(yōu)化,從而提高程序的運(yùn)行效率[2]。
動(dòng)態(tài)優(yōu)化技術(shù)是在應(yīng)用程序的運(yùn)行時(shí)刻對(duì)程序的信息進(jìn)行統(tǒng)計(jì)和分析,并對(duì)程序的關(guān)鍵段進(jìn)行必要的優(yōu)化,從而提高程序的性能。由于在動(dòng)態(tài)時(shí)刻對(duì)程序進(jìn)行統(tǒng)計(jì)、分析、優(yōu)化等都要耗費(fèi)時(shí)間,所以動(dòng)態(tài)優(yōu)化必須及時(shí)發(fā)現(xiàn)程序的關(guān)鍵段,并采用快速而高效的分析、優(yōu)化方式,以得到理想的優(yōu)化效果[3]?,F(xiàn)在大多數(shù)虛擬機(jī)的動(dòng)態(tài)優(yōu)化技術(shù)是用純軟件的方式實(shí)現(xiàn)的,只有少數(shù)的系統(tǒng)級(jí)的虛擬機(jī)可能使用硬件來(lái)實(shí)現(xiàn) profiling(可譯為”剖分”)技術(shù),如 BOA[3]。
在軟硬件協(xié)同設(shè)計(jì)的虛擬機(jī)方面,研究的還不多,起步較晚,直到最近十幾年,隨著虛擬機(jī)的廣泛應(yīng)用和發(fā)展,企業(yè)界和學(xué)術(shù)界才開(kāi)始對(duì)硬件支持的虛擬化技術(shù)做深入研究。正如IBM公司W(wǎng)atson實(shí)驗(yàn)室的Leendertvan Doorn在2006年的ACM Virtual Execution Environment 大會(huì)上指出[6],硬件支持的虛擬化技術(shù)已經(jīng)成為一種趨勢(shì)。2008年召開(kāi)的國(guó)際計(jì)算機(jī)體系結(jié)構(gòu)會(huì)議(ISCA),專門(mén)為虛擬機(jī)的核心技術(shù)-動(dòng)態(tài)二進(jìn)制翻譯設(shè)立了一個(gè)Workshop[7],其三大主題分別為:翻譯和代碼發(fā)現(xiàn)的硬件支持;優(yōu)化的硬件支持;運(yùn)行時(shí)管理的硬件支持??梢?jiàn),硬件支持的虛擬化技術(shù)已經(jīng)受到學(xué)術(shù)界越來(lái)越多的關(guān)注。最著名的軟硬件協(xié)同設(shè)計(jì)虛擬機(jī)有IBM公司的DAISY[5], Intel公 司 的 VT(Virtualization Technology)[8]和Transmeta 公司的Crusoe處理器系統(tǒng)[9] [10]。
基于軟硬件協(xié)同方法的虛擬機(jī)設(shè)計(jì),結(jié)合軟硬件協(xié)同設(shè)計(jì)和虛擬機(jī)技術(shù),通過(guò)在原有的處理器芯片上增加虛擬機(jī)協(xié)處理器,軟件和硬件的緊密耦合來(lái)實(shí)現(xiàn)進(jìn)程虛擬機(jī)。軟硬件協(xié)同設(shè)計(jì)改變了傳統(tǒng)基于純軟件的虛擬機(jī)的結(jié)構(gòu)和各單元分工,充分發(fā)揮軟件和硬件各自的優(yōu)點(diǎn),用硬件加速來(lái)緩解虛擬機(jī)的性能瓶頸,從而達(dá)到整體系統(tǒng)的更好的性能。相比純軟件實(shí)現(xiàn)的虛擬機(jī)性能有顯著的提高,并提高對(duì)用戶透明性。
在動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)中,動(dòng)態(tài)優(yōu)化對(duì)提升系統(tǒng)整體性能是至關(guān)重要的。如果在動(dòng)態(tài)優(yōu)化系統(tǒng)中得到硬件的支持,系統(tǒng)的整體性能將顯著的提高。本文針對(duì)動(dòng)態(tài)二進(jìn)制翻譯中的優(yōu)化階段,使用硬件支持的 profiling技術(shù)取代純軟件的profiling技術(shù)來(lái)降低整個(gè)系統(tǒng)的開(kāi)銷,從而提高動(dòng)態(tài)二進(jìn)制翻譯的整體性能。該課題的研究目標(biāo)是基于自主開(kāi)發(fā)的進(jìn)程虛擬機(jī) CrossBit[4],采用硬件支持的 profiling技術(shù)來(lái)降低CrossBit系統(tǒng)的開(kāi)銷,從而提高系統(tǒng)的整體性能。
在通過(guò)調(diào)研國(guó)內(nèi)外關(guān)于硬件支持 Profiling系統(tǒng)的基礎(chǔ)上,本文結(jié)合動(dòng)態(tài)二進(jìn)制翻譯技術(shù)進(jìn)行了創(chuàng)新設(shè)計(jì),使得我們的Profiling系統(tǒng)導(dǎo)致的開(kāi)銷非常小,并且保證了收集到得Profile信息的準(zhǔn)確性。同時(shí),我們的系統(tǒng)與傳統(tǒng)的基于Instrumentation的硬件支持的Profiling系統(tǒng)相比更具有通用性。這樣的基于Instrumentation的方法可以方便的移植到其他的動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)中去,同時(shí)也對(duì)以后的使用硬件來(lái)支持軟件監(jiān)視功能提供了一個(gè)基礎(chǔ)平臺(tái)的作用。
基于 CrossBit的硬件支持 Profiling系統(tǒng)的流程如圖 1所示:
圖 1 基于CrossBit的硬件支持Profiling系統(tǒng)的流程
在圖1中,位于系統(tǒng)總線的左邊是一個(gè)Profiling系統(tǒng)的軟件部分,右邊是Profiling系統(tǒng)的硬件部分,通過(guò)該總線進(jìn)行交互。接下來(lái)的是對(duì)圖1的一個(gè)流程的具體步驟描述。
具體的步驟為:
1)加載MIPS體系結(jié)構(gòu)的可執(zhí)行程序到CrossBit的進(jìn)程空間里,獲得此可執(zhí)行程序的入口地址。然后,以基本塊為單位劃分程序,一個(gè)基本塊通常以一條跳轉(zhuǎn)指令或系統(tǒng)調(diào)用指令所指向地址的指令為開(kāi)始,以下一條跳轉(zhuǎn)指令為結(jié)束。完成基本塊的劃分之后,在每個(gè)基本塊中插入一條目標(biāo)體系結(jié)構(gòu)的存儲(chǔ)指令。其中,源寄存器域的值為裝載每個(gè)基本塊首地址源體系結(jié)構(gòu)程序計(jì)數(shù)器值的本地寄存器號(hào),地址寄存器域的值為裝載有緩沖區(qū)模塊首地址值的寄存器號(hào),偏移量的值為零。具體在基本塊的什么位置插入儲(chǔ)存指令是由CrossBit在獲得了裝載有基本塊的首地址源體系結(jié)構(gòu)程序計(jì)數(shù)器值的寄存器號(hào)后確定的,此儲(chǔ)存指令插入到含有基本塊的首地址源體系結(jié)構(gòu)程序計(jì)數(shù)器值的寄存器號(hào)的指令之后的第一條指令位置處。此寄存器號(hào)通過(guò)CrossBit里的寄存器分配來(lái)滿足。
2)在CrossBit中,分配一塊內(nèi)存區(qū)域存放一個(gè)計(jì)數(shù)器映射表,計(jì)數(shù)器映射表如圖2所示,計(jì)數(shù)器映射表包含有源體系結(jié)構(gòu)程序計(jì)數(shù)器和傳統(tǒng)計(jì)數(shù)器兩項(xiàng),源體系結(jié)構(gòu)程序計(jì)數(shù)器項(xiàng)是存放每個(gè)基本塊首地址源體系結(jié)構(gòu)程序計(jì)數(shù)器值的項(xiàng),傳統(tǒng)計(jì)數(shù)器項(xiàng)存放的是計(jì)數(shù)器值。在翻譯基本塊之前,在 CrossBit中嵌入一小段匯編代碼序列來(lái)傳遞計(jì)數(shù)器映射表的首地址值,該段代碼只執(zhí)行一次,該小段匯編代碼的最后一條是目標(biāo)體系結(jié)構(gòu)的儲(chǔ)存指令,其中源寄存器域的值為計(jì)數(shù)器映射表的首地址。
圖2 計(jì)數(shù)器映射表
其中傳統(tǒng)計(jì)數(shù)器mt_baseaddr變量存放了計(jì)數(shù)器映射表的首地址值,F(xiàn)IFO_baseaddr變量存放了 FIFO緩沖區(qū)的首地址。這段嵌入?yún)R編代碼為:
通過(guò) profiling模塊獲得此計(jì)數(shù)器映射表的首地址值,profiling模塊如圖3所示,profiling模塊第一次從緩沖區(qū)模塊取到的值就是計(jì)數(shù)器映射表的首地址,在profiling模塊內(nèi)保存此值到一個(gè)寄存器里,從而可以保證接下來(lái)的源體系結(jié)構(gòu)程序計(jì)數(shù)器值的查找操作。
3)當(dāng)程序執(zhí)行到插入的儲(chǔ)存指令時(shí),此指令觸發(fā)緩沖區(qū)模塊,把每個(gè)基本塊的首地址源體系結(jié)構(gòu)程序計(jì)數(shù)器值存儲(chǔ)在緩沖區(qū)模塊中。profiling模塊從緩沖區(qū)模塊中取出此源體系結(jié)構(gòu)程序計(jì)數(shù)器值,存放在第一寄存器中,根據(jù)一個(gè)取每個(gè)源體系結(jié)構(gòu)程序計(jì)數(shù)器值的后16位的哈希函數(shù)值,加上計(jì)數(shù)器映射表首地址的值來(lái)查找計(jì)數(shù)器映射表中對(duì)應(yīng)的源體系結(jié)構(gòu)程序計(jì)數(shù)器值,是否與從緩沖區(qū)模塊中取到的源體系結(jié)構(gòu)程序計(jì)數(shù)器值相等;如果相等,則更新第二寄存器中值對(duì)應(yīng)的寄存器映射表中的計(jì)數(shù)器值;如果不相等,再比較第一寄存器和第二寄存器中的源體系結(jié)構(gòu)程序計(jì)數(shù)器值的后16位值,如果后16位值不相等,則沒(méi)有沖突發(fā)生,把此第一寄存器中的源體系結(jié)構(gòu)程序計(jì)數(shù)器值寫(xiě)入計(jì)數(shù)器映射表的相應(yīng)表項(xiàng)中,并設(shè)置相應(yīng)計(jì)數(shù)器的值為1,如果比較的兩源體系結(jié)構(gòu)程序計(jì)數(shù)器值的后16位相等,則沖突發(fā)生,寫(xiě)入到本地內(nèi)存中的下一個(gè)計(jì)數(shù)器值的后16位值不相等的內(nèi)存中。
圖3 專用Profiling硬件模塊
4)程序執(zhí)行過(guò)程中,當(dāng)一個(gè)基本塊的profile
信息收集完畢后,將計(jì)數(shù)器映射表中的對(duì)應(yīng)基本塊的計(jì)數(shù)器值和設(shè)定的閾值相比較,如果比閾值小,則跳到后面基本塊繼續(xù)執(zhí)行,如果變量超過(guò)閾值,則生成相應(yīng)的超級(jí)塊或路徑跟蹤,從而集中進(jìn)行程序的動(dòng)態(tài)優(yōu)化。
評(píng)測(cè)依據(jù)是采用SPEC2000基準(zhǔn)測(cè)試程序。評(píng)測(cè)范疇主要針對(duì)兩個(gè)方面:
◆ Profiling的開(kāi)銷分析
◆ 收集到的Profile信息的準(zhǔn)確性
試驗(yàn)硬件平臺(tái)為 XILINX ML300開(kāi)發(fā)板(VIRTEX-II Pro):
CPU:PowerPC405硬核,300MHz(無(wú)浮點(diǎn)運(yùn)算單元)
內(nèi)存:256MB
磁盤(pán):1GB的CF(CompactFlash)卡
其中,1GB的CF卡分為3個(gè)區(qū),分別是FAT16格式的100MB,500MB的LINUX根分區(qū)和400MB的SWAP分區(qū)。因?yàn)樵撻_(kāi)發(fā)板只有256MB的DDR內(nèi)存,對(duì)動(dòng)態(tài)二進(jìn)制翻譯器CrossBit來(lái)說(shuō),最少需要512MB的內(nèi)存才能跑起來(lái)。所以,定制操作系統(tǒng)內(nèi)核時(shí),就需要把支持 SWAP分區(qū)的工程編譯進(jìn)去。根文件系統(tǒng)制作的時(shí)候也需要把 swapon、swapoff等命令編譯進(jìn)去。
軟件環(huán)境:
本試驗(yàn)采用的測(cè)試程序?yàn)?SPEC CPU2000,SPEC CPU2000是SPEC組織推出的一套CPU子系統(tǒng)評(píng)估軟件。
操作系統(tǒng)內(nèi)核采用的是Linux-xlnx-2.6.26(專門(mén)針對(duì)此開(kāi)發(fā)板的內(nèi)核)。
收集Profile信息后做的優(yōu)化能夠帶來(lái)整體性能的提升,同時(shí)自身也有一定的開(kāi)銷,性能的提升減去開(kāi)銷就是熱路徑優(yōu)化的最終效果。我們主要對(duì)Profiling系統(tǒng)的開(kāi)銷和收集到得Profile信息的準(zhǔn)確性很關(guān)心。這一節(jié)主要對(duì) SPEC 2000中整數(shù)測(cè)試,集中于gzip, mcf, parser, bzip, twolf, crafty進(jìn)行測(cè)試,觀察最終的效果。由于CrossBit的PowerPC后端實(shí)現(xiàn)的還不是很完善,有些SPEC程序還跑不通,所以我們有針對(duì)性的選擇了其中的6個(gè)作為我們實(shí)驗(yàn)的測(cè)試程序。而且它們的輸入集都是test input(因?yàn)镃PU的頻率只有300MHz,如果跑reference input,需要很長(zhǎng)的時(shí)間,由于內(nèi)存的限制,有的時(shí)候可能會(huì)出現(xiàn)內(nèi)存不夠的情況),結(jié)果見(jiàn)表1。
從表1可以看出,測(cè)試集合代表了6種不同類型的程序,涵蓋了大部分程序運(yùn)行的特性。由此可見(jiàn), 只有 bzip2的開(kāi)銷大于3.0% ,可能是因?yàn)樾枰艽蟮膬?nèi)存空間,而開(kāi)發(fā)板只有256MB的內(nèi)存,其它的空間需要通過(guò)SWAP從CF卡中交換過(guò)來(lái)。這樣交換的時(shí)間久占據(jù)了很大部分,從而導(dǎo)致開(kāi)銷不斷增大。如果采用512MB的內(nèi)存,那么由于更少的交換分區(qū)操作的原因Profiling系統(tǒng)的開(kāi)銷可能還會(huì)更少。其它的SPEC程序都小于等于3.0%,平均也只有2.7%。這對(duì)于一般的Profiling系統(tǒng)是一個(gè)非常小的開(kāi)銷。在這樣的開(kāi)銷下,做Profiling系統(tǒng)是非常有應(yīng)用前景的。因?yàn)橐话悴蛔鲕浖rofiling的原因就是因?yàn)殚_(kāi)銷太大。如果需要再進(jìn)一步分析的話,需要跑通更多的SPEC程序來(lái)驗(yàn)證開(kāi)銷結(jié)果。
與用純軟件在CrossBit上的實(shí)現(xiàn)相比,使用軟硬件協(xié)同設(shè)計(jì)的Profiling系統(tǒng)開(kāi)銷更小。但是,這樣的比較是在不用硬件平臺(tái)下進(jìn)行的,一個(gè)是通用的PC機(jī),而另一個(gè)是嵌入式開(kāi)發(fā)板,比較的意義不大。但是,在我們的設(shè)計(jì)中可以在IP核內(nèi)對(duì)Profile信息進(jìn)行更多的處理。這樣,對(duì)基于邊的和基于路徑跟蹤的Profiling系統(tǒng)就可以節(jié)省更多的開(kāi)銷。這樣,就更具有可執(zhí)行性。
相比于吳佑峰和李永豐做的系統(tǒng)[11] 的開(kāi)銷0.6%來(lái)說(shuō),本文開(kāi)發(fā)的系統(tǒng)開(kāi)銷是平均2.7%,都是一個(gè)非常小的開(kāi)銷。但是,[11]中的系統(tǒng)需要修改IA32的體系結(jié)構(gòu),雖然加的指令不多,但是那樣就失去了通用性。而本文設(shè)計(jì)開(kāi)發(fā)的系統(tǒng)具有通用性,可以很容易的移植到其他虛擬機(jī)系統(tǒng)中,只需要修改一些具體的體系結(jié)構(gòu)相關(guān)的設(shè)計(jì)。
表1 有硬件支持Profiling系統(tǒng)與原始無(wú)Profiling系統(tǒng)的開(kāi)銷比較
Profiling的開(kāi)銷來(lái)自翻譯過(guò)的基本塊中插入代碼的執(zhí)行。收集到的 Profile信息放在了一個(gè)計(jì)數(shù)器映射表中,可以通過(guò)打印出其中的 SPC值和計(jì)數(shù)值來(lái)對(duì)比使用純軟件獲得的Profile信息。與純軟件Profiling系統(tǒng)收集到的Profile信息進(jìn)行比較可以有一個(gè)較直接的數(shù)據(jù)比較。在我們的硬件支持的Profiling系統(tǒng)中,通過(guò)在每個(gè)基本塊中插入一條目標(biāo)體系結(jié)構(gòu)存儲(chǔ)指令可以使收集到的 Profile信息準(zhǔn)確,因?yàn)橹灰绦蛘?zhí)行就可以保證每個(gè)基本塊都可以被記錄。但是計(jì)數(shù)器映射表的大小有限,從而使收集到的 Profile信息與理想收集到的信息有一些不一致。
通過(guò)對(duì)比,可以看到我們使用軟硬件協(xié)同設(shè)計(jì)獲得的Profile信息和使用純軟件獲得的Profile信息絕大部分一致。我們只需要在IP核中加入一些必要的寄存器,就可以完全傳遞形成超級(jí)塊或路徑 tracing的信息,而且全部可以在硬件IP核中實(shí)現(xiàn)。這樣,就可以節(jié)省更多的開(kāi)銷。
通過(guò)實(shí)驗(yàn),我們已經(jīng)收集到了準(zhǔn)確的 profile信息,并且是以非常低的開(kāi)銷來(lái)收集 profile信息。從而,以此技術(shù)實(shí)現(xiàn)的有超級(jí)快的profiling系統(tǒng)可以獲得更好的性能。如果需要做更進(jìn)一步的擴(kuò)展,可以使用硬件實(shí)現(xiàn)怎么利用這些信息進(jìn)行超級(jí)塊或路徑tracing的工作。
[1] Smith J E and Nair R.Virtual Machines: Versatile Platforms for Systems and Process, Morgan Kaufman, 2005.
[2] 胡坤,動(dòng)態(tài)二進(jìn)制翻譯中的熱路徑優(yōu)化[D] .上海交通大學(xué)工學(xué)碩士論文,2008.12.
[3] Altman E,Gschuind M.etc,BOA:The Architecture of a Binary Translation Processor, Technical Report RC2166S,T J Watson Research Center, 2000.
[4] 包云程,構(gòu)建基于動(dòng)態(tài)二進(jìn)制翻譯技術(shù)的進(jìn)程虛擬機(jī)[D] .上海交通大學(xué)工學(xué)碩士論文,2006.12.
[5] Ebcioglu K,Altman E.DAISY:Dynamic Compilation for 100% Architectural Compatibility,Proc.of the 24th Int’l Symp.on Computer Architecture, pp.26-37, Jun. 1997.
[6] Leendertvan Doorn, Hardware Virtualization Trends,ACM VEE 2006.
[7] 1st Workshop on Architectural and Microarchitectural Support for Binary Translation,Held in conjunction with the 35th Int'l Symposium on Computer Architecture,2008.
[8] Rich Uhlig,Gil Neiger,Dion Rodgers,Intel virtualization technology,IEEE Comupter Volume:38,2005.
[9] Klaiber A.The Technology Behind Crusoe Processors,Transmeta Technical Brief,2000.
[10] Dehnert J C.et al. The Transmeta Code Morphing Software: Using Speculation, Recovery, and Adaptive Retranslation to Address Real-Life Challenges, Proc. of the 1st Int’l Symp. on Code Generation and Optimizations, pp.15-24, Mar.2003.
[11] Youfeng Wu,YongFong Lee.Hardware-Software Collaborative Techniques for Runtime Profiling and Phase Transition Detection, Journal of Computer Science and Technology,2005.