用于高效動(dòng)態(tài)優(yōu)化的共軛碼生成的制作方法
【技術(shù)領(lǐng)域】
[0001]本公開一般涉及計(jì)算領(lǐng)域。更特別地,實(shí)施例一般涉及用于高效動(dòng)態(tài)優(yōu)化的共軛碼生成。
【背景技術(shù)】
[0002]—些計(jì)算機(jī)系統(tǒng)可以使用虛擬機(jī)(VM)來支持客戶機(jī)操作系統(tǒng)或應(yīng)用。而且,VM包括運(yùn)行在主機(jī)上且實(shí)現(xiàn)面向客戶機(jī)的接口的軟件。虛擬機(jī)的客戶機(jī)和主機(jī)一般利用不同ISA(指令集架構(gòu))。因而,雖然虛擬化對(duì)于能量和成本效率而言可能是重要的關(guān)鍵點(diǎn)(例如對(duì)于云計(jì)算),但是傳統(tǒng)ISA與VM客戶機(jī)之間的語義鴻溝可能造成針對(duì)虛擬機(jī)實(shí)現(xiàn)的關(guān)鍵性能問題。
【附圖說明】
[0003]參照附圖來提供詳細(xì)描述。在附圖中,附圖標(biāo)記的(一個(gè)或多個(gè))最左側(cè)數(shù)字標(biāo)識(shí)在其中該附圖標(biāo)記首次出現(xiàn)的圖。在不同圖中對(duì)相同附圖標(biāo)記的使用指示類似或相同項(xiàng)目。
[0004]圖1圖示了根據(jù)實(shí)施例的生成用于虛擬機(jī)的代碼的系統(tǒng)的框圖。
[0005]圖2圖示了根據(jù)實(shí)施例的提供共軛碼生成的方法的流程圖。
[0006]圖3A-3C圖示了根據(jù)一些實(shí)施例的說明共軛碼的一些特征的樣本偽代碼。
[0007]圖4-6圖示了可以被用于實(shí)現(xiàn)本文所討論的一些實(shí)施例的計(jì)算系統(tǒng)的實(shí)施例的框圖。
【具體實(shí)施方式】
[0008]在以下描述中,闡述了眾多具體細(xì)節(jié)以便提供對(duì)各種實(shí)施例的透徹理解。然而,各種實(shí)施例可以在沒有該具體細(xì)節(jié)的情況下實(shí)踐。在其它實(shí)例中,并未詳細(xì)描述公知的方法、過程、組件和電路,以免使特定實(shí)施例模糊。另外,可以使用各種手段來施行實(shí)施例的各種方面,這些手段諸如是集成半導(dǎo)體電路(“硬件”)、被組織成一個(gè)或多個(gè)程序的計(jì)算機(jī)可讀指令(“軟件”)、或硬件和軟件的某種組合。出于本公開的目的,對(duì)“邏輯”的引用應(yīng)當(dāng)意指硬件、軟件、固件(FM)或其某種組合。
[0009]—些實(shí)施例提供了用于高效動(dòng)態(tài)優(yōu)化的共軛碼生成。如以上所討論的,虛擬化對(duì)于能量和成本效率而言可以是重要的關(guān)鍵點(diǎn)(例如在云計(jì)算中)。然而,一些傳統(tǒng)ISA(例如x86)與VM客戶機(jī)應(yīng)用(或客戶機(jī)操作系統(tǒng)(OS))之間的語義鴻溝可能變成虛擬機(jī)實(shí)現(xiàn)中的關(guān)鍵性能問題。為此目的,實(shí)施例利用對(duì)編譯器和VM的最小改變來克服該鴻溝,從而幫助云計(jì)算和HTML5(或超文本標(biāo)記語言5,其為用于結(jié)構(gòu)化和呈現(xiàn)用于萬維網(wǎng)的內(nèi)容的標(biāo)記語言)實(shí)現(xiàn)。
[0010]一般地,虛擬機(jī)可以包括運(yùn)行時(shí)系統(tǒng)、解釋器和翻譯器。運(yùn)行時(shí)系統(tǒng)處置存儲(chǔ)器管理、異常和線程化。解釋器逐個(gè)解釋客戶機(jī)代碼的指令,并同時(shí)給代碼做簡檔(profile)。當(dāng)發(fā)現(xiàn)代碼是熱的(即,被頻繁執(zhí)行,諸如具有大量迭代的循環(huán)中的代碼)時(shí),翻譯器將代碼整個(gè)翻譯(例如編譯)成主機(jī)代碼,然后,該主機(jī)代碼被存儲(chǔ)到翻譯高速緩存(TCache)中,且隨后被執(zhí)行。翻譯器可以施行各種優(yōu)化以加速經(jīng)翻譯的代碼。
[0011]考慮被編譯成二進(jìn)制文件的源程序,并且然后二進(jìn)制文件在虛擬機(jī)上運(yùn)行。存在兩種情況。第一種,源程序可以被靜態(tài)編譯(例如,如果其是以像C那樣的語言編寫的)。第二種,其還可以由JIT(即時(shí))編譯器在運(yùn)行時(shí)處編譯(例如,如果其是以像Java?字節(jié)碼或JavaScript那樣的語言編寫的)。在這兩種情況中的任一情況中,經(jīng)編譯的二進(jìn)制文件可以在其變熱時(shí)由VM的翻譯器優(yōu)化。第一種情況是常見的。并且,第二種情況在云計(jì)算和網(wǎng)頁瀏覽的時(shí)代中正在變得日益常見。
[0012]例如,在云計(jì)算中,可以向用戶分配虛擬機(jī),并且當(dāng)用戶瀏覽網(wǎng)站時(shí),Java/JavaScript JIT編譯器在該虛擬機(jī)上運(yùn)行。另一示例是通過利用硬件邏輯(諸如Transmeta? Efficeon?芯片)瀏覽網(wǎng)站。而且,雖然JIT編譯器也可以被視為虛擬機(jī),但是在本文中不將其稱為虛擬機(jī)以避免與下層虛擬機(jī)混淆。
[0013]—般而言,分離地設(shè)計(jì)虛擬機(jī)和靜態(tài)/JIT編譯器,并且在它們之間不存在通信或協(xié)作。作為結(jié)果,為此原因而引入語義鴻溝??紤]現(xiàn)實(shí)的示例,作為最流行的ISA,x86 ISA是各種商用VM(例如Transmeta Efficeon)的常見客戶機(jī)ISA。然而,x86可能具有有限的寄存器可用。假設(shè)Java/JavaScript JIT編譯器正在Transmeta Efficeon芯片上運(yùn)行。Java/JavaScript JIT編譯器將首先將源程序編譯成x86代碼,然后Efficeon將把x86代碼翻譯成其本機(jī)VLIW(超長指令字)代碼。
[0014]當(dāng)編譯器生成x86二進(jìn)制文件時(shí),可能已經(jīng)強(qiáng)加x86機(jī)器特定限制(在原始源程序中不存在)。在JIT編譯器之后,大多數(shù)寄存器可能由于有限數(shù)目的X86寄存器而溢出到存儲(chǔ)器中。作為結(jié)果,Efficeon芯片將具有促進(jìn)存儲(chǔ)器回到寄存器(這是關(guān)鍵性能優(yōu)化)的極大難度,即使Efficeon可能具有比x86多得多的寄存器可用。這是由于若干原因所致。第一,在二進(jìn)制文件級(jí)別處施行運(yùn)行時(shí)處的精確別名分析可能是昂貴的(例如過于耗時(shí)或者計(jì)算密集)。第二,由于存儲(chǔ)器模型約束,促進(jìn)存儲(chǔ)器到寄存器可能不安全。第三,VM可能必須保存相同的存儲(chǔ)器圖像,因此不能移除活下來的(live-out)存儲(chǔ)操作。由于這些原因,x86 二進(jìn)制文件和源程序具有語義鴻溝。對(duì)于VM而言,由于x86限制,區(qū)分可能作為必要的和不必要的語義的內(nèi)容幾乎不切實(shí)際。
[0015]為此目的,一些實(shí)施例提供了移除出現(xiàn)在虛擬機(jī)的入口處的語義鴻溝的一般解決方案,其可能牽涉對(duì)VM頂上的編譯器和VM自身二者的最小改變,并具有顯著改進(jìn)性能的潛力。而且,一些實(shí)施例以具有原子區(qū)執(zhí)行支持的系統(tǒng)級(jí)虛擬機(jī)為目標(biāo)。示例是TransmetaEffcieon。為了清楚,當(dāng)在本文中討論編譯器或編譯器修改/改進(jìn)時(shí),所討論的是VM頂上的編譯器,而非VM中的翻譯器(其為內(nèi)部編譯器)。
[0016]圖1圖示了根據(jù)實(shí)施例的生成用于虛擬機(jī)的代碼的系統(tǒng)100的框圖。如圖1中所示,通過靜態(tài)編譯器106或JIT編譯器108來運(yùn)行源程序(項(xiàng)目102和104),其中每一個(gè)編譯器生成用于源程序的兩段代碼(例如,代碼110和112每一個(gè)具有兩段代碼:二進(jìn)制文件和IR(中間表示))。然后向虛擬機(jī)120提供這些代碼。因此,一個(gè)實(shí)施例(例如同時(shí))生成用于源程序的兩段代碼以用于輸入到VM 120。第一代碼是傳統(tǒng)二進(jìn)制代碼并且另一代碼是IR(中間表示)代碼。因此,對(duì)VM 120的僅有改變?cè)谟谄浣邮躀R代碼。
[0017]如圖1中所示,虛擬機(jī)120包括運(yùn)行時(shí)系統(tǒng)邏輯122、解釋器邏輯124和翻譯器邏輯126。運(yùn)行時(shí)系統(tǒng)處置存儲(chǔ)器管理、異常和線程化。解釋器逐個(gè)解釋客戶機(jī)代碼的指令,并同時(shí)給代碼做簡檔。當(dāng)發(fā)現(xiàn)代碼是熱的時(shí),翻譯器將代碼整個(gè)翻譯(例如編譯)成主機(jī)代碼,然后,該主機(jī)代碼被存儲(chǔ)到翻譯高速緩存(TCache)128中,且隨后被執(zhí)行。翻譯器可以施行各種優(yōu)化以加速經(jīng)翻譯的代碼。而且,雖然將TCache 128圖示在VM 120內(nèi)部,但是TCache可以位于計(jì)算平臺(tái)中的其它地方(諸如關(guān)于參照?qǐng)D2和/或4-6的各種存儲(chǔ)設(shè)備/存儲(chǔ)器所討論的那樣),只要其可由翻譯器126訪問即可。
[0018]二進(jìn)制和IR代碼可以每一個(gè)包括區(qū)集合。二進(jìn)制文件和IR之間的區(qū)是一一對(duì)應(yīng)的。對(duì)于一對(duì)這樣的區(qū),一個(gè)來自二進(jìn)制文件并且另一個(gè)來自IR,它們?cè)谡Z義上等同;因而,它們的邊界一一對(duì)應(yīng)并且它們?cè)趦蓚€(gè)對(duì)應(yīng)邊界處具有相同存活值。為此原因,二進(jìn)制文件和IR代碼被稱為“共軛碼” ο而且,在該對(duì)區(qū)內(nèi)部,不要求二進(jìn)制指令和IR指令具有任何對(duì)應(yīng)關(guān)系,只要這兩個(gè)區(qū)具有相同語義即可。對(duì)應(yīng)發(fā)生在邊界處。還要指出的是,二進(jìn)制代碼可以不隨之具有任何注釋。其不隨之具有任何區(qū)信息。僅IR代碼可以具有區(qū)信息,例如對(duì)于區(qū)邊界處的任何IR指令,該IR指令被注釋有處于對(duì)應(yīng)二進(jìn)制區(qū)的對(duì)應(yīng)邊界處的二進(jìn)制指令的地址。
[0019]另外,IR區(qū)的邊界可以被任意地決定。例如,區(qū)可以被VM直接視為原子區(qū)。因此,在實(shí)踐中,邊界可以是通過考慮VM的原子區(qū)支持的約束來決定的。
[0020]而且,IR代碼可以具有部分分配的寄存器,例如對(duì)于跨區(qū)邊界存活(或使用中)的任何變量,其被分配了與在對(duì)應(yīng)二進(jìn)制區(qū)中相同的寄存器和相同的溢出存儲(chǔ)器位置。這樣的部分分配或溢出可以被直接地或者通過IR代碼中的一些注釋而硬編碼在IR代碼中。對(duì)于所有其它變量,在一些實(shí)施例中,IR區(qū)可以使用虛擬寄存器。IR假定無限數(shù)目的虛擬寄存器可用,并且除了以上陳述的部分分配和溢出,IR本質(zhì)上是與機(jī)器無關(guān)的(可移植到其它機(jī)器或者以其它方式對(duì)任何編程語言的編譯器就緒,只要編譯器接受IR即可XIR可以被嵌入有任何高級(jí)程序信息或者由編譯器生成的中間程序信息。
[0021]在生成共軛碼之后,編譯器觸發(fā)VM直接翻譯代碼(例如