專利名稱:用于多線程的編譯器創(chuàng)建輔助線程的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明的實施例涉及信息處理系統(tǒng),尤其涉及用于多線程的編譯器創(chuàng)建輔助器。
背景存儲器等待時間已變成實現(xiàn)現(xiàn)代處理器的高性能的關(guān)鍵瓶頸?,F(xiàn)今的許多大型應(yīng)用是存儲器密集的,因為它們的存儲器訪問模式很難預測且它們的工作組正變得相當大。盡管高速緩存設(shè)計的持續(xù)進步以及預取技術(shù)的新發(fā)展,存儲器瓶頸問題仍然存在。當執(zhí)行指針密集的應(yīng)用程序時該問題更糟,這些應(yīng)用程序趨向于違背常規(guī)的基于跨步的預取技術(shù)。
一種解決方案是使一個程序中的存儲器停頓與來自另一個程序的有用指令的執(zhí)行相重疊,從而在總體處理量上有效地改善系統(tǒng)性能。改善單個處理器的多任務(wù)工作負荷的處理量已經(jīng)是新興同時多線程(SMT)技術(shù)背后的主要動因。SMT處理器能在同一周期內(nèi)發(fā)出來自多個硬件環(huán)境或邏輯處理器(也稱作硬件線程)的指令到超標量處理器的功能單元。SMT通過在每個周期內(nèi)經(jīng)由獨立線程之間的自然并行的利用來增加架構(gòu)可用的總指令級并行從而實現(xiàn)了更高的總處理量。
SMT還可以改善多線程的應(yīng)用的性能。但是,SMT不直接借助減少等待時間改善單線程應(yīng)用的性能。由于常規(guī)PC環(huán)境中大多數(shù)桌面應(yīng)用仍是單線程的,所以研究SMT資源是否和如何可被用于通過減少其等待時間來增強單線程的代碼性能是很重要的。
通過參考被用于說明本發(fā)明實施例的以下描述和附圖最佳地理解本發(fā)明。圖中圖1示出了根據(jù)一個實施例的具有多線程能力的計算機系統(tǒng)。
圖2示出了根據(jù)可選實施例的具有多線程能力的計算機系統(tǒng)。
圖3示出了根據(jù)一個實施例的具有能產(chǎn)生輔助線程的編譯器的計算機系統(tǒng)。
圖4A示出了典型的對稱多線程進程。
圖4B示出了根據(jù)一個實施例的不對稱多線程進程。
圖5是示出根據(jù)一個實施例的用于執(zhí)行一個或多個輔助線程的示例性進程的流程圖。
圖6是示出根據(jù)一個實施例的多線程系統(tǒng)的示例性軟件架構(gòu)的框圖。
圖7是示出根據(jù)一個實施例的用于生成輔助線程的示例性進程的流程圖。
圖8是示出根據(jù)一個實施例的用于并行分析的示例性進程的流程圖。
圖9A-9C示出了根據(jù)一個實施例的用于應(yīng)用程序、主線程和輔助線程的偽代碼。
圖10是示出根據(jù)一個實施例的示例性線程配置的框圖。
圖11是示出根據(jù)一個實施例的用于分配用于線程的資源的示例性偽代碼的框圖。
圖12是示出根據(jù)一個實施例的包含用于線程的資源信息的示例性資源數(shù)據(jù)結(jié)構(gòu)的框圖。
圖13是示出根據(jù)一個實施例的分配用于線程的資源的示例性進程的流程圖。
圖14A-14D示出了使用技術(shù)實施例的多種基準測試的結(jié)果。
具體實施例方式
將描述用于多線程系統(tǒng)的編譯器創(chuàng)建輔助線程的方法和裝置。根據(jù)一個實施例,也稱作自動輔助器(AutoHelper)的編譯器在例如Intel Corporation的IntelPentiumTM4超線程系統(tǒng)的多線程系統(tǒng)上執(zhí)行基于線程的預取輔助線程。在一個實施例中,編譯器使用于超線程處理器的輔助線程的生成自動化。這些技術(shù)關(guān)注識別和生成最小尺寸的輔助線程,它們可以被執(zhí)行以實現(xiàn)及時和有效的數(shù)據(jù)預取,同時引發(fā)最小的通信開銷。還執(zhí)行運行系統(tǒng)以有效地管理輔助線程以及線程之間的同步。結(jié)果,輔助線程能發(fā)出用于順序指針密集應(yīng)用的及時預取。
此外,可以在編譯器內(nèi)為輔助線程管理諸如寄存器環(huán)境的硬件資源。特別是,可以靜態(tài)地或動態(tài)地在主線程和輔助線程之間以及多個輔助線程之間分割寄存器組。結(jié)果,當編譯器用盡資源時或者在出現(xiàn)特定主線程事件的不頻繁的情況的運行時,可以避免經(jīng)由線程存儲器的內(nèi)駐/外駐寄存器拷貝并且可以在編譯時間處破壞所述線程。
在以下描述中,闡述了大量細節(jié)。但是,可以理解,本發(fā)明的實施例可在沒有這些細節(jié)的情況下實施。在其它實例中,未詳細示出公知電路、結(jié)構(gòu)和技術(shù),以便不影響對描述的理解。
以下詳細描述的一些部分按照算法和對計算機存儲器內(nèi)數(shù)據(jù)比特的操作的符號表示來提供。數(shù)據(jù)處理領(lǐng)域內(nèi)的熟練技術(shù)人員將這些算法描述和表示用于最有效地將其工作實質(zhì)傳達給本領(lǐng)域的其它熟練技術(shù)人員。這里,算法被認為是獲得期望結(jié)果的自一致操作序列。這些操作需要物理量的物理操作。通過,盡管不是必需,但這些量采取能夠存儲、傳遞、組合、比較和其它處理的電子或磁性信號的形式。已證明,特別是出于共同使用的原因,將這些信號稱作比特、值、元素、符號、字符、項、數(shù)量等有時是方便的。
但要記住,所有這些和類似的術(shù)語與合適的物理量相關(guān)聯(lián)且僅僅是應(yīng)用于這些量的方便的標記。除非從以下討論中顯見的另外的特別聲明,可以理解,使用諸如“處理”或“計算”或“計算”或“確定”或“顯示”等的術(shù)語在通篇描述中表示計算機系統(tǒng)或類似數(shù)據(jù)處理裝置的動作和過程,它們將表示為計算機系統(tǒng)的寄存器和存儲器內(nèi)的物理(例如,電子)量的數(shù)據(jù)處理和轉(zhuǎn)換成類似地被表示為計算機系統(tǒng)存儲器或寄存器或其它這種信息存儲、傳輸或顯示裝置內(nèi)的物理量的其它數(shù)據(jù)。
本發(fā)明的實施例還涉及用于執(zhí)行這里所述的操作的裝置。一個裝置可專門為所需的用途而構(gòu)建,或者它可以包括由計算機中存儲的計算機程序選擇性地激活或再配置的通用計算機。這種計算機程序可存入計算機可讀存儲媒介,諸如但不限于任何類型的盤,包括軟盤、光盤、CD-ROM和磁光盤,只讀存儲器(ROM),諸如動態(tài)RAM(DRAM)的隨機存取存儲器(RAM),可擦可編程ROM(EPROM)、電可擦可編程ROM(EEPROM)、磁或光卡,或者適于存儲電子指令的任何類型的媒體,其中以上存儲組件的每一種都耦合于計算機系統(tǒng)總線。
這里提供的算法和顯示非固有地關(guān)于任何特殊計算機或其它裝置。各種通用裝置可與根據(jù)這里的教導的程序一起使用,或者可證明構(gòu)建專門的裝置來執(zhí)行這些方法是方便的。用于這些系統(tǒng)的結(jié)構(gòu)可從以下描述中顯現(xiàn)。此外,本發(fā)明的實施例不參考任何特殊的編程語言進行描述??梢岳斫?,各種編程語言都可用于實現(xiàn)這里描述的本發(fā)明實施例的教導內(nèi)容。
機器可讀媒介包括用于以機器(例如計算機)可讀的形式存儲和發(fā)送信息的任何機制。例如,機器可讀媒介包括只讀存儲器(ROM);隨機存取存儲器(RAM);磁盤存儲媒體;光學存儲媒體;閃存裝置;電氣、光學、聲學或其它形式的傳播信號(例如,載波、紅外線信號、數(shù)字信號等);等等。
圖1是可與實施例一起使用的示例性計算機的框圖。例如,圖1所示的示例性系統(tǒng)100可執(zhí)行圖5-8所示的進程。示例性系統(tǒng)100可以是多線程系統(tǒng),諸如Intel PentiumTM4超線程系統(tǒng)。示例性系統(tǒng)100可以是同時多線程(SMT)或芯片多進程(CMP)使能系統(tǒng)。
注意雖然圖1示出了計算機系統(tǒng)的各種組件,但它不打算表示互連這些組件的任何特殊架構(gòu)或方式,因為這些細節(jié)并非與本發(fā)明是密切聯(lián)系的。還可以理解,網(wǎng)絡(luò)計算機、手持計算機、蜂窩電話和具有更少或更多組件的其它數(shù)據(jù)處理系統(tǒng)也可與本發(fā)明一起使用。
如圖1所示,作為一種數(shù)據(jù)處理系統(tǒng)形式的計算機系統(tǒng)100包括耦合到微處理器103和ROM107、易失性RAM105和非易失性存儲器106的總線102。微處理器103(可以是Intel Corporation的Pentium處理器或者Motorola,Inc.的PowerPC處理器)與高速緩存存儲器104耦合,如圖1的示例中所示的??偩€102將這些組件互連在一起并且還將這些組件103、107、105和106耦合到顯示器控制器和顯示器裝置108,以及輸入/輸出(I/O)裝置110,它們可以是鼠標、鍵盤、調(diào)制解調(diào)器、網(wǎng)絡(luò)接口、打印機和本領(lǐng)域公知的其它裝置。通常,輸入/輸出裝置110通過輸入/輸出控制器109耦合到系統(tǒng)。易失性RAM105通常作為需要持續(xù)供電以刷新或維持存儲器中的數(shù)據(jù)的動態(tài)RAM(DRAM)實現(xiàn)。非易失性存儲器106通常是磁性硬盤驅(qū)動器、磁光驅(qū)動器、光學驅(qū)動器或DVD RAM或者及時在系統(tǒng)斷電后也能維持數(shù)據(jù)的其它類型的存儲器系統(tǒng)。通常,非易失性存儲器還將是隨機存取存儲器,盡管這是不必要的。雖然圖1示出非易失性存儲器是與數(shù)據(jù)處理系統(tǒng)中的剩余組件直接耦合的本地裝置,但可以理解,本發(fā)明可以使用遠離系統(tǒng)的非易失性存儲器,諸如通過諸如調(diào)制解調(diào)器或以太網(wǎng)接口的網(wǎng)絡(luò)接口與數(shù)據(jù)處理系統(tǒng)耦合的網(wǎng)絡(luò)存儲裝置??偩€102可以包括通過各種橋路、控制器和/或適配器相互連接的一條或多條總線,如本領(lǐng)域公知的。在一個實施例中,I/O控制器109包括用于控制USB外圍設(shè)備的USB(通用串行總線)適配器或者用于控制PCI裝置的PCI控制器,它們可以包含在IO裝置110中。在進一步的實施例中,I/O控制器109包括用于控制IEEE 1394裝置(也稱作火線裝置)的IEEE 1394控制器。
根據(jù)一個實施例,處理器103可以包括一個或多個邏輯硬件環(huán)境,也稱作邏輯處理器,用于同時多個線程,包括也稱作非猜測線程的主線程以及也稱作猜測線程的一個或多個輔助線程。處理器103可以是超線程處理器,諸如Intel Corporation的能執(zhí)行多線程處理的Pentium 4或Xeon處理器。在應(yīng)用程序的執(zhí)行期間,并行地執(zhí)行主線程和一個或多個輔助線程。輔助線程與主線程相關(guān)聯(lián)地(但稍許獨立)猜測執(zhí)行,以執(zhí)行主線程的一些預先計算,諸如地址或數(shù)據(jù)的猜測預取,從而減少由主線程引起的存儲器等待時間。
根據(jù)一個實施例,輔助線程的代碼(例如源代碼和二進制可執(zhí)行代碼)由諸如Intel Corporation的AutoHelper編譯器的編譯器生成,由諸如處理器103的處理器執(zhí)行的操作系統(tǒng)(OS)在諸如易失性RAM105的存儲器中加載并執(zhí)行。示例性系統(tǒng)100內(nèi)運行的操作系統(tǒng)可以是Microsoft Corporation的Windows操作系統(tǒng)或者是Apple Computer的Mac OS?;蛘撸摬僮飨到y(tǒng)可以是Linux或Unix操作系統(tǒng)??梢允褂弥T如嵌入式實時操作系統(tǒng)的其它操作系統(tǒng)。
當前的超線程處理器通常提供兩個硬件環(huán)境或邏輯處理器。為了改善單線程應(yīng)用的性能,超線程技術(shù)可利用其第二環(huán)境執(zhí)行主線程的預取。具有分開的環(huán)境允許輔助線程的執(zhí)行與主線程的控制流斷開,這與軟件預取不同。通過遠在主線程之前執(zhí)行長程預取,輔助線程可較早地觸發(fā)預取,并消除或減少主線程所經(jīng)受的高速緩存預取失敗的處罰。
采用AutoHelper,編譯器能自動生成用于超線程機器的預取輔助線程。輔助線程針對向順序工作負荷提供超線程的等待時間隱匿的好處。與常規(guī)并行編譯器所產(chǎn)生的線程不同,輔助線程僅預取,它不再使用來自輔助線程的計算結(jié)果的主線程。根據(jù)一個實施例,程序正確性仍由主線程的執(zhí)行來維護,而輔助線程不影響程序正確性且僅用于性能改善。該屬性允許在生成輔助線程時使用更進取形式的優(yōu)化。例如,當主線程不需要幫助時,可以執(zhí)行某些優(yōu)化,這是常規(guī)處理量線程范例所不可能的。
在一個實施例中,如果預測在某一時間周期內(nèi)不需要輔助器,該輔助器可以終止并釋放與該輔助器相關(guān)的所有資源給主線程。根據(jù)另一實施例,如果預測立刻需要一輔助器,則該輔助器可處于暫停模式,這仍消耗超線程硬件上的一些資源。如果輔助器停留在暫停模式太久(例如,超過了可編程超時周期),則將調(diào)用指數(shù)補償(通過暫停)。根據(jù)進一步的實施例,如果編譯器不能預測何時將需要輔助線程,則該輔助器可處于打盹模式并可以放棄所占用的處理器資源給主線程。
此外,根據(jù)一個實施例,在輔助線程范例下使得性能監(jiān)控和在傳輸進程中調(diào)節(jié)成為可能,因為輔助線程不給出主程序的語義。當主線程需要輔助器時,它將喚醒主線程。例如,相對于失控輔助器或落后(run-behind)線程,可調(diào)用上述進程之一來調(diào)節(jié)該失控輔助線程。
圖2示出的是能執(zhí)行所揭示的技術(shù)的計算系統(tǒng)200的一個實施例的框圖。在一個實施例中,計算系統(tǒng)200包括處理器204和存儲器202。存儲器202可存儲用于控制處理器204的操作的指令210和數(shù)據(jù)212。處理器204可包括向執(zhí)行核心230提供指令信息的前端221。該前端221可按程序順序向處理器核心204提供指令信息。
對于至少一個實施例,前端221包括讀取/解碼單元222,它包括用于多個線程上下文中的每一個的邏輯上獨立的定序器。邏輯上獨立的定序器220可包括標記邏輯280以便將用于猜測線程的指令信息標記為“猜測的”。本領(lǐng)域的熟練技術(shù)人員將認識到,對于在多處理器多線程上下文中執(zhí)行的實施例,讀取/解碼單元222內(nèi)可以僅包括一個定序器220。
如這里所使用的,術(shù)語“指令信息”意在表示執(zhí)行核心230能理解和執(zhí)行的指令。指令信息可存入高速緩存225。該高速緩存225可作為執(zhí)行指令高速緩存或執(zhí)行跟蹤高速緩存而實現(xiàn)。對于使用執(zhí)行指令高速緩存的實施例,“指令信息”包括從指令高速緩存讀取并被解碼的指令。對于使用跟蹤高速緩存的實施例,術(shù)語“指令信息”包括解碼的微操作碼的跟蹤。對于不使用執(zhí)行指令高速緩存也不使用跟蹤高速緩存的實施例,“指令信息”還包括用于可存入諸如I高速緩存244的指令高速緩存的指令的原始字節(jié)。
圖3是示出根據(jù)一個實施例的包含用于生成一個或多個輔助線程的編譯器的示例性系統(tǒng)的框圖。參考圖3,示例性處理系統(tǒng)300包括存儲器系統(tǒng)302和處理器304。存儲器系統(tǒng)302可存儲用于控制處理器304的操作的指令310和數(shù)據(jù)312。例如,指令310可包括編譯器程序308,它在被執(zhí)行時使得處理器304編譯存儲器系統(tǒng)302內(nèi)駐留的程序。存儲器302保存要編譯的程序、程序的中間形式以及所獲得的已編譯的程序。對于至少一個實施例,編譯器程序308包括指令來生成用于相對于主線程的一個或多個輔助線程的代碼。
存儲器系統(tǒng)302意在作為存儲器的廣義化表示并可以包括各種形式的存儲器,諸如硬盤驅(qū)動器、CD-ROM、隨機存取存儲器(RAM)、動態(tài)隨機存取存儲器(DRAM)、靜態(tài)隨機存取存儲器(SRAM)和有關(guān)電路。存儲器系統(tǒng)302可以存儲由處理器304執(zhí)行的數(shù)據(jù)信號所表示的指令310和/或數(shù)據(jù)。指令310和/或數(shù)據(jù)可包括用于執(zhí)行這里所討論的任何或所有技術(shù)的代碼。
特別是,編譯器308可包括拖欠(delinquent)負荷標識符320,它在由處理器304執(zhí)行時標識主線程的一個或多個拖欠負荷區(qū)域。編譯器308也可包括并行分析器324,它在由處理器304執(zhí)行時對輔助線程進行一個或多個并行分析。此外,編譯器308可包括分片器(slicer),它標識要由輔助線程執(zhí)行的一個或多個時間片以執(zhí)行猜測預先計算。編譯器308可進一步包括代碼發(fā)生器328,它在由處理器304執(zhí)行時生成用于輔助線程的代碼(例如,源代碼和可執(zhí)行代碼)。
根據(jù)一個實施例,如圖4B所示,SMT機制中的執(zhí)行輔助線程是不對稱多線程的一種形式。常規(guī)的并行編程模式提供對稱的多線程,如圖4A所示。相反,諸如圖4B中的輔助線程451-454的輔助線程作為具有輕量線程調(diào)用和切換的用戶級線程(纖維(fiber))執(zhí)行。此外,對稱多線程需要對稱線程(諸如圖4A中的線程401-404)中良好地調(diào)諧的數(shù)據(jù)分解。在輔助線程模型中,根據(jù)一個實施例,主線程運行對整個數(shù)據(jù)組操作的順序代碼,而不引起數(shù)據(jù)分解開銷。在不分解數(shù)據(jù)的情況下,編譯器代替地集中于提供多個輔助器用于及時地預取主線程的數(shù)據(jù)。
圖5是示出根據(jù)一個實施例的用于執(zhí)行輔助線程的示例性進程的流程圖。示例性進程500可通過處理邏輯執(zhí)行,該處理邏輯可包括硬件(電路、專用邏輯等)、軟件(諸如在通用計算機系統(tǒng)或?qū)S脵C器上運行的)或者它們的組合。在一個實施例中,示例性進程500包括執(zhí)行多線程系統(tǒng)中的應(yīng)用程序的主線程,并在主線程進入具有一個或多個拖欠負荷的區(qū)域時從主線程中產(chǎn)生一個或多個輔助線程以執(zhí)行用于該主線程的一項或多項計算,其中在主線程的編譯期間創(chuàng)建一個或多個輔助線程的代碼。
參考圖5,在框501處,處理邏輯創(chuàng)建內(nèi)部線程池以維持一個或多個輔助線程所使用的邏輯線程上下文的列表。在框502處,可以在主線程進入由編譯器標識的拖欠負荷區(qū)域(例如,預先計算區(qū)域)之前創(chuàng)建新線程隊。在一個實施例中,新線程隊初始僅包含調(diào)用線程。根據(jù)一個實施例,在主線程進入所述區(qū)域以激活一個或多個輔助線程之前,編譯器可插入一語句,諸如start_helper語句。在框503處,當主線程進入所述區(qū)域時,主線程(經(jīng)由諸如invoke_helper的函數(shù)調(diào)用)產(chǎn)生一個或多個輔助線程,它們利用來自線程池的資源被創(chuàng)建以執(zhí)行主線程的一項或多項預先計算,諸如預取地址和數(shù)據(jù)。根據(jù)一個實施例,如果對于執(zhí)行所產(chǎn)生的輔助線程無邏輯處理器可用,則可創(chuàng)建輔助線程并將其置入用于線程隊的運行隊列,用于后續(xù)執(zhí)行。在一個實施例中,運行隊列可與超時相關(guān)聯(lián)。假定預取將不再是及時的,在超時周期期滿后,簡單地結(jié)束(終止)對調(diào)用輔助器的請求。這與用于其中需要執(zhí)行每個任務(wù)的并行編程的常規(guī)任務(wù)隊列模型不同。
在框504處,部分利用一個或多個輔助線程提供的數(shù)據(jù)(例如,預取的或預先計算的)執(zhí)行主線程的區(qū)域內(nèi)的至少一部分代碼。根據(jù)一個實施例,輔助線程計算的結(jié)果不被集成入主線程。輔助線程的好處在于其預取的副作用,而不在于再使用其計算結(jié)果。這允許編譯器進取地優(yōu)化輔助線程的代碼生成。主線程處理正確性問題,同時輔助線程把程序性能作為目標。這還允許輔助線程調(diào)用語句(諸如invoke_helper)以在認為合適時結(jié)束請求。最后,如果在輔助線程中發(fā)生異常信號,諸如預取指令的非故障指令可用于避免對主線程的中斷。
在框505處,當主線程接近退出拖欠負荷區(qū)域時終止與主線程相關(guān)聯(lián)的一個或多個輔助線程(通過函數(shù)調(diào)用,諸如finish_helper),且與終止的輔助線程相關(guān)聯(lián)的諸如邏輯線程上下文的資源被釋放回給線程池。這使得將來的請求能立刻再循環(huán)來自線程池的邏輯線程上下文??砂ū绢I(lǐng)域的普通技術(shù)人員顯而易見的其它操作。
超線程技術(shù)良好地適于支持一個或多個輔助線程的執(zhí)行。根據(jù)一個實施例,在每個處理器周期中,在共享的執(zhí)行資源上可以調(diào)度并同時執(zhí)行來自任一邏輯處理器的指令。這允許輔助線程及時地發(fā)出預取。此外,整個片載高速緩存分級體系在邏輯處理器之間共享,這有助于輔助線程有效地在高速緩存分級體系的所有等級處預取主線程。此外,盡管在邏輯處理器之間共享物理執(zhí)行資源,在超線程處理器中復制該架構(gòu)狀態(tài)。輔助線程的執(zhí)行將不改變執(zhí)行主線程的邏輯處理器中的架構(gòu)狀態(tài)。
但是,在超線程技術(shù)使能的機器上,由于對存儲器的寫入,輔助線程仍會影響主線程的執(zhí)行。因為輔助線程與主線程共享存儲器,輔助線程的執(zhí)行應(yīng)保證不對主線程的數(shù)據(jù)結(jié)構(gòu)進行寫入。在一個實施例中,編譯器(例如,AutoHelper)提供主線程和輔助線程之間的存儲器保護。編譯器去除對輔助線程中非本地變量的存儲。
圖6是示出根據(jù)一個實施例的編譯器的示例性架構(gòu)的框圖。在一個實施例中,示例性架構(gòu)600包括前端模塊601、剖析器(profiler)602、過程間分析和優(yōu)化模塊603、編譯器604、全局標量優(yōu)化模塊605以及后端模塊606等。在一個實施例中,前端模塊601提供用于諸如C/C++和Fortran的各種編程語言編寫的源代碼的共用中間表示,諸如來自Intel Corporation的IL0表示。結(jié)果,可應(yīng)用諸如AutoHelper604的編譯器,而不管源語言和目標平臺。剖析器602進行剖析運行以檢查該表示的特征。過程間分析模塊603可暴露穿越過程調(diào)用邊界的優(yōu)化機會。此后,調(diào)用編譯器604(例如,AutoHelper)以生成用于一個或多個輔助線程的代碼。全局標量優(yōu)化模塊605利用部分冗余消除進行應(yīng)用以最小化表達式估值的次數(shù)。最后,后端模塊606生成用于各種平臺的輔助線程的二進制代碼,諸如IntelCorporation的IA-32或Itanium平臺??梢园ū绢I(lǐng)域普通技術(shù)人員顯而易見的其它組件。
與常規(guī)方法不同,AutoHelper(例如,編譯器)消除了剖析實行傳遞以使該工具更易于使用。根據(jù)一個實施例,編譯器可直接分析來自剖析結(jié)果的輸出,諸如由Intel的VTuneTMPerformance Analyzer所生成的那些,這能用于超線程技術(shù)。因為它是代替后傳遞工具的中間端傳遞,該編譯器能使用幾種產(chǎn)品品質(zhì)分析,諸如陣列依賴性分析和全局標量優(yōu)化等。在編譯器之后調(diào)用的這些分析對輔助線程的代碼進行進取的優(yōu)化。
根據(jù)一個實施例,編譯器生成一個或多個輔助線程以預先計算和預取由頻繁預取失敗的高速緩存的負荷(也稱作拖欠負荷)所訪問的地址。編譯器還生成產(chǎn)生一個或多個輔助線程的主線程中的一個或多個觸發(fā)器。編譯器將該觸發(fā)器作為調(diào)用函數(shù)實現(xiàn),諸如invoke_helper函數(shù)調(diào)用。一旦達到該觸發(fā)器,就期望負荷稍后出現(xiàn)于主線程的指令流中,因此猜測執(zhí)行的輔助線程可減少主線程中高速緩存預取失敗的數(shù)量。
圖7是示出根據(jù)一個實施例的由諸如AutoHelper的編譯器執(zhí)行的示例性進程的流程圖。示例性進程700可由處理邏輯執(zhí)行,該處理邏輯可包括硬件(電路、專用邏輯等)、軟件(諸如通用計算機系統(tǒng)或?qū)S脵C器上運行的)或者它們的組合。在一個實施例中,示例性進程700始于框701,用以使用例如Intel Corporation的VTune工具標識拖欠負荷,以執(zhí)行用于輔助線程的并行分析(框702),以生成用于輔助線程的代碼(框703),并且向每個輔助線程和主線程分配諸如硬件寄存器或存儲器的資源(框704),這將在以下詳細描述。
根據(jù)一個實施例,編譯器利用一個或多個運行時間剖析標識應(yīng)用程序源代碼中大多數(shù)拖欠負荷。常規(guī)編譯器按兩個步驟收集這些剖析剖析實行和剖析生成。但是,因為高速緩存預取失敗不是向編譯器揭示的架構(gòu)特點,剖析實行傳遞不允許對編譯器的高速緩存預取失敗的實行以標識拖欠負荷。用于每個高速緩存分級體系的剖析經(jīng)由諸如Intel Corporation的VTuneTMAnalyzer的實用程序被收集。在一個實施例中,可以用在編譯器之前在分開的剖析運行中的調(diào)試信息來執(zhí)行應(yīng)用程序。在剖析運行期間,采樣高速緩存預取失敗且為應(yīng)用程序中的每個靜負荷累計硬件計數(shù)器。
編譯器標識用于基于線程的預取的候選。在特殊實施例中,VTuneTM以每個負荷為基概括高速緩存行為。因為用調(diào)試信息(例如,調(diào)試符號)編譯用于剖析運行的二進制,可能使剖析與源程序行數(shù)及語句相關(guān)。形成大于一預定閾值的某些負荷可標識為拖欠負荷。在一特殊實施例中,形成90%高速緩存預取失敗的最大負荷被標注為拖欠負荷。
除了標識拖欠負荷指令之外,編譯器生成精確計算拖欠負荷地址的輔助線程。在一個實施例中,生成用于輔助線程的分開代碼。主線程和輔助線程的代碼之間的分開阻止輔助線程的代碼轉(zhuǎn)換影響到主線程。在一個實施例中,編譯器使用多入口線程,代替Intel產(chǎn)品的編譯器中的常規(guī)出線,以生成用于輔助線程的分開代碼。
此外,根據(jù)一個實施例,編譯器以編譯器選擇的代碼區(qū)域(被標注為預先計算區(qū)域)的間隔尺寸執(zhí)行多入口線程。該區(qū)域包含一組拖欠負荷并定義用于猜測預先計算的范圍。在一個實施例中,實現(xiàn)通常以循環(huán)區(qū)域為目標,因為循環(huán)通常是程序執(zhí)行中的熱點,且拖欠負荷通常是循環(huán)中多次執(zhí)行的負荷。
圖8是示出根據(jù)一個實施例的用于并行分析的示例性進程的流程圖。示例性進程800可由處理邏輯執(zhí)行,該處理邏輯可包括硬件(電路、專用邏輯等)、軟件(諸如通用計算機系統(tǒng)或?qū)S脵C器上運行的)或者它們的組合。參考圖8,在框801處,處理邏輯構(gòu)建依賴性圖表,它獲取主線程的數(shù)據(jù)和控制依賴性。根據(jù)一個實施例,為了濾出不相關(guān)的代碼從而減少輔助線程的代碼的大小,編譯器首先構(gòu)建獲取數(shù)據(jù)和控制依賴性的的圖表。過濾的有效性和合法性依賴于編譯器精確地消除存儲器引用歧義的能力。結(jié)果,編譯器中的存儲器消除歧義模塊被調(diào)用以便對動態(tài)分配對象的指針消除歧義。因為指針可以是全局變量或函數(shù)參數(shù),所以如果編譯器按全程序模式進行編譯,編譯器執(zhí)行的指向分析是進程間的。在一個實施例中,如果所有陣列訪問是有限表達,為了更精確地構(gòu)建依賴性圖表,可執(zhí)行一系列陣列依賴性測試,以使在構(gòu)建依賴性圖表時對陣列中的每個元素消除歧義。否則,使用近似方法。此外,可以對結(jié)構(gòu)中的每個域消除歧義。
再參考圖8,在框802處,處理邏輯利用依賴性圖表對主線程執(zhí)行分片操作。在分片期間,根據(jù)一個實施例,編譯器首先將拖欠負荷的負荷地址標識為分片標準,它規(guī)定中間分片結(jié)果。在構(gòu)建了依賴性圖表后,編譯器計算所標識的分片標準的程序片。分片標準的程序片被定義為一組指令,它們有助于用于一個或多個輔助線程執(zhí)行的存儲器預取的地址的計算。分片可將代碼減少到僅與地址計算相關(guān)的指令,從而允許輔助線程更快地運行并在主線程前面。編譯器只需要將片中的指令復制到輔助線程的代碼。
根據(jù)一個實施例,通過向后過渡地遍歷依賴性邊緣,編譯器中的分片提取指令的最小序列以產(chǎn)生拖欠負荷的地址??梢詫⒔Y(jié)果分片的依賴性圖表上的葉節(jié)點轉(zhuǎn)換成預取指令,因為沒有進一步的指令依賴于這些葉節(jié)點。由諸如Intel Corporation的PentiumTM4的處理器執(zhí)行的那些預取指令都是無阻斷和無故障的。為了將數(shù)據(jù)帶到存儲器分級體系中不同等級的高速緩存存在不同的預取指令。
根據(jù)一個實施例,可相對于給定的代碼區(qū)域執(zhí)行分片操作。當達到該區(qū)域外的代碼時,給定區(qū)域中的依賴性圖表上的遍歷必須終止。因此,必須在遍歷期間而非遍歷之后終止分片,因為圖表遍歷可跨到區(qū)域之外且隨后回到區(qū)域之內(nèi)。在遍歷后根據(jù)區(qū)域簡單地收集分片會損失精度。
在進一步的實施例中,編譯器將每個拖欠負荷指令逐個分片。為了最小化輔助線程中的代碼復制并減少線程調(diào)用和同步的開銷,如果多個片在同一預先計算區(qū)域中,則編譯器將它們合并成一個輔助線程。
參考圖8,在框803處,處理邏輯執(zhí)行各線程間的調(diào)度以重疊多個預取。在一個實施例中,由于超線程處理器支持具有大調(diào)度窗口的無序執(zhí)行,在當前執(zhí)行指令等待未決的高速緩存預取失敗時,處理器可搜索當前執(zhí)行指令以外的獨立指令。無序執(zhí)行的這個方面可以提供在有序處理器上的實質(zhì)性性能增益并減少鏈化猜測預先計算的需要。此外,編譯器選擇用于超線程處理器的基本猜測預先計算。即,一次僅調(diào)度一個輔助線程,以節(jié)省線程產(chǎn)生和通信開銷。使用基本猜測預先計算的另一好處在于它不像鏈化猜測預先計算那樣快速地充滿超線程處理器上的存儲器系統(tǒng)。當無序處理器搜索用于執(zhí)行的獨立指令時,這些指令會生成太多負荷請求并使存儲器系統(tǒng)飽和。當輔助線程發(fā)出預取請求時,大量的未完成的預取失敗會快速地填滿預取失敗緩沖器,結(jié)果使處理器停止。因此,編譯器在產(chǎn)生輔助線程方面需要是有判斷力的。最后,為了確保及時進行預取,編譯器迫使單個輔助線程和主線程在各自的邏輯處理器上。
參考圖8,在框804處,處理邏輯為線程選擇通信方案。在一個實施例中,編譯器提供一個為任何給定的片或者任何程序子集計算活躍性(liveness)信息的模塊?;钴S性信息提供了對通信成本的估計。該信息用于選擇提供通信和計算之間的良好權(quán)衡的預先計算區(qū)域。該活躍性信息可幫助找到觸發(fā)器或向后分片結(jié)束的點。
因為典型的超線程處理器在每個處理器周期發(fā)出三個微操作碼并使用相同的硬分區(qū)資源,該編譯器必須是有判斷力的以便不使輔助線程減慢主線程的執(zhí)行,特別是如果主線程已為每個周期的執(zhí)行發(fā)出三個微操作碼。對于包含拖欠負荷的循環(huán)嵌套,在選擇用于進行猜測預先計算的循環(huán)級時,編譯器作出在再計算和通信之間的權(quán)衡。對于每個循環(huán)級,根據(jù)一個實施例,從最里面的一個開始,編譯器選擇基于通信的方案和基于計算的方案之一。
根據(jù)一個實施例,基于通信的方案在每次迭代時將內(nèi)駐(live-in)值從主線程傳送給輔助線程,使得輔助線程不需要再計算該內(nèi)駐值。如果存在包含大多數(shù)拖欠負荷的內(nèi)循環(huán)且如果用于該內(nèi)循環(huán)的分片明顯地減少了輔助線程的大小,則編譯器將選擇該方案。但是,如果用于內(nèi)循環(huán)級的通信成本很大,則禁用該方案。如果較早計算出該內(nèi)駐值且內(nèi)駐值的數(shù)量較小,則編譯器將給出通信成本的較小估計。
基于通信的方案將在運行時間創(chuàng)建主線程及其輔助線程之間的多個通信點?;谕ㄐ诺姆桨笇τ诔€程處理器很重要,因為通過再計算輔助線程中的片而僅依賴一個通信點會形成線程之間太多的資源爭用。該方案與構(gòu)建穿越(do-across)循環(huán)的類似之處在于在完成了用于該迭代的內(nèi)駐值的計算后主線程啟動下一個迭代。該方案用通信換取較少的計算。
根據(jù)一個實施例,基于計算的方案假定起初兩個線程之間的僅一個通信點傳遞入該內(nèi)駐值。然后,輔助線程需要計算它需要的所有東西以生成精確的預取地址。如果沒有內(nèi)循環(huán),或者如果用于該循環(huán)級的分片不明顯增加輔助線程的大小,該編譯器將選擇該方案。一旦達到了單個通信點,基于計算的方案向輔助線程提供執(zhí)行中的更多獨立性。
根據(jù)一個實施例,為了選擇用于猜測預先計算的循環(huán)級,編譯器選擇受益于基于通信的方案的最外面的循環(huán)。因此,一旦發(fā)現(xiàn)具有基于通信的方案的循環(huán),上述方案選擇算法可以終止。如果編譯器沒有找到任何具有基于通信的方案的循環(huán),則最外面的循環(huán)將是用于猜測預先計算的目標區(qū)域。在編譯器選擇了預先計算區(qū)域和它們的通信方案后,在主線程內(nèi)定位良好的觸發(fā)點將確保及時地進行預取,同時最小化主線程和輔助線程之間的通信?;钴S性信息幫助定位觸發(fā)器,這是其中觸發(fā)器是向后分片結(jié)束的點。當內(nèi)駐數(shù)量增加時,預先計算區(qū)域以外的分片結(jié)束。
參考圖8,在框805處,處理邏輯確定用于線程的同步周期以便在執(zhí)行期間相互同步。根據(jù)一個實施例,同步周期用于表達輔助線程和主線程之間的距離。通常,輔助線程在同步周期的單元中執(zhí)行所有其預先計算。這使得通信最小化并且阻止了產(chǎn)生失控輔助器的可能性。因為編譯器計算同步周期值并相應(yīng)地生成同步代碼,不再需要諸如Outstanding Slice Counter的特殊硬件支持。
如果同步周期太大,輔助線程引起的預取不僅會臨時移動主線程要使用的重要數(shù)據(jù)還會潛在地移動未由主線程使用的較早的預取數(shù)據(jù)。另一方面,如果同步周期太小,預取可能太晚以至于不太有用。為了確定同步周期值,根據(jù)一個實施例,編譯器首先計算分片長度和主線程中的程序調(diào)度的長度之間的差。如果該差較小,則一個迭代中輔助線程引起的超前距離較小。輔助線程會需要多個迭代來維持足夠的超前距離。因此,如果該差較小,則編譯器增加同步周期,反之亦然。
此后,在代碼生成階段期間,編譯器生成用于主線程和輔助線程的代碼。在該代碼生成階段期間,編譯器構(gòu)建線程圖表,作為分析階段和代碼生成階段之間的分界。每個圖表節(jié)點都標注一指令序列,或者代碼區(qū)域。節(jié)點之間的調(diào)用邊緣標注線程產(chǎn)生關(guān)系,這對于指定鏈化輔助線程是很重要的。具有線程圖表使能代碼能再使用,因為根據(jù)一個實施例編譯器還允許用戶將編譯指示插入源程序以指定用于輔助線程和內(nèi)駐值的代碼?;诰幾g指示的方法和自動方法兩者共享同一圖表抽象。結(jié)果,可以共享輔助線程代碼生成模塊。
輔助線程代碼生成充分利用編譯器中的多入口線程技術(shù)以生成輔助線程代碼。與常規(guī)的公知概要相反,編譯器不創(chuàng)建用于輔助線程的分開的編譯單元(或例程)。相反,編譯器生成在輔助線程代碼中的線程入口和線程返回。編譯器保持所有新生成的輔助線程代碼完整或者在同一用戶定義的例程中成行而不將它們分成獨立的子程序。該方法稍后提供編譯器優(yōu)化,其中有更多的機會用于對新生成的輔助線程進行最優(yōu)化。輔助線程中指令更少意味著超線程處理器的資源爭用更少。這顯示用輔助線程隱匿等待時間與常規(guī)對稱多線程模型相比引起更少的指令和更少的資源爭用,這是特別重要的因為超線程處理器在每個處理器周期中發(fā)出三個微操作碼并具有一些硬分區(qū)資源。
根據(jù)一個實施例,用于輔助線程的所生成的代碼將通過編譯器中的稍后階段被重新排序和優(yōu)化,諸如部分死存儲消除(PDSE),部分冗余消除(PRE)和其它標量優(yōu)化等。在這種情況下,需要優(yōu)化輔助線程代碼以最小化由于輔助線程引起的資源爭用。但是,這些進一步的優(yōu)化也會去除預取代碼。因此,可以將葉拖欠負荷轉(zhuǎn)換成編譯器中的易變量賦值語句。分片的依賴性圖表中的葉節(jié)點暗示輔助線程中沒有進一步的指令依賴于加載的值。因此,易變量賦值語句的目的地變成在表示中臨時的寄存器以加速所獲得的代碼。使用易變量賦值可防止所有稍后的編譯器全局優(yōu)化去除用于拖欠負荷的所生成的預取。
根據(jù)一個實施例,編譯器目的在于利用自計數(shù)機制確保輔助線程既不運行太超前也不落后主線程。根據(jù)一個實施例,為超前距離控制預設(shè)值X。該X可以由用戶通過編譯器切換或者基于分片(或輔助器代碼)的長度和主代碼的長度的程序分析進行修改。在一個實施例中,編譯器使用用于主線程的初始值X生成mc(M計數(shù)器)并用用于輔助線程的初始值0生成hc(H計數(shù)器),并且該編譯器生成計數(shù)器M和H以便計數(shù)主和輔助器代碼中的同步周期。概念在于所有四個計數(shù)器(mc、M、hc、H)都執(zhí)行自計數(shù)。輔助線程沒有對主線程的推理。如果輔助線程太超前于主線程運行,它將發(fā)出一等待,如果輔助線程落后于主線程運行,則它將執(zhí)行一趕上操作。
在特殊實施例中,對于所有的X個循環(huán)迭代,主線程發(fā)出一記入(post),以確保該輔助器不等待并可以前進以執(zhí)行無故障負荷(non_faulting_loads)。此時,如果輔助線程在同步周期塊中發(fā)出許多無故障負荷后等待主線程,它將喚醒以執(zhí)行無故障負荷。在另一特殊實施例中,對于所有X個循環(huán)迭代,輔助線程檢查其hc計數(shù)器是否大于主線程的mc計數(shù)器且hc計數(shù)器是否大于輔助線程的同步周期H*X,如果是,則輔助器將發(fā)出一等待并進入休眠狀態(tài)。這防止了輔助線程太超前于主線程運行。在另一實施例中,在另一同步周期塊上進行迭代之前,輔助線程檢查其hc計數(shù)器是否小于主線程的mc計數(shù)器。如果是,則輔助線程已落后,且必須通過更新其計數(shù)器hc和H以及來自主線程的所有捕獲專用和內(nèi)駐變量來“趕上并向前跳”。圖9A-9C是示出根據(jù)一個實施例的應(yīng)用程序、主線程和輔助線程的示例性偽代碼的示圖。參考圖9A-圖9C,編譯器編譯應(yīng)用程序的源代碼901并使用前述技術(shù)中的至少一種生成用于主線程902和輔助線程903的代碼。可以理解,代碼901-903不限于C/C++。可以使用其它編程語言,諸如Fortran或匯編。
在創(chuàng)建了用于輔助線程的代碼后,編譯器可進一步靜態(tài)或動態(tài)地分配用于每個輔助線程和主線程的資源,以確保主線程和輔助線程之間以及輔助線程之間沒有資源沖突。可以為編譯器內(nèi)的輔助線程管理諸如寄存器環(huán)境的硬件資源。特別是,可以在主線程和輔助線程之間以及多個輔助線程之間靜態(tài)或動態(tài)地劃分寄存器組。結(jié)果,當編譯器用盡資源時,或者當出現(xiàn)特定主線程事件的稀少情況的運行時間處,可以避免經(jīng)由用于線程的存儲器的內(nèi)駐/外駐寄存器拷貝且可以在編譯時間破壞那些線程。
根據(jù)一個實施例,編譯器可以按從下到上的順序“走過”輔助線程并通信數(shù)據(jù)結(jié)構(gòu)中的資源使用,諸如圖12所示的資源表??梢允侵骶€程的父輔助線程使用該信息并確保其資源不與線程資源重疊。當線程資源使主執(zhí)行線程不利時,例如通過迫使主線程溢出/填充寄存器,編譯器可取消先前創(chuàng)建的線程。
圖10是說明根據(jù)一個實施例的線程的示例性配置的框圖。在該實施例中,示例性配置1000包括主線程1001(例如,父線程)和可從主線程1001產(chǎn)生的三個輔助線程(例如,子線程)1002-1004,并且線程1003可從線程1002產(chǎn)生(例如,輔助線程1002是輔助線程1003的父線程)。可以理解,輔助線程不限于三個輔助線程,可以包括更多或更少的輔助線程。輔助線程可以通過產(chǎn)生指令生成并且線程執(zhí)行可以在產(chǎn)生(spawn)指令之后繼續(xù)。
在線程形成階段期間由編譯器創(chuàng)建線程,諸如圖5-8所示的那些操作。根據(jù)一個實施例,編譯器在線程創(chuàng)建階段中創(chuàng)建線程,并在后續(xù)的線程資源分配階段中分配用于那些線程的資源。動態(tài)地且通常地,當其父線程停止時產(chǎn)生輔助線程。示例性配置1000可在頁面故障或3級(L3)高速緩存預取失敗期間出現(xiàn)。
線程僅可以與父線程共享輸入寄存器(或者一般資源)是關(guān)鍵的。例如,參考圖10當主線程1001需要一寄存器時,它在產(chǎn)生輔助線程1002前將一值寫入寄存器R10并在輔助線程1002終止后使用寄存器R10。輔助線程1002和任何其子線程(本例中,輔助線程1003是輔助線程1002的唯一子線程,且輔助線程1002和1004是主線程1001的子線程)不能對寄存器R10進行寫入。否則,它們將破壞主線程1001中的值。這將導致不準確的程序執(zhí)行。為了避免這種資源沖突,根據(jù)一個實施例,編譯器可以靜態(tài)或動態(tài)地劃分資源。
根據(jù)一個實施例,編譯器按從下到上的順序分配用于輔助線程和主線程的資源。圖11是示出根據(jù)一個實施例的用于分配線程資源的示例性偽代碼的框圖。即,在示例性算法1100中,編譯器按從下到上的順序分配用于輔助線程的所有資源(框1101),此后基于輔助線程所使用的資源來分配用于主線程的資源(框1102),以避免資源沖突。
出于說明目的,線程使用的資源被假定為硬件寄存器。但是,類似的概念可應(yīng)用于本領(lǐng)域普通技術(shù)人員顯而易見的其它資源,諸如存儲器或中斷。參考圖10,通過從線程鏈的領(lǐng)先線程從下向上行進,編譯器動態(tài)地劃分寄存器。在該示例中,輔助線程1003是包括輔助線程1002的第一線程鏈中的葉線程。輔助線程1004是第二線程鏈中的葉線程。編譯器將每個輔助線程中的寄存器分配記錄于數(shù)據(jù)結(jié)構(gòu)中,諸如類似于圖12的示例性資源表1200的資源表。隨后,父線程讀取其子線程的資源分配并進行其分配,在其資源表中進行報告。
圖12是示出根據(jù)一個實施例的示例性資源數(shù)據(jù)結(jié)構(gòu)的框圖。示例性數(shù)據(jù)結(jié)構(gòu)1200可以實現(xiàn)成存儲器中存儲的并可由編譯器訪問的表?;蛘?,示例性數(shù)據(jù)結(jié)構(gòu)1200可以在數(shù)據(jù)庫中實現(xiàn)。在一個實施例中,示例性數(shù)據(jù)結(jié)構(gòu)1200包括但不限于由線程ID1201所標識的各線程使用的寫入資源1202和內(nèi)駐資源。也存在其它配置。
參考圖10和12,根據(jù)一個實施例,一開始,分配輔助線程1003(例如,在從下到上方案中具有最下順序的線程)的寄存器。內(nèi)駐值是V5和V6,并假定它們分別被分配給了寄存器R2和R3。此外,V7得到分配的寄存器R4,且V9得到分配的寄存器R5。用于輔助線程1003的資源表包括內(nèi)駐=((V5,R2),(V6,R3))且寫入的寄存器=(R4,R5),如圖12所示。在輔助線程1002中,編譯器在分配期間用R2替換V5并用R3替換V6并在產(chǎn)生指令中將寄存器R4和R5(在輔助線程1003中被寫入)標記為是活躍的。這防止越過輔助線程1003的產(chǎn)生點的R4或R5的寄存器使用,從而防止了輔助線程1002和輔助線程1003之間的資源沖突。對于輔助線程1002,內(nèi)駐值是V3和V4并分別被分配給寄存器R6和R7。當V8和V20被分別分配給寄存器R8和R9時,用于輔助線程1002的資源表包括內(nèi)駐=((V3,R6),(V4,R7))以及寫入的寄存器=(R2,R3,R4,R5,R8.R9),如圖12所示。寫入的寄存器是用于輔助線程1003的內(nèi)駐寄存器(例如,R2和R3)、輔助線程1003中的寫入寄存器(例如R4和R5)以及輔助線程1002中的寫入寄存器(例如R8和R9)。隨后,編譯器為輔助線程1004分配寄存器。當為所有的輔助線程分配了寄存器時,它分配為主線程1001分配寄存器。
此外,根據(jù)一個實施例,當編譯器用盡寄存器時,它可以刪除鏈內(nèi)的一個或多個輔助線程。這例如可以出現(xiàn)于主線程用盡寄存器時,因為輔助線程鏈太深或者單個輔助線程需要太多寄存器且主線程必須溢出/填充寄存器。編譯器可應(yīng)用啟發(fā)式以允許特定數(shù)量的溢出或者刪除整個輔助線程鏈或該線程鏈中的一些線程。刪除輔助線程的可選方案是明確地配置環(huán)境保存/恢復的權(quán)重,以使在環(huán)境切換時,通過輔助線程的執(zhí)行被寫入的父線程的活躍寄存器可以由硬件自動保存。盡管該環(huán)境切換相對昂貴,但這種情況是稀少的。此外,這種微粒環(huán)境切換與多數(shù)OS使能線程切換中所使用的全環(huán)境切換或者常規(guī)的基于硬件的全環(huán)境線程切換相比仍開銷少得多。
此外,當存在對內(nèi)駐寄存器的沖突時,例如如果輔助線程1003重寫一內(nèi)駐寄存器(例如,mov v5=…)且在產(chǎn)生輔助器進程1003后該寄存器還在輔助器進程1002中使用,將存在對分配給v5的寄存器(本例中,寄存器R2)的資源沖突。為了處理該信息,編譯器將使用可用性分析并插入補償碼,諸如在產(chǎn)生輔助線程1003前插入一mov v5’=v5指令,并在該產(chǎn)生后用v5’替換v5。
圖13是示出根據(jù)一個實施例的用于分配線程資源的示例性進程的流程圖。示例性進程1300可以由處理邏輯執(zhí)行,該處理邏輯可包括硬件(電路、專用邏輯等)、軟件(諸如通用計算機系統(tǒng)或?qū)S脵C器上運行的)或者它們的組合。在一個實施例中,示例性進程1300包括在編譯具有數(shù)據(jù)處理系統(tǒng)中可執(zhí)行的一個或多個線程的代碼期間選擇具有最底順序的當前線程,確定向從該當前線程產(chǎn)生的一個或多個子線程分配的資源,并且考慮到分配給當前線程的一個或多個子線程的資源來分配用于該當前線程的資源,以避免當前線程及其一個或多個子線程之間的資源沖突。
參考圖13,在框1301處,處理邏輯標識一個或多個線程,包括主線程及其輔助線程,并選擇具有最底順序的線程作為當前線程。可以利用在編譯的線程創(chuàng)建階段期間創(chuàng)建的線程依賴性圖表來標識這些線程。在框1302處,處理邏輯檢索可從當前線程中產(chǎn)生的任何子線程的資源信息。這些資源信息從與子線程相對應(yīng)的數(shù)據(jù)結(jié)構(gòu)中獲得,諸如圖12的資源表1200。框1303處,如果沒有更多的可用資源,處理邏輯可以從鏈中刪除一個或多個線程并再一次重啟(框1309)。如果有更多的可用資源,框1304處,處理邏輯考慮到其子線程所使用的資源來分配用于當前線程的資源,不引起資源沖突。此后,在框1305處,處理邏輯在諸如資源表1200的相關(guān)資源表中更新分配給當前線程的資源。以上進程繼續(xù),直到不剩余更多的輔助線程(例如,主線程的子線程)(框1306和1308)。最后,在框1307處,處理邏輯基于所有輔助線程的資源信息分配用于主線程的資源(例如,所有輔助線程的父線程),而不引起資源沖突。可以包括其它操作。
已基于類似于以下配置的系統(tǒng)針對各種基準工具測試了上述技術(shù)
各種基準工具包括以下至少一種
圖14A是示出由nbody_walker基準實用程序上輔助線程的性能改善的示圖。圖14B是示出在同步周期的給定值下nbody_walker的加速結(jié)果的示圖。圖14C是示出相對于各種基準的自動進程對手動進程的示圖。圖14D是示出在給定的同步周期下使用nbody_walker自動進程優(yōu)于手動進程的改善的示圖。
因此,已描述了用于多線程的線程管理的方法和裝置。在以上說明書中,已參考其特定的示例性實施例描述了本發(fā)明。顯然,可以對其進行各種修改而不背離本發(fā)明的較寬精神和范圍,如以下權(quán)利要求書中所闡述的。因此,說明書和附圖被認為是說明性而非限制性的。
權(quán)利要求
1.一種方法,包括標識可能具有一個或多個拖欠負荷的主線程的一個區(qū)域,所述一個或多個拖欠負荷表示在主線程執(zhí)行期間可能經(jīng)受高速緩存預取失敗的負荷;分析相對于所述主線程的一個或多個輔助線程的區(qū)域;以及生成用于所述一個或多個輔助線程的代碼,所述一個或多個輔助線程與所述主線程猜測地并行執(zhí)行以執(zhí)行所述主線程的所述區(qū)域的一個或多個任務(wù)。
2.如權(quán)利要求1所述的方法,其特征在于,標識所述區(qū)域包括生成用于所述區(qū)域的高速緩存預取失敗的一個或多個剖析;以及分析所述一個或多個剖析以標識用于基于線程的預取操作的一個或多個候選。
3.如權(quán)利要求2所述的方法,其特征在于,生成一個或多個剖析包括用調(diào)試信息執(zhí)行與所述主線程相關(guān)聯(lián)的應(yīng)用程序;以及采樣高速緩存預取失敗并累計用于所述區(qū)域的每個靜態(tài)負荷的硬件計數(shù)器以生成用于每個高速緩存分級體系的一個或多個剖析。
4.如權(quán)利要求2所述的方法,其特征在于,分析所述一個或多個剖析包括基于所述調(diào)試信息使所述一個或多個剖析與各源代碼相關(guān)聯(lián);以及標識造成高速緩存預取失敗高于預定水平的最大負荷作為拖欠負荷。
5.如權(quán)利要求1所述的方法,其特征在于,分析所述區(qū)域包括構(gòu)建依賴性圖表,它捕獲所述主線程的數(shù)據(jù)和控制依賴性;以及基于所述依賴性圖表對所述主線程進行分片操作以生成輔助線程。
6.如權(quán)利要求5所述的方法,其特征在于,分析所述區(qū)域還包括執(zhí)行所述主線程和所述輔助線程之間的調(diào)度;以及確定所述主線程和所述輔助線程之間的通信方案。
7.如權(quán)利要求6所述的方法,其特征在于,分析所述區(qū)域還包括確定用于所述輔助線程的同步周期以同步所述主線程和輔助線程,輔助線程中的每一個都在所述同步周期內(nèi)執(zhí)行其任務(wù)。
8.一種具有可執(zhí)行代碼的機器可讀媒介,所述可執(zhí)行代碼使得機器執(zhí)行一方法,該方法包括標識可能具有一個或多個拖欠負荷的主線程的一個區(qū)域,所述一個或多個拖欠負荷表示在主線程執(zhí)行期間可能經(jīng)受高速緩存預取失敗的負荷;分析相對于所述主線程的一個或多個輔助線程的區(qū)域;以及生成用于所述一個或多個輔助線程的代碼,所述一個或多個輔助線程與所述主線程猜測地并行執(zhí)行以執(zhí)行對所述主線程的所述區(qū)域的一個或多個任務(wù)。
9.如權(quán)利要求8所述的機器可讀媒介,其特征在于,標識所述區(qū)域包括生成用于所述區(qū)域的高速緩存預取失敗的一個或多個剖析;以及分析所述一個或多個剖析以標識用于基于線程的預取操作的一個或多個候選。
10.如權(quán)利要求9所述的機器可讀媒介,其特征在于,生成一個或多個剖析包括用調(diào)試信息執(zhí)行與所述主線程相關(guān)聯(lián)的應(yīng)用程序;以及采樣高速緩存預取失敗并累計用于所述區(qū)域的每個靜態(tài)負荷的硬件計數(shù)器以生成用于每個高速緩存分級體系的一個或多個剖析。
11.如權(quán)利要求9所述的機器可讀媒介,其特征在于,分析所述一個或多個剖析包括基于所述調(diào)試信息使所述一個或多個剖析與對應(yīng)源代碼相關(guān);以及標識造成高速緩存預取失敗高于預定水平的最大負荷作為拖欠負荷。
12.如權(quán)利要求8所述的機器可讀媒介,其特征在于,分析所述區(qū)域包括構(gòu)建依賴性圖表,它捕獲所述主線程的數(shù)據(jù)和控制依賴性;以及基于所述依賴性圖表對所述主線程進行分片操作以生成輔助線程。
13.如權(quán)利要求12所述的機器可讀媒介,其特征在于,分析所述區(qū)域還包括執(zhí)行所述主線程和所述輔助線程之間的調(diào)度;以及確定所述主線程和所述輔助線程之間的通信方案。
14.如權(quán)利要求13所述的機器可讀媒介,其特征在于,分析所述區(qū)域還包括確定用于所述輔助線程的同步周期以同步所述主線程和輔助線程,輔助線程中的每一個都在所述同步周期內(nèi)執(zhí)行其各自的任務(wù)。
15.一種數(shù)據(jù)處理系統(tǒng),包括處理器,它能執(zhí)行多線程操作;存儲器,它與所述處理器耦合;以及來自所述存儲器的由所述處理器執(zhí)行的進程,使得所述處理器標識可能具有一個或多個拖欠負荷的主線程的一個區(qū)域,所述一個或多個拖欠負荷表示在主線程執(zhí)行期間可能經(jīng)受高速緩存預取失敗的負荷;分析相對于所述主線程的一個或多個輔助線程的區(qū)域;以及生成用于所述一個或多個輔助線程的代碼,所述一個或多個輔助線程與所述主線程猜測地并行執(zhí)行以執(zhí)行對所述主線程的所述區(qū)域的一個或多個任務(wù)。
16.如權(quán)利要求15所述的數(shù)據(jù)處理系統(tǒng),其特征在于,所述進程由編譯器在應(yīng)用程序的編譯期間執(zhí)行。
17.一種方法,包括執(zhí)行多線程系統(tǒng)中的應(yīng)用程序的主線程;以及當主線程進入具有一個或多個拖欠負荷的區(qū)域時,從所述主線程中產(chǎn)生一個或多個輔助線程以執(zhí)行用于所述主線程的一項或多項計算,在主線程的編譯期間創(chuàng)建一個或多個輔助線程的代碼。
18.如權(quán)利要求17所述的方法,其特征在于,還包括創(chuàng)建線程池以維護線程上下文的列表;以及分配來自所述線程池的一個或多個線程上下文以生成所述一個或多個輔助線程。
19.如權(quán)利要求18所述的方法,其特征在于,還包括當所述主線程退出所述區(qū)域時終止所述一個或多個輔助線程;以及將與所述一個或多個輔助線程相關(guān)聯(lián)的線程上下文釋放回所述線程池。
20.如權(quán)利要求17所述的方法,其特征在于,還包括確定用于每個輔助線程的時間周期,當各時間周期期滿時終止每個輔助線程。
21.如權(quán)利要求20所述的方法,其特征在于,即使各輔助線程未由所述主線程訪問,當所述時間周期期滿時輔助線程中的每一個都終止。
22.如權(quán)利要求17所述的方法,其特征在于,還包括當主線程退出所述區(qū)域時放棄由所述一個或多個輔助線程生成的結(jié)果,所述結(jié)果不由所述主線程的另一區(qū)域再使用。
23.一種具有可執(zhí)行代碼的機器可讀媒介,所述可執(zhí)行代碼使得機器執(zhí)行一方法,該方法包括執(zhí)行多線程系統(tǒng)中的應(yīng)用程序的主線程;以及當主線程進入具有一個或多個拖欠負荷的區(qū)域時,從所述主線程中產(chǎn)生一個或多個輔助線程以執(zhí)行用于所述主線程的一項或多項計算,在主線程的編譯期間創(chuàng)建一個或多個輔助線程的代碼。
24.如權(quán)利要求23所述的機器可讀媒介,其特征在于,還包括創(chuàng)建線程池以維護線程上下文的列表;以及分配來自所述線程池的一個或多個線程上下文以生成所述一個或多個輔助線程。
25.如權(quán)利要求24所述的機器可讀媒介,其特征在于,所述方法還包括當所述主線程退出所述區(qū)域時終止所述一個或多個輔助線程;以及將與所述一個或多個輔助線程相關(guān)聯(lián)的線程上下文釋放回所述線程池。
26.如權(quán)利要求23所述的機器可讀媒介,其特征在于,所述方法還包括確定用于每個輔助線程的時間周期,當各時間周期期滿時終止每個輔助線程。
27.如權(quán)利要求26所述的機器可讀媒介,其特征在于,即使各輔助線程未由所述主線程訪問,當所述時間周期期滿時輔助線程中的每一個都終止。
28.如權(quán)利要求23所述的機器可讀媒介,其特征在于,所述方法還包括當主線程退出所述區(qū)域時放棄由所述一個或多個輔助線程所生成的結(jié)果,所述結(jié)果不由所述主線程的另一區(qū)域再使用。
29.一種數(shù)據(jù)處理系統(tǒng),包括處理器,它能執(zhí)行多線程操作;存儲器,它與所述處理器耦合;以及來自所述存儲器的由所述處理器執(zhí)行的進程,以使所述處理器執(zhí)行多線程系統(tǒng)中的應(yīng)用程序的主線程;以及當主線程進入具有一個或多個拖欠負荷的區(qū)域時,從所述主線程中產(chǎn)生一個或多個輔助線程以執(zhí)行用于所述主線程的一項或多項計算,在主線程的編譯期間創(chuàng)建一個或多個輔助線程的代碼。
30.如權(quán)利要求29所述的數(shù)據(jù)處理系統(tǒng),其特征在于,所述一個或多個輔助線程的代碼在應(yīng)用程序編譯期間由編譯器生成。
全文摘要
這里描述了用于多線程的編譯器創(chuàng)建的輔助線程的方法和裝置。在一個實施例中,示例性進程包括標識主線程的可能具有一個或多個拖欠負荷的一個區(qū)域,這一個或多個拖欠負荷標識在主線程執(zhí)行期間可能經(jīng)受高速緩存預取失敗的負荷,分析相對于所述主線程的一個或多個輔助線程的區(qū)域,以及生成用于所述一個或多個輔助線程的代碼,所述一個或多個輔助線程與所述主線程猜測地并行執(zhí)行以執(zhí)行所述主線程的所述區(qū)域的一個或多個任務(wù)。也描述了其它方法和裝置。
文檔編號G06F9/38GK1853165SQ200480027172
公開日2006年10月25日 申請日期2004年9月30日 優(yōu)先權(quán)日2003年9月30日
發(fā)明者廖世偉, 田新民, G·F·霍夫雷納, 王宏, D·M·拉弗瑞, P·王, D·金, M·吉爾卡爾, J·P·申 申請人:英特爾公司