專利名稱:使用快速前進域和值特化來進行軟件代碼的編譯器變換的方法和裝置的制作方法
技術領域:
本發(fā)明一般地涉及編譯器,更具體地說涉及能夠基于值特化(valuespecialization)來優(yōu)化軟件代碼的編譯器。
背景技術:
一般地,使用一趟編譯器(one-pass compiler)的結(jié)果是獲得了這樣的目標代碼,如果在它的編譯上花費更多功夫則它會執(zhí)行得更加有效。因此,需要優(yōu)化目標代碼。
在文章Sanjay J.Patel and Steven S.Lumetta.rePlayA HardwareFramework for Dynamic Program Optimization.CRHC Technical Report Draft,Decemeber 1999中,公開了一種稱為“rePlay”的優(yōu)化技術。然而,rePlay主要依賴于硬件來形成多個域(region)并在運行時優(yōu)化所述域。這一對硬件的依賴性可能是不實際的,因為許多優(yōu)化可能很復雜并需要相當多的硬件和軟件編譯時間。
其他優(yōu)化技術包括部分冗余消除(partial redundancy elimination,PRE)和部分死代碼消除(partial dead-code elimination,PDE),其有時也可能不太有效,并且實現(xiàn)起來相當復雜。PDE公開在Rajiv Gupta,DavidE.Benson,and Jesse Z.Fang.“Path profile guided partial dead code eliminationusing predication”.Parallel Architectures and Compilation Techniques,1997中.
另外,另一種稱為“超級塊“(superblock)的優(yōu)化技術公開在Wen-mei W.Hwu et al.“The SuperblockAn Effective Technique for VLIW andSuperscalar Compilation”,The Joumal of Supercomputing.Kluwer AcademicPublishers,1993,pp.229-248中。超級塊中通常簡化了優(yōu)化與調(diào)度的數(shù)據(jù)和控制流。然而,超級塊仍然是一個多出口域(multiple exit region)。因此,優(yōu)化與調(diào)度需要處理諸如邊際退出(side exit)和推測(speculation)之類的問題。
在附圖中以例示而非限制性的方式示出了本發(fā)明,其中相似的標號表示相似的元件圖1是計算系統(tǒng)的一個實施例的框圖;圖2是用于基于值特化來進行程序代碼的編譯器變換的過程的一個實施例的流程圖;圖3示出了FFR的形成以及檢查器(checker)代碼中異常終止(abort)指令的使用;圖4示出了FFR的形成以及檢查器(checker)代碼中斷言(assert)指令的使用;圖5是形成FFR的過程的一個實施例的流程圖;圖6示出了基于子域值特化的程序代碼的變換;圖7是用于基于子域值特化而提供程序代碼的編譯器變換的過程的框圖;圖8示出了基于裝載值特化的程序代碼變換;并且圖9是用于基于裝載指令的值特化而提供程序代碼的編譯器變換的過程的方框圖。
具體實施例方式
本發(fā)明說明了一種方法和裝置,用于基于值特化來執(zhí)行軟件代碼的編譯器變換。
下面的詳細說明的一些部分是以對計算機存儲器內(nèi)的數(shù)據(jù)位的操作的算法和符號表示提供的。這些算法描述和表示是數(shù)據(jù)處理領域內(nèi)的技術人員用來向其同行最有效地傳達其工作的實質(zhì)的手段。在此并且一般地,算法是自一致的步驟序列,從而獲得所需的結(jié)果。這些步驟需要對物理量進行物理操縱。一般但非必然地,這些量采用了電或磁信號的形式,能夠被存儲、傳輸、結(jié)合、比較或操縱。主要是出于通用的原因,人們經(jīng)常發(fā)現(xiàn)將這些信號指稱為位、值、元素、符號、字符、項、數(shù)字等是很方便的。
然而應該認識到,所有這些以及類似的術語將和適當?shù)奈锢砹肯嚓P聯(lián),只是應用到這些量上的便捷標簽。除非有可從下面的討論中明顯看出的其他的具體說明,否則應該認識到在整個發(fā)明中,使用象“處理”、“計算”、“運算”、“確定”或“顯示”之類的術語的討論可指稱計算機系統(tǒng)或類似電子計算設備的動作和處理,所述計算機系統(tǒng)操縱該系統(tǒng)的寄存器和存儲器內(nèi)表示為物理(電學)量的數(shù)據(jù)并轉(zhuǎn)換成所述計算機系統(tǒng)存儲器、寄存器或其他形式的這種信息存儲、傳輸或顯示設備中類似地表示為物理量的其他數(shù)據(jù)。
本發(fā)明還涉及用于執(zhí)行此處的操作的裝置。這一裝置可為所需的目的而專門地構造,或者它可包含通用計算機,該計算機被存儲在其中的計算機程序所選擇性地激活或重配置。這種計算機程序可存儲在計算機可讀存儲介質(zhì)中,例如但不局限于任意類型的磁盤,包括軟盤、光盤、CD-ROM和磁光盤,以及只讀存儲器(ROM)、隨機訪問存儲器(RAM)、EPROM、EEPROM、磁或光卡,或者任意類型的適于存儲電子指令的介質(zhì),每個所述介質(zhì)都耦合到計算機系統(tǒng)總線。使用一個或多個處理設備(例如處理器、中央處理單元等)可執(zhí)行多條指令。
在此提供的算法和顯示并非內(nèi)在地與任何特定計算機或其他裝置相關。各種通用機器可與根據(jù)此處的教導的程序一起使用,或者,構造更加專用的裝置來執(zhí)行所需的方法步驟可能是很方便的。從下面的描述可看出多種這些機器所必需的結(jié)構。另外,本發(fā)明并非是參照任何特定的編程語言來說明的??梢哉J識到,可使用多種編程語言來實現(xiàn)本發(fā)明在此說明的教導。
在下面對實施例的詳細說明中,參考了附圖,所述附圖以圖示的方式示出了具體的實施例,其中可實施本發(fā)明。在附圖中,所有視圖中的類似的標號表示基本類似的組件。以充分的細節(jié)來說明了這些實施例,以使得本領域內(nèi)的技術人員可實施本發(fā)明??梢岳闷渌麑嵤├?,并且可做出各種結(jié)構性、邏輯或電學改變而不會偏離本發(fā)明的范圍。而且,應該理解到,本發(fā)明的各種實施例盡管有所不同,但并非彼此互斥。例如,在一個實施例中說明的特定特征、結(jié)構或特性可被包含在其他實施例中。因此,下面的詳細說明不應當理解成限制性的,本發(fā)明的范圍只由所附的權利要求來限定,并包含了這些權利要求的等同物的所有范圍。
概述本發(fā)明的方法和裝置提供了一種機制,用于基于值特化來進行編譯器變換。一個程序可具有多數(shù)時間都取特定值的表達式。值特化涉及用可能是這些表達式的結(jié)果的值來取代這些表達式,從而簡化了程序的控制和數(shù)據(jù)流。
在一個實施例中,對程序進行檢查,以標識代碼內(nèi)可用于值特化的潛在候選者。所述潛在候選者可能是代碼的子域或特定指令(例如將值從存儲器讀到寄存器的裝載指令)。標識用于值特化的潛在候選者時可考慮各種因素。例如,潛在候選者可能需要具有可預測的控制和數(shù)據(jù)流和/或位于關鍵路徑上(即經(jīng)常被使用)。
然后,對每個潛在候選者,使用對應的歷史數(shù)據(jù)來定義一個值特性(value profile)。在一個其中潛在候選者是子域的實施例中,歷史數(shù)據(jù)包括內(nèi)在值(live-in value)集合和外在值(live-out value)集合,所述值源自這一子域以前的執(zhí)行。在另一個其中的潛在候選者是裝載指令的實施例中,歷史數(shù)據(jù)包括在裝載指令以前的執(zhí)行期間從指定的存儲器地址裝載的值。
基于這些值特性,對潛在候選者進行評估,并將那些很可能會滿足預定義的閾值的潛在候選者添加到所選擇的候選者組中。對于每個所選擇的候選者,將它很可能會呈現(xiàn)的值指定為特化值。例如,每個候選子域與它最經(jīng)常出現(xiàn)的內(nèi)在值和最經(jīng)常出現(xiàn)的外在值相關聯(lián)。每個候選裝載指令與它最可能出現(xiàn)的裝載值相關聯(lián)。
而且,特化值被用來形成包括對應的所選擇的候選者的優(yōu)化域。在一個實施例中,優(yōu)化域的形成開始于修改初始代碼,以對每個所選擇的候選者,使用與該候選者相關聯(lián)的特化值,創(chuàng)建很可能偏向于一個方向的分支。然后,定義具有簡化的控制和數(shù)據(jù)流的域。在一個實施例中,這些域是快速前進域(fastforward region,F(xiàn)FR),其是使用所述有偏分支來特化的。在一個實施例中,通過包含有偏分支,并用對應的特化值來取代高概率分支而忽略低概率分支來特化FFR?;蛘撸ㄟ^使用斷言指令來提升低概率分支,并使用特化數(shù)據(jù)來取代高概率分支來特化FFR。然后,優(yōu)化所獲得的域。
之后,對于每個優(yōu)化域,在獨立的線程上預備初始代碼以用于執(zhí)行,從而如果在執(zhí)行期間出現(xiàn)了低概率值也可確保正確性。
因此,值特化使得編譯器可創(chuàng)建具有簡化的控制和數(shù)據(jù)流的域,從而使得編譯器可實現(xiàn)更激進的代碼優(yōu)化。例如,值特化的使用可消除另外的死代碼(例如,如果去除了低概率分支,則依賴于分支條件的代碼也可能編程死的)。另外,簡化的控制流在許多情形下可消除對推測與補償代碼的需求,并且可減少存活變量(live variable)的數(shù)量,從而減輕了寄存器壓力。而且,大的域被選擇調(diào)度,因而獲得了更好的“每周期可執(zhí)行的指令數(shù)量”(instruction-per-cycle,IPC)參數(shù)。所有這些以及其他優(yōu)點都顯著提高了程序性能。
圖1是計算系統(tǒng)100的一個實施例的框圖。處理系統(tǒng)100包括處理器120和存儲器130。處理器120是能夠編譯軟件并執(zhí)行所獲得的目標代碼的處理器。處理器120還可以是能夠同時在兩個線程上推測式地執(zhí)行代碼的處理器。處理器120可以是能夠執(zhí)行軟件的任意類型的處理器,例如微處理器、數(shù)字信號處理器、微控制器等等。處理系統(tǒng)100可以是個人計算機(PC)、大型機、手持設備、便攜式計算機、機頂盒或包含軟件的任意其他的系統(tǒng)。
存儲器130可以是硬盤、軟盤、隨機訪問存儲器(RAM)、只讀存儲器(ROM)、閃存、或處理器120可讀的任意其他類型的機器介質(zhì)。存儲器130可存儲用于執(zhí)行本發(fā)明的各種方法實施例的指令。
存儲器130存儲程序104、編譯器118和緩沖區(qū)102,編譯器118用于編譯程序104并創(chuàng)建目標代碼,緩沖區(qū)102用于存儲與目標代碼的在先執(zhí)行相關的歷史數(shù)據(jù)。在一個實施例中,編譯器118包括候選者選擇器106、特化值計算器108、域創(chuàng)建器110和優(yōu)化器112。
候選者選擇器106負責分析程序104,以標識值特化的潛在候選者。在這一分析中可考慮各種因素。在一個其中的潛在候選者是裝載指令的實施例中,主要因素是,裝載指令是否在程序的控制流的關鍵路徑上以及裝載指令是否是只讀指令。在另一個其中的潛在候選者是子域的實施例中,合格的子域需要包括至少一個指令,位于關鍵路徑上,并且具有內(nèi)在和外在寄存器。另外,候選子域不應包含存儲器更新指令(例如存儲指令)和函數(shù)調(diào)用指令,并且它的裝載指令應該限于只讀裝載指令等等。
特化值計算器108負責基于存儲在緩沖區(qū)102中的對應的歷史數(shù)據(jù),為每個潛在候選者定義值特性。對應的歷史數(shù)據(jù)包括和該潛在候選者的在先執(zhí)行相關的值集合。例如,如果潛在候選者是子域,則對應的歷史數(shù)據(jù)包括它的某些內(nèi)在寄存器和外在寄存器的多個值集合,所述寄存器在程序104內(nèi)的所述子域的在先執(zhí)行期間被記錄過。如果潛在候選者是裝載指令,則對應的歷史數(shù)據(jù)包括程序104內(nèi)的裝載指令的在先執(zhí)行期間所記錄的多個被裝載的值。
然后,特化值計算器108使用值特性來確定應選擇哪個潛在候選者用于進一步的處理。在一個實施例中,如果潛在候選者最經(jīng)常出現(xiàn)的歷史數(shù)據(jù)具有高于預定閾值的頻度比,則選擇該潛在候選者以用于進一步的處理,下面將更詳細地描述。然后,對于每個所選擇的候選者,將它最經(jīng)常出現(xiàn)的數(shù)據(jù)指定為特化數(shù)據(jù)。
域創(chuàng)建器110使用每個候選者的特化數(shù)據(jù)來形成具有簡化的控制和數(shù)據(jù)流圖的域。每個域可包括單個候選者或多個候選者。在一個實施例中,使用快速前進技術來形成所述域,下面將更詳細地描述?;蛘撸梢允褂帽绢I域內(nèi)公知的任意其他編譯器技術,只要這種編譯器技術能夠在程序的編譯期間基于對應的特化值來形成具有簡化的控制和數(shù)據(jù)流的域。
形成所述域之后,優(yōu)化器112對它們進行優(yōu)化以創(chuàng)建更有效的代碼。而且,在一個實施例中,域創(chuàng)建器110評估每個優(yōu)化域,以確定使用優(yōu)化域所帶來的益處是否超過與使用優(yōu)化域相關聯(lián)的額外開銷。如果額外開銷高于所述益處,則丟棄該優(yōu)化域。在一個實施例中,最終完成優(yōu)化域之后,在一個獨立的線程上為每個優(yōu)化域預備初始代碼以用于后續(xù)執(zhí)行,這樣在該程序的執(zhí)行期間如果出現(xiàn)了低概率值也可確保正確性。在一個實施例中,初始代碼和對應的優(yōu)化域在兩個推測式線程上同時執(zhí)行。
在一個實施例中,處理器120包括域預測器114和存儲緩沖區(qū)116。域預測器114負責控制優(yōu)化域的執(zhí)行。存儲緩沖區(qū)116臨時存儲每個優(yōu)化域的執(zhí)行期間所產(chǎn)生的結(jié)果。如果初始代碼的執(zhí)行確認優(yōu)化域的結(jié)果是正確的,則可提交(commit)存儲緩沖區(qū)116中的結(jié)果(在產(chǎn)生所述結(jié)果之后)。如果在初始代碼的執(zhí)行期間出現(xiàn)了低概率值,則中斷優(yōu)化域的執(zhí)行并丟棄存儲緩沖區(qū)116中的結(jié)果。
圖2是過程200的一個實施例的流程圖,用于基于值特化來執(zhí)行程序代碼的編譯器變換。該過程可由可包含硬件(例如電路、專用邏輯等)、軟件(例如運行在通用計算機系統(tǒng)或?qū)S脵C器上的軟件)或二者的組合的處理邏輯來執(zhí)行。
參考圖2,過程200開始于處理邏輯檢查該程序以標識值特化的潛在候選者(處理框204)。潛在候選者可以是具有代碼或特定指令(例如將值從存儲器轉(zhuǎn)移到寄存器的裝載指令)的子域。如上面更詳細地描述的,在標識值特化的潛在候選者時可考慮各種因素(例如潛在候選者是否具有可預測的數(shù)據(jù)流,它是否在關鍵路徑上等等)。
在處理框206,處理邏輯使用與潛在候選者相關聯(lián)的值特性,從潛在候選者中選擇一組特化候選者。值特性是使用一組對應的歷史數(shù)據(jù)來定義的。在一個其中的潛在候選者是子域的實施例中,歷史數(shù)據(jù)包括源自該子域的在先執(zhí)行的內(nèi)在值集合和外在值集合。在另一個其中的潛在候選者是裝載指令的實施例中,歷史數(shù)據(jù)包括從裝載指令的在先執(zhí)行期間在該裝載指令中所指定的存儲器地址所裝載的值。
在一個實施例中,基于其值特性來評估每個潛在候選者,并且確定它最經(jīng)常出現(xiàn)的歷史數(shù)據(jù)是否滿足預定閾值(即,它的歷史數(shù)據(jù)集合是否包括高概率值)。如果這一確定是肯定的,則將該潛在候選者添加到所選定的候選者組?;蛘?,丟棄該潛在候選者。
在處理框208,處理邏輯為每個所選擇的候選者標識特化值。所述特化值包括一個或多個從歷史數(shù)據(jù)中選擇的高概率值。例如,每個候選子域的特化數(shù)據(jù)包括它最經(jīng)常出現(xiàn)的內(nèi)在值以及對應的最經(jīng)常出現(xiàn)的外在值。每個候選裝載指令的特化數(shù)據(jù)包括它最經(jīng)常裝載的值。
在一個實施例中,在處理框210,處理邏輯使用每個候選者的特化值,將該候選者的初始代碼修改成強烈地偏向一個方向的分支(例如通過對假設值的有效性進行檢查),下面將更詳細地描述。
在處理框212,處理邏輯形成包括對應的所選擇的候選者的域。這些域具有簡化的控制和數(shù)據(jù)流。在一個實施例中,這些域是快速前進域(FFR),這些域是使用有偏分支來特化的。在一個實施例中,通過包含有偏分支,并用對應的特化值來取代高概率分支而忽略低概率分支來特化FFR,下面將結(jié)合圖3而更詳細地描述?;蛘撸ㄟ^使用斷言指令來提升低概率分支,并使用特化數(shù)據(jù)來取代高概率分支來特化FFR,下面將結(jié)合圖4來更詳細地描述。然后,優(yōu)化所獲得的域。
在處理框214,在獨立的線程上預備對應于每個優(yōu)化域的初始代碼以用于執(zhí)行,這樣在執(zhí)行期間如果出現(xiàn)了低概率值也可確保正確性。
之后,在處理框216,去除未包含在任何優(yōu)化域中的所創(chuàng)建的分支,以恢復對應的初始代碼。
快速前進技術快速前進技術是一種用來通過忽略不經(jīng)常執(zhí)行的條件而形成經(jīng)常執(zhí)行的代碼的特化域(稱為快速前進域或FFR)的編譯器技術。采用推測式多線程硬件和編譯器變換來處理不經(jīng)常執(zhí)行的代碼,從而確保正確性。特化的一個示例是去除低概率分支。即,編譯器通過從FFR拷貝子控制流圖并去除低概率分支來形成FFR。對于FFR中每一個被消除的分支,編譯器或者在FFR中插入一個斷言指令,或者在初始代碼中置入一個異常終止指令。編譯器通過比較與使用每個指令相關聯(lián)的益處來選擇合適的指令。所述益處主要取決于與每個指令相關聯(lián)的調(diào)度周期。例如,如果其周期發(fā)生在執(zhí)行的開始處,則使用異常終止指令更為有益。如果指令的執(zhí)行被調(diào)度到稍后的時間,則使用斷言指令更為有益。
初始代碼(如果合適的話還有異常終止指令)構成了檢查器代碼。在稱為檢查器的獨立線程上執(zhí)行檢查器代碼。
圖3示出了FFR的形成以及檢查器代碼中對異常終止指令的使用。參考圖3,代碼310表示源程序的一部分。圖312是對應于代碼310的初始控制流圖。FFR 302是通過去除兩個不經(jīng)常發(fā)生的分支B3和B6而形成的。如圖3所示,F(xiàn)FR 302具有簡化的控制和數(shù)據(jù)流,從而使得編譯器可執(zhí)行更有效而激進的優(yōu)化。
檢查器代碼304是基于初始圖312的,具有兩個異常終止指令306。如果在檢查器代碼304的推測式執(zhí)行期間遇到了不經(jīng)常出現(xiàn)的代碼,則每個異常終止指令306可停止FFR 302的執(zhí)行(“殺掉FFR 302”)?!巴ㄖ狥FR”(notice FFR)指令308停止檢查器代碼304的執(zhí)行。通知FFR指令308被放置在檢查器代碼304的這一位置,因為檢查器代碼304的后續(xù)執(zhí)行不包含任何不經(jīng)常出現(xiàn)的分支。通知FFR指令308使得FFR 302產(chǎn)生的結(jié)果在完成時可被提交。
圖4示出了使用了斷言指令的FFR的形成。參考圖4,F(xiàn)FR 402包括斷言指令408和406,所述斷言指令源自初始圖312中不經(jīng)常出現(xiàn)的分支314和316。斷言指令或者可以將被去除的分支的預測謂詞(predicate)作為唯一的操作數(shù),或者將被去除的檢查的源寄存器作為操作數(shù)。當預測謂詞變?yōu)檎婊蛘咴醇拇嫫骶哂蠳AT(Not a Thing)值時,斷言指令生效。生效的斷言指令殺掉FFR 402的執(zhí)行,并觸發(fā)檢查器代碼304的執(zhí)行。
應該注意到,盡管圖3和4示出了分支特化的示例,但是在此提供的對FFR形成的說明也適用于值特化。
在去除了所有的冷邊緣(cold edge)后,每個候選FFR通常是單入口、單出口域。候選FFR可包括內(nèi)部分支(包括循環(huán)返回分支),或者包括一組這樣的塊,所述塊中不包含任何函數(shù)調(diào)用,并由無條件分支、內(nèi)部分支(包括循環(huán)返回分支)所連接。應該注意到,存在許多種這樣的代碼優(yōu)化方案,與應用到具有更復雜的結(jié)構的域相比較,這些優(yōu)化方案應用于單入口、單出口域更為有效。
因此,候選FFR應該具有高度的完成概率(即發(fā)生邊際退出的概率很低),并具有很好的優(yōu)化機會。
圖5是用于形成FFR的過程的一個實施例的流程圖。該過程可由可包含硬件(例如電路、專用邏輯等)、軟件(例如運行在通用計算機系統(tǒng)或?qū)S脵C器上的軟件)或二者的結(jié)合的處理邏輯來執(zhí)行。
參考圖5,過程500開始于處理框504,其中處理邏輯為程序選擇并形成候選FFR之前,對程序應用標準的可用的優(yōu)化方案(包括優(yōu)勢性能分析(edge profiling)反饋和調(diào)度),以盡可能提供最好的基準代碼。基準代碼是不包含任何FFR的初始代碼。而且,應該注意到,只有當所述域可對從其導出該域的基準代碼提供性能改進時才選擇并形成FFR。
然后,處理邏輯繼續(xù)到定義候選域,并從候選域形成FFR。在定義候選域時,首先選擇候選域的孕育塊(seed block)(處理框506)。典型的孕育塊應經(jīng)常被執(zhí)行,應包括高度有偏分支指令,不應已包含在另一個候選域種,并且不應具有可被選為孕育塊的任何前導塊。一旦被選擇,孕育塊就被復制并擴展成候選域(處理框508)。候選域應該滿足若干需求。例如,候選域應該具有主入口和主出口,它的控制流應當很可能是從主入口到達主出口(即高完成概率)等。另外,候選域可具有若干邊際出口,但每個邊際出口應該具有非常低的退出概率(例如<0.5%)。
在處理框510,分析每個候選域的益處和額外開銷(例如使用諸如退出概率和關鍵路徑周期之類的信息)。在一個實施例中,在分析期間,可對域進行剪裁(trim)以減少額外開銷。當分析完成時,在判決框514處確定使用候選域的益處是否仍低于源自使用該候選域的額外開銷。如果確定是肯定的,則丟棄該候選域(處理框516)?;蛘?,復制候選域的子控制流圖以形成候選FFR(處理框518)。
而且,還確定是否有其他候選域需要進行分析(判決框520)。如果確定是肯定的,則分析下一個候選域(處理框522),并且對下一個候選域執(zhí)行框514-518。對每個剩下的候選域重復上述處理。
形成了所有的FFR后(即判決框520處的確定是肯定的),將它們連接到具有快速前進和等待-提交指令的控制流圖,如圖3所示。隨后,對每個候選FFR應用基于域的優(yōu)化。而且,通過將每個FFR處理為原子操作,對整個程序進行全局優(yōu)化。優(yōu)化之后,比較每個候選FFR相對于初始代碼的實際益處。如果其益處未超過額外開銷則丟棄候選FFR。
基于子域的值特化如上所述,編譯器可基于子域值特化來變換程序。圖6示出了基于子域值特化的程序代碼變換。
參考圖6,假設代碼域602中的數(shù)組A是只讀的,并且循環(huán)604經(jīng)常是重復20次并產(chǎn)生相同的輸出值(例如,和=1000)。如果與這一輸出值相關聯(lián)的頻度比超過預定閾值,則循環(huán)604可被特化成和的這一高概率值(例如特化成1000)??梢允褂盟鲎佑蛑堤鼗瘉韯?chuàng)建FFR 606。FFR606是一個特化域,因為它使用了子域604的特化值,并跳過了對其他值的所有計算。其他值的計算在方框610中由檢查器代碼608處理。檢查器代碼608執(zhí)行在一個獨立的線程上。如果循環(huán)604的執(zhí)行重復20次,則執(zhí)行一個通知FFR指令,該指令停止檢查器代碼608的進一步執(zhí)行。如果循環(huán)604重復的次數(shù)小于或大于20次,則執(zhí)行一個異常終止指令來殺掉FFR 606,并且檢查器代碼608繼續(xù)執(zhí)行框610中所示的代碼。
圖7是過程700的框圖,該過程用于提供基于子域值特化的程序代碼的編譯器變換。該過程可由可包含硬件(例如電路、專用邏輯等)、軟件(例如運行在通用計算機系統(tǒng)或?qū)S脵C器上的軟件)或二者的結(jié)合的處理邏輯來執(zhí)行。
參考圖7,過程700開始于處理邏輯定義潛在子域候選者的值特性(處理框704),并確定該潛在子域候選者是否適格于值特化(處理框706)。下面的示例示出了如何執(zhí)行子域R的適格(qualification)。
對于候選子域R,假設它的內(nèi)在寄存器是LVI(R),而外在寄存器是LVO(R)。子域R的入口處的LVI(R)中的值集合是內(nèi)在設置值。子域R的出口處的LVO(R)的值集合是外在設置值。值特性由下述信息構成F1(I)在子域R的執(zhí)行期間很可能出現(xiàn)的內(nèi)在值和外在值集合的發(fā)生頻度;F(R)子域R的內(nèi)在值和外在值的歷史集合的總數(shù)量;VI(R)高概率內(nèi)在設置值;VO(R)高概率外在設置值。
如果所述頻度比超過預定閾值,則選擇子域R進行特化。即,如果F1(R)/F(R)>閾值(例如99%),則選擇子域R。
然后,在處理框708,確定所選擇的子域的特化值。在上述示例中,特化值是VI(R)和VO(R)。在處理框710,將值特化用于創(chuàng)建所選擇的子域的有偏分支。例如,對于上述示例中的子域R,可以創(chuàng)建下面的有偏分支(對于LVI(R)={r1,r2,...,rk}和VI(R)={c1,c2,...,ck},使用聚合比較LVI(R)==VI(R)作為一系列簡單比較r1=c1&&r2==c2&&...&&rk==ck的便捷方式)IF(LVI(R)==VI(R))LVO(R)=VO(R)/*特化代碼*/ELSER將頻度比F1(R)/F(R)分配給從IF語句到特化代碼的分支。由于F1(R)/F(R)>閾值(例如99%),因此強烈地偏向這一分支。
然后在形成包括子域R的FFR時使用所述有偏分支(處理框710)。在處理框712,還創(chuàng)建同時包括高概率分支和低概率分支的檢查器代碼,如圖6所示。
基于裝載的值特化圖8示出了基于裝載值特化的程序代碼的變換。參考圖8,代碼域802包括裝載指令804。假設裝載指令804所裝載的值經(jīng)常等于100。如果裝載指令804的頻度比超過預定閾值,則裝載值100可被選擇為裝載指令804的特化值。使用這一特化值,裝載指令804可被轉(zhuǎn)換成域806中所示的有偏分支?;谒鲇衅种?,創(chuàng)建FFR 808。在FFR 808內(nèi),消除了裝載指令,并可前移依賴于所述裝載的代碼以提高性能。檢查器代碼810同時包括來自代碼806的高概率和低概率分支。檢查器代碼810可由傳統(tǒng)的值轉(zhuǎn)發(fā)(value forwarding)來優(yōu)化,獲得了新的檢查器代碼812。
注意,即使特化代碼806在工作分支“IF(v==100)”之前包含裝載指令,F(xiàn)FR域808也只包含所述特化代碼。在FFR形成期間,(通過在檢查器代碼810中插入異常終止指令)去除該工作分支,結(jié)果,也消除了這一分支前的裝載指令,因為只有這一分支使用了裝載值。如果使用斷言指令(而非異常終止指令),則裝載指令仍保留在FFR 808中。然而,F(xiàn)FR使得特化代碼和裝載指令彼此獨立。即,特化代碼可與裝載指令并行地執(zhí)行。因為裝載操作要花費幾個周期,因此特化代碼之后的代碼也可能在裝載指令的執(zhí)行完成之前執(zhí)行,從而減少了周期數(shù)量。
圖9是過程900的框圖,該過程用于提供基于裝載指令的值特化的程序代碼的編譯器變換。該過程可由可包含硬件(例如電路、專用邏輯等)、軟件(例如運行在通用計算機系統(tǒng)或?qū)S脵C器上的軟件)或二者的結(jié)合的處理邏輯來執(zhí)行。
參考圖9,過程900開始于處理邏輯定義潛在裝載指令候選者的值特性(處理框904),并確定潛在裝載指令候選者是否適格于值特化(處理框906)。下面的示例說明了如何執(zhí)行裝載指令I的適格。
對于候選裝載指令I,假設該裝載定義的寄存器是LO(I)。值特性由下述信息構成F1(I)裝載指令I執(zhí)行期間最可能出現(xiàn)的裝載值的頻度;F(I)裝載指令I的歷史裝載值的總數(shù)量;V(I)高概率裝載值。
如果所述頻度比超過預定閾值,則選擇裝載指令I進行特化。即,如果F1(I)/F(I)>閾值(例如99%),則選擇裝載指令I。
然后,在處理框908,確定所選擇的裝載指令的特化值。在上述示例中,特化值是V(I)。在處理框910,使用值特化來創(chuàng)建所選擇的裝載指令的有偏分支。例如,假設裝載指令中的存儲器地址是ADDR(I)。基于特化值,可以創(chuàng)建下述有偏分支v=load[ADDR(I)]IF(V==LV(I))LO(I)=V(I)/*特化代碼*/ELSE
LO(I)=v將頻度比F1(I)/F(I)分配給從IF語句到特化代碼的分支。由于F1(I)/F(I)>閾值(例如99%),因此強烈地偏向這一分支。
然后在形成包括裝載指令I的FFR時使用高概率分支(處理框910)。在處理框912,還創(chuàng)建同時包括高概率分支和低概率分支的檢查器代碼,如圖8所示。
在一個實施例中,如果丟棄了FFR(例如由于其不具有足夠的益處),則恢復被修改的代碼以去除有偏分支。
應該理解到,上述說明是說明性而非限制性的。在閱讀并理解上述說明后,許多其他的實施例對本領域內(nèi)的技術人員來說是很清楚的。因此,本發(fā)明的范圍應參考所附權利要求來確定,并包括這些權利要求的等同物的全部范圍。
權利要求
1.一種方法,包括在軟件代碼中標識多個潛在候選者以用于值特化;基于與所述多個潛在候選者中的每一個潛在候選者相關聯(lián)的值特性,從所述多個潛在候選者選擇一組候選者;使用對應的值特性,為所述候選者組中的每一個候選者確定特化數(shù)據(jù);以及基于對應的特化數(shù)據(jù)形成多個優(yōu)化域,其中所述多個優(yōu)化域中的每一個都包括一個或多個來自所述候選者組的候選者。
2.如權利要求1所述的方法,其中所述多個優(yōu)化域中的每一個都是快速前進域。
3.如權利要求2所述的方法,還包括創(chuàng)建與每個快速前進域相關聯(lián)的檢查器代碼以用于在獨立的線程上推測式執(zhí)行,其中所述檢查器代碼包括對應于所述每個快速前進域的初始代碼。
4.如權利要求3所述的方法,其中所述快速前進域包括一個或多個斷言指令,以當所述快速前進域的執(zhí)行期間出現(xiàn)了所述特化數(shù)據(jù)之外的數(shù)據(jù)時,殺掉所述快速前進域的執(zhí)行并觸發(fā)所述檢查器代碼的執(zhí)行。
5.如權利要求3所述的方法,其中所述檢查器代碼包括一個或多個異常終止指令,以當所述檢查器代碼的執(zhí)行期間出現(xiàn)了所述特化數(shù)據(jù)之外的數(shù)據(jù)時,停止所述快速前進域的執(zhí)行。
6.如權利要求1所述的方法,其中所述多個優(yōu)化域中的每一個都具有簡化的控制流。
7.如權利要求1所述的方法,其中選擇所述候選者組還包括基于與所述多個潛在候選者中的每一個潛在候選者相關聯(lián)的歷史數(shù)據(jù),定義所述多個潛在候選者中的每一個潛在候選者的值特性;分析每個值特性,以在所述值特性當中發(fā)現(xiàn)一組具有最高發(fā)生頻度的歷史數(shù)據(jù);確定所述最高頻度是否大于預定頻度閾值;如果所述頻度大于所述閾值,則將對應的潛在候選者添加到所述所選擇的候選者組;以及如果所述頻度不大于所述閾值,則丟棄所述對應的潛在候選者。
8.如權利要求1所述的方法,其中每個候選者的特化數(shù)據(jù)是所述多個潛在候選者中對應的潛在候選者的值特性當中具有最高發(fā)生頻度的一組歷史數(shù)據(jù)。
9.如權利要求1所述的方法,其中形成多個優(yōu)化域包括修改初始代碼,以使用所述特化數(shù)據(jù)來為所述候選者組中的每個候選者創(chuàng)建有偏分支;使用對應的有偏分支來定義所述多個優(yōu)化域;將與使用所述多個優(yōu)化域中的每一個優(yōu)化域相關聯(lián)的益處和與使用所述多個優(yōu)化域中的所述每一個優(yōu)化域相關聯(lián)的額外開銷進行比較;以及如果所述額外開銷超過所述益處,則丟棄所述多個優(yōu)化域中的所述優(yōu)化域。
10.如權利要求1所述的方法,其中所述候選者組包括一個或多個裝載指令。
11.如權利要求10所述的方法,其中與所述裝載指令中的每一個裝載指令有關的特化數(shù)據(jù)是與所述裝載指令中的所述每個裝載指令相關聯(lián)的值特性當中具有最高發(fā)生頻度的裝載值。
12.如權利要求1所述的方法,其中所述候選者組包括一個或多個代碼子域。
13.如權利要求12所述的方法,其中與所述子域中的每一個子域有關的特化數(shù)據(jù)包括與所述子域中的所述每個子域相關聯(lián)的值特性當中最經(jīng)常出現(xiàn)的內(nèi)在值集合與最經(jīng)常出現(xiàn)的外在值集合。
14.一種裝置,包括候選者選擇器,用于在軟件代碼中標識多個潛在候選者以用于值特化;特化值計算器,用于基于與所述多個潛在候選者中的每一個潛在候選者相關聯(lián)的值特性,從所述多個潛在候選者選擇一組候選者,并且使用對應的值特性,為所述候選者組中的每一個候選者確定特化數(shù)據(jù);以及域創(chuàng)建器,用于基于對應的特化數(shù)據(jù)形成多個優(yōu)化域,其中所述多個優(yōu)化域中的每一個優(yōu)化域都包括一個或多個來自所述候選者組的候選者。
15.如權利要求14所述的裝置,其中所述多個優(yōu)化域中的每一個都是快速前進域。
16.如權利要求14所述的裝置,其中所述特化值計算器還通過下述操作來選擇所述候選者組基于與所述多個潛在候選者中的每一個潛在候選者相關聯(lián)的歷史值,定義所述多個潛在候選者中的每一個潛在候選者的值特性;分析每個值特性,以在所述值特性內(nèi)發(fā)現(xiàn)一個或多個具有最高發(fā)生頻度的歷史數(shù)據(jù);確定所述最高頻度是否大于預定頻度閾值;如果所述頻度大于所述閾值,則將對應的潛在候選者添加到所述所選擇的候選者組;以及如果所述頻度不大于所述閾值,則丟棄所述對應的潛在候選者。
17.如權利要求14所述的裝置,其中每個候選者的特化數(shù)據(jù)是所述多個潛在候選者中對應的潛在候選者的值特性當中具有最高發(fā)生頻度的一個或多個歷史值。
18.如權利要求14所述的裝置,其中所述域創(chuàng)建器通過下述操作來形成多個優(yōu)化域修改初始代碼,以使用所述特化數(shù)據(jù)來為所述候選者組中的每個候選者創(chuàng)建有偏分支;使用對應的有偏分支來定義所述多個優(yōu)化域;將與使用所述多個優(yōu)化域中的每一個優(yōu)化域相關聯(lián)的益處和與使用所述多個優(yōu)化域中的所述優(yōu)化域相關聯(lián)的額外開銷進行比較;以及如果所述額外開銷超過所述益處,則丟棄所述多個優(yōu)化域中的所述優(yōu)化域。
19.如權利要求14所述的裝置,其中所述候選者組包括一個或多個裝載指令。
20.如權利要求19所述的裝置,其中與所述裝載指令中的每一個裝載指令有關的特化數(shù)據(jù)是與所述裝載指令中的所述每個裝載指令相關聯(lián)的值特性當中具有最高發(fā)生頻度的裝載值。
21.如權利要求14所述的裝置,其中所述候選者組包括一個或多個代碼子域。
22.如權利要求21所述的裝置,其中與所述子域中的每一個子域有關的特化數(shù)據(jù)包括與所述子域中的所述每個子域相關聯(lián)的值特性當中最經(jīng)常出現(xiàn)的內(nèi)在值集合與最經(jīng)常出現(xiàn)的外在值集合。
23.一種系統(tǒng),包括編譯器,用于通過下述操作來提高軟件代碼的性能基于與所述多個候選者中的每一個候選者相關聯(lián)的值特性,從軟件代碼選擇多個候選者用于值特化;使用對應的值特性,為每個所選擇的候選者確定特化數(shù)據(jù);以及基于對應的特化數(shù)據(jù)形成多個覆蓋所述所選擇的候選者中的一個或多個候選者的優(yōu)化域;存儲器,用于存儲所述軟件代碼和所述編譯器;以及處理器,耦合到所述存儲器以執(zhí)行所述編譯器。
24.如權利要求23所述的系統(tǒng),其中所述多個優(yōu)化域中的每一個都是快速前進域。
25.如權利要求23所述的系統(tǒng),其中每個候選者的特化數(shù)據(jù)是所述多個潛在候選者中對應的潛在候選者的歷史數(shù)據(jù)當中具有最高發(fā)生頻度的一個或多個歷史值。
26.如權利要求23所述的系統(tǒng),其中所述候選者組包括一個或多個裝載指令。
27.如權利要求23所述的系統(tǒng),其中所述候選者組包括一個或多個代碼子域。
28.一種計算機可讀介質(zhì),其提供多條指令,所述指令在處理器上執(zhí)行時使得所述處理器執(zhí)行包括下述操作的操作在軟件代碼中標識多個潛在候選者以用于值特化;基于與所述多個潛在候選者中的每一個潛在候選者相關聯(lián)的值特性,從所述多個潛在候選者選擇一組候選者;使用對應的值特性,為所述候選者組中的每一個候選者確定特化數(shù)據(jù);以及基于對應的特化數(shù)據(jù),形成多個優(yōu)化域,其中所述多個優(yōu)化域中的每一個都包括一個或多個來自所述候選者組的候選者。
29.如權利要求28所述的計算機可讀介質(zhì),其中所述候選者組包括一個或多個裝載指令。
30.如權利要求28所述的計算機可讀介質(zhì),其中所述候選者組包括一個或多個代碼子域。
全文摘要
本發(fā)明說明了一種方法和裝置,用于使用具有簡化的數(shù)據(jù)和控制流的域以及值特化來提供代碼的編譯器變換。在一個實施例中,所述方法包括在代碼中標識多個潛在候選者以用于值特化;基于與每個潛在候選者相關聯(lián)的值特性,從所述多個潛在候選者選擇一組候選者;以及使用對應的值特性,為每個所選擇的候選者確定特化數(shù)據(jù)。所述方法還包括基于對應的特化數(shù)據(jù)來形成多個優(yōu)化域。每個優(yōu)化域都包括一個或多個所選擇的候選者。
文檔編號G06F9/45GK1571954SQ02819243
公開日2005年1月26日 申請日期2002年8月30日 優(yōu)先權日2001年9月29日
發(fā)明者佑峰·吳, 麗玲·陳 申請人:英特爾公司