專利名稱::用于處理使用上下文切換的多線程架構(gòu)中的指令的裝置和方法
技術(shù)領(lǐng)域:
:本發(fā)明主要涉及數(shù)字電路。更具體地,本發(fā)明涉及改進(jìn)的處理器設(shè)計。
背景技術(shù):
:處理器需要過程相關(guān)的或者完全獨立的多個任務(wù)。這種處理器的內(nèi)部狀態(tài)通常由寄存器集成,所述寄存器在程序執(zhí)行的每個特定的時刻處可以具有不同的值。在程序執(zhí)行的每個時刻處,將內(nèi)部狀態(tài)的圖像稱為處理器的架構(gòu)狀態(tài)。當(dāng)切換代碼執(zhí)行來運行另一個子例程(fUnction)(例如,另一個線程、過程或者程序)時,則必需保存機(jī)械/處理器的狀態(tài),以便新的子例程可以使用內(nèi)部寄存器來建立其新的狀態(tài)。一旦新的子例程終止,則可以放棄其狀態(tài),并且恢復(fù)到之前上下文的狀態(tài)并繼續(xù)執(zhí)行。將這種切換過程稱為上下文切換,并且該過程通常包括特別是具有現(xiàn)代架構(gòu)的幾十個或者幾百個周期,所述現(xiàn)代架構(gòu)采用大量的寄存器(例如,64,128,256)和/或亂序執(zhí)行。在線程感知(thread-aware)硬件架構(gòu)中,硬件一般支持有限數(shù)量的硬件支持的線程的多個上下文狀態(tài)。在這樣的情況下,硬件復(fù)制每個支持的線程的所有架構(gòu)狀態(tài)要件。當(dāng)執(zhí)行新的線程時,這不需要上下文切換。然而,這還是有多個弊端,即復(fù)制在硬件中支持的每個額外的線程的所有架構(gòu)狀態(tài)要件(即,寄存器)的區(qū)域、能量、以及復(fù)雜度。此外,如果軟件線程的數(shù)量超過明確支持的硬件線程的數(shù)量,則必須還是要進(jìn)行上下文切換。這是因為基于精細(xì)度的并行往往需要大量的線程。對上下文狀態(tài)的硬件存儲進(jìn)行復(fù)制的硬件線程感知架構(gòu)無助于非線程的軟件代碼,并且只能為線程化的軟件減少上下文切換的次數(shù)。然,這些線程通常構(gòu)建為粗粒度并行,并且導(dǎo)致初始和同步離開諸如子例程調(diào)用和循環(huán)并行執(zhí)行之類的細(xì)粒度并行的沉重的軟件開銷,而無法進(jìn)行高效的線程初始/自動生成。如此描述的開銷使得使用現(xiàn)有技術(shù)的編譯器來自動并行化這種代碼困難,或者針對不明確的/易并行化的/線程的軟件代碼的用戶并行化技術(shù)困難。
發(fā)明內(nèi)容用于復(fù)雜指令格式的動態(tài)生成、執(zhí)行、同步以及并行的統(tǒng)一架構(gòu)包括虛擬寄存器文件、寄存器緩存(registercache)以及寄存器文件層級。自生成和同步動態(tài)和靜態(tài)線程的架構(gòu)提供了高效的上下文切換。結(jié)合附圖通過下面的詳細(xì)描述,可以更加全面地理解本發(fā)明,在附圖中圖l示出了使用到寄存器文件的直連的寄存器狀態(tài)的即時保存和恢復(fù);圖2示出了根據(jù)本發(fā)明實施例的具有寄存器位置映射的虛擬寄存器文件;圖3示出了根據(jù)本發(fā)明實施例的具有用于推測的寄存器狀態(tài)的臨時存儲裝置的多個層級的寄存器文件;圖4示出了根據(jù)本發(fā)明實施例的用于對軟件的上下文/線程進(jìn)行虛擬化的寄存器緩存;圖5示出了根據(jù)本發(fā)明實施例的具有在上下文切換時溢出和重載寄存器的自動機(jī)制的寄存器緩存;圖6示出了根據(jù)本發(fā)明實施例的使用計數(shù)器模式的寄存器名稱的錯誤相關(guān)性的方案;圖7示出了已知的超標(biāo)量執(zhí)行架構(gòu);圖8A示出了根據(jù)本發(fā)明實施例使用的執(zhí)行架構(gòu);圖8B示出了根據(jù)本發(fā)明實施例的緩存、調(diào)度器以及存儲繼承信息的重排序單元;圖9A示出了根據(jù)本發(fā)明實施例的用以在跨一組核心的線程之間實施順序一致性的全局前端和繼承向量;圖9B示出了根據(jù)本發(fā)明實施例的允許跨核心的線程間和線程內(nèi)的寄存器通信的寄存器互連拓?fù)?;圖9C示出了根據(jù)本發(fā)明實施例的跨物理分段式架構(gòu)的統(tǒng)一寄存器文5件的基于位置的寄存器引用;圖10示出了根據(jù)本發(fā)明實施例的自動生成越過循環(huán)迭代和邊界的線程的機(jī)制;圖11A示出了根據(jù)本發(fā)明實施例的自動生成跨越控制路徑的線程的機(jī)制;圖11B示出了根據(jù)本發(fā)明實施例的測試和分支指令處理;圖12示出了根據(jù)本發(fā)明實施例的使用的具有單獨標(biāo)簽和數(shù)據(jù)陣列的分段式/分布式緩存;圖13A示出了支持預(yù)取指令和其加載消耗指令之間的精確調(diào)度的映射機(jī)制;圖13B示出了根據(jù)本發(fā)明實施例的通過虛擬化硬件存儲的到物理存儲的Temp和Chain的動態(tài)分配;圖14示出了根據(jù)本發(fā)明實施例使用的在無需額外的物理寄存器的情況下使地址寄存器能夠重新命名的調(diào)度器向量中的計數(shù)器機(jī)制;圖15示出了根據(jù)本發(fā)明實施例實施的繞過和檢查機(jī)制。在各個附圖中,相似的附圖標(biāo)記指代相對應(yīng)的部分。具體實施例方式本發(fā)明的一個方面減小了上下文切換所帶來的麻煩。由于保存架構(gòu)狀態(tài)(例如,數(shù)據(jù)寄存器、控制寄存器、程序計數(shù)器等)耗費時間,因而上下文切換帶來了麻煩。在繼續(xù)進(jìn)行執(zhí)行之前不得不恢復(fù)之前的上下文的狀態(tài)。這意味著大量寄存器的許多加載/存儲的出現(xiàn)有時就如同涉及的子例程調(diào)用一樣常見。公開的架構(gòu)狀態(tài)的結(jié)構(gòu)在架構(gòu)狀態(tài)上進(jìn)行逐步的自上下文切換以及即時上下文切換。同樣,引入虛擬寄存器文件和寄存器緩存的概念作為可能的實施組件。相比可能使用傳統(tǒng)的硬件線程的支持來說,虛擬寄存器文件或者寄存器緩存還可以提供硬件中對虛擬的更大數(shù)量的線程或上下文的支持。多個層級的寄存器文件支持為寄存器文件提供更大的帶寬。還可以將該技術(shù)與線程支持相結(jié)合。架構(gòu)狀態(tài)的一部分將會經(jīng)歷即時硬件/軟件支持的上下文切換,在所述上下文切換中,通過使用LIFO(后進(jìn)先出)電路的硬件,來快速ilk/即時地保存所有架構(gòu)狀態(tài)。相對于寄存器文件或者隨機(jī)存取存儲器的實施,UFO電路的使用允許更低的復(fù)雜度和高效的速度和區(qū)域的實現(xiàn)。將屬于該類的每個接下來的上下文切換保存在LIFO中的舊的上下文切換的上面。這個技術(shù)非常適合遞歸式的子例程調(diào)用或者嵌套的并行循環(huán),其中,在遞歸中的一個調(diào)用的上下文將會以UFO的方式自然地進(jìn)入和離開。圖1示出了硬件上下文切換支持的一個實施例。對架構(gòu)狀態(tài)進(jìn)行這種快速保存的另一種方式是將寄存器文件的內(nèi)容保存為存儲器或緩存中的一個塊(例如,一個緩存行或塊)。一個寄存器批組為一系列后續(xù)的寄存器號碼(例如,寄存器0到7可以為更大寄存器集0-64的子組),當(dāng)出現(xiàn)涉及這8個寄存器的上下文切換時,可以將該一系列后續(xù)的寄存器號碼存儲為64字節(jié)大小的一個緩存行。相對于通常使用加載和存儲來保存和恢復(fù)每個個別寄存器來說,寄存器文ft^具有在同一周期或少量周期中直接運送其所有內(nèi)容的專門的寬總線101和102。寄存器文件的緩存?zhèn)魉偷囊粋€可能的實施是使用總線102和101來連接到填充緩沖區(qū),所述填充緩沖區(qū)一般用來填充緩存行以作為后門路徑來將寄存器直接移動到緩存。一個可選的實施可以使用寫入/讀取結(jié)合緩沖區(qū),所述寫A/讀取結(jié)合緩沖區(qū)通常用來在部分?jǐn)?shù)據(jù)作為簡單事務(wù)而通過總線寫到存儲器之前,將它們存儲和加載積累到緩沖區(qū),而不是每個均形成部分總線事務(wù)。這種結(jié)合緩沖區(qū)可以具有經(jīng)由101和102的側(cè)門總線連接,用以將一系列寄存器結(jié)合到一個寫入結(jié)合緩沖區(qū),所述寫入結(jié)合緩沖區(qū)隨后可以將寄存器的整個緩存行的值傳送到緩存或者存儲器中,同時可以使用讀取結(jié)合緩沖區(qū)來進(jìn)行相反的傳送。在另一個實施中,可以選擇使用具有LIFO電路或者隨機(jī)存取存儲器緩沖區(qū)的專門局部存儲器。LIFO電路更為簡單,并且具有更少的實施限制,但卻實行了嚴(yán)格的保存和恢復(fù)數(shù)據(jù)的順序(后進(jìn)先出)。另一方面,諸如對處理器緩存使用直接總線之類的隨機(jī)存取存儲器具有使用局部存儲器的靈活性,但卻實行了硬件實施限制,而允許以隨機(jī)的順序靈活地保存和恢復(fù)上下文。當(dāng)新的上下文取代舊的上下文時,可以逐步地保存和恢復(fù)架構(gòu)狀態(tài)的另一部分。換句話說,在新的或舊的上下文中使用個別寄存器時,由硬件來交換進(jìn)和交換出/讀進(jìn)和讀出該特定寄存器。這種逐步的上下文切換適合全局變量和通過上下文切換從一個子例程傳送到另一個子例程的變量。它還適合當(dāng)循環(huán)線程化時通過嵌套循環(huán)來傳送的那些變量,這樣,將內(nèi)部循環(huán)指定給與外部循環(huán)不同的線程。還可以應(yīng)用到下面的情況其中,將循環(huán)的不同迭代指定給不同的線程并且這些迭代將各個變量從一個迭代傳送到其它迭代(循環(huán)帶來的相關(guān)性)。在所有的這些情況中,對寄存器進(jìn)行逐步上下文切換是有益的,這是因為一般在線程之間使用的寄存器(在上下文之間傳送數(shù)據(jù)的寄存器)的數(shù)量很大,因此可以共享那些寄存器并且不需要進(jìn)行上下文切換,而剩下的寄存器可以逐步地按需進(jìn)行交換。本發(fā)明還可以使用虛擬寄存器來允許容納比由指令集的架構(gòu)直接支持的寄存器集更大的寄存器集。額外的寄存器成為硬件支持的上下文切換或者硬件/軟件線程的部分。寄存器緩存或者寄存器層級的概念也適用于這樣的情形。虛擬寄存器文件是一種如下的寄存器文件架構(gòu)其中,通過使用虛擬寄存器文件存儲裝置,來擴(kuò)展對架構(gòu)可視的指令集寄存器并且對架構(gòu)始終可視。這便于對屬于不同上下文切換或線程的相同架構(gòu)的寄存器保留多個拷貝。這也使得具有比使用傳統(tǒng)物理寄存器文件直接可訪問的寄存器數(shù)量更多的或者可變的寄存器數(shù)量。在硬件正在生成線程/上下文(硬件線程)的情況中,結(jié)構(gòu)寄存器的那些拷貝對硬件是可視的,并且當(dāng)軟件正在生成線程/上下文(軟件線程)時,它們還可以用軟件線程進(jìn)行過載。圖2示出了通過使用寄存器文件的層級的這樣的虛擬寄存器文件的一個實施例。較低層級級別的201為執(zhí)行單元支持非常高的帶寬。較高層級級別200支持較低帶寬的訪問。寄存器文件層級的一些級別包含由指令集的架構(gòu)支持的基本寄存器集,而寄存器文件層級的其它級別包含基本寄存器集的虛擬拷貝。還可以允許復(fù)制基本寄存器集以支持多線程。還可以在該層級中包括寄存器緩存,在所述寄存器緩存中,基于寄存器對當(dāng)前上下文的關(guān)聯(lián)性以及它們立即訪問的需要,來將這些寄存器緩存到這些結(jié)構(gòu)中或者從該結(jié)構(gòu)中緩存出。實施這種虛擬寄存器文件和寄存器緩存的一種方式是給寄存器位置提供標(biāo)簽以便通過標(biāo)簽來訪問它們,所述標(biāo)簽包括實際的寄存器號碼以及額外的其它信息,例如上下文ID號碼或者靜態(tài)線程號碼和可能的存儲器地址,在所述可能的存儲器地址中,為上下文切換而保存它們。其他可選的技術(shù)同樣于此描述,其中,索引映射202使用關(guān)于每個結(jié)構(gòu)寄存器的基于位置的信息。將在層級中的寄存器拷貝的8位置(地點)作為寄存器文件203的寄存器讀取訪問的解碼階段的部分進(jìn)行查找。其它機(jī)制包括將寄存器的位置作為從寄存器的產(chǎn)生指令到其消耗指令的計分牌(scoreboard)機(jī)制的部分來進(jìn)行傳送。消耗指令需要讀取寄存器以便它們知道它們需要去訪問該結(jié)構(gòu)寄存器的哪個拷貝,但是在基于位置/地點的方案中,由于寄存器的訪問是通過其寄存器號碼和位置來進(jìn)行的,所以不需要標(biāo)簽,其中,將特定的寄存器拷貝物理地位于多層級寄存器文件中的該寄存器的多個拷貝當(dāng)中。逐步上下文切換的機(jī)制可以使用類似的機(jī)制來對當(dāng)前上下文切換進(jìn)行個別寄存器的保存和恢復(fù),但具有以下不同。當(dāng)新的上下文試圖使用個別寄存器并且局部拷貝屬于舊的上下文時,該個別寄存器是由硬件交換/讀取的。此時,將屬于舊的上下文的寄存器與帶入到局部寄存器文件201的屬于新的上下文的200中的全局寄存器拷貝進(jìn)行交換。在一個實施中,具有相同寄存器號碼但不同的上下文ID標(biāo)簽的多個寄存器可以共存。標(biāo)簽方案的一個實施例可以類似于呈現(xiàn)來自不同上下文的相同寄存器的虛擬寄存器文件。虛擬寄存器文件是值得引起注意的,因為它允許大的虛擬寄存器文件被實施為具有不同帶寬和容量變化的多級寄存器文件的層級。下面的示例示出了呈現(xiàn)子例程的不同情形。假設(shè)隨后調(diào)用在單一程序/任務(wù)內(nèi)的不同子例程調(diào)用。a-丄/oc",va"'aWes<formula>formulaseeoriginaldocumentpage10</formula>如果不需要舊的上下文,則需要將局部寄存器文件中的舊的局部變量作為一個整體來保存,此處使用上下文即時保存是有意義的,需要保存整個上下文的其它情況為操作系統(tǒng)調(diào)用新的獨立過程的時候。另一方面,如果不需要保存所有的舊的上下文的寄存器,則只將需要保存的那些與新的上下文寄存器的值進(jìn)行逐步交換。這是子例程1和2—起共存于同一局部寄存器文件中并且在全局寄存器文件中共享相同的全局寄存器的情況。這是針對細(xì)粒度線程的情況。在這樣的情況中,當(dāng)需要訪問特定的上下文中的特定寄存器時,將它的上下文ID與在局部寄存器文件中存在的那個進(jìn)行核對。如果它們匹配,則可以使用它,否則需要從(諸如全局寄存器文件或者寄存器緩存之類的)更高的存儲層級中帶來/讀取它,并且可以與在局部層級存儲(例如,臨時局部寄存器)中的進(jìn)行交換。在子例程的調(diào)用處,將寫在子例程作用域(scope)之內(nèi)的新的變量指定給(具有與子例程外部作用域相比而言新的上下文/線程ID的)新的寄存器拷貝。可以通過硬件管理單元(HMU)或者通過為該架構(gòu)生成代碼的編譯器/程序設(shè)計器來指定那些新的寄存器名稱的拷貝。在HMU的情況中,進(jìn)入子例程代碼(調(diào)用和返回指令之間的一個)時,HUM單元將新的上下文/線程ID號碼指定給寫在子例程作用域之內(nèi)的每個寄存器名稱,從而生成寄存器名稱的拷貝。當(dāng)?shù)竭_(dá)返回指令時,該上下文/線程ID變?yōu)榭臻e以重新指定并且所有的寄存器名稱的拷貝可以再一次重新使用。由于硬件自動地管理寄存器名稱的這些臨時拷貝的指定和釋放,所以在創(chuàng)建和同步這些臨時上下文中沒有開銷。當(dāng)指令架構(gòu)允許使用上下文/線程ID號碼來擴(kuò)展寄存器名稱時,編譯器可以在不同的上下文中操縱寄存器名稱的管理。將指令寫進(jìn)具體寄存器名稱的這種方式也指明了指令寫給的和指令從其上進(jìn)行讀取的上下文/線程。考慮具有3個源(S1,S2,S3)和一個目的地(Dest)的一般指令作為下述編碼Dest/Sl—ADD(S2,S3)在這個示例中,將寄存器和其對線程的關(guān)聯(lián)格式化為Thy:Rx<~ADD(Thz:Ri,Thw:Rk)這示出了指令架構(gòu)如何允許指明上下文/線程ID,即Th"其中y表示線程ID)和具有寄存器名稱x的寄存器Rx的關(guān)聯(lián)。編譯器和程序設(shè)計器可以指明寄存器名稱所屬于的上下文/線程號碼。當(dāng)編譯了子例程代碼時,編譯器可以使用專門指令來增加線程ID計數(shù)器,以增加上下文/線程ID號碼;當(dāng)使用減少指令來退出子例程調(diào)用時,則減少該計數(shù)器。指令架構(gòu)可以使用的另一個機(jī)制是實施空閑線程選擇器指令。編譯器/程序設(shè)計器使用該指令來輪詢硬件以找到其可以使用的空閑上下文/線程ID。當(dāng)從子例程返回時,它可以使用諸如上下文/線程空閑指令之類的另一個指令。下面示出了這兩個方法。譜滅飾微器Fw"c/Zo"6o辦及efw7zf7%-.及,6Move7Tj力減贈飾微器在子例程調(diào)用之前進(jìn)行增加和在返回之后進(jìn)行減少的原因是允許在調(diào)用方和被調(diào)用方之間傳送值。增加創(chuàng)建新的上下文/線程號碼而減少則釋放它。執(zhí)行相同任務(wù)的可選方法使用了選擇空閑的上下文/線程號碼的指令和釋放該上下文/線程號碼的另一個指令。/=^肅錄程號礙/=透摔s像游遂程/D號^Fw""/o",'(w".a6Mve7V力./yFi/wcfz'ow6o命Free決mw/iDwwm6er印為了減少與每個寄存器名稱相關(guān)聯(lián)的上下文/線程號碼的編碼空間,指令架構(gòu)可以指明將寄存器與父線程或者當(dāng)前子線程相關(guān)聯(lián);這可以用一位來編碼(我們將父/子位稱為"P/C"位)。每個新生成的線程將指明其父線程(用過的線程)。將父ID號碼與其他線程狀態(tài)保持在一起??梢允褂没旌戏桨?,在所述混合方案中,指令可以指明來自使用父/子位的當(dāng)前子或父線程的一個/多個源,和來自使用明確的線程號碼和該源的寄存器名稱的另一個不相關(guān)的線程的一個/多個源。下面的指令集的架構(gòu)示出了這種混合方案P/C:RX<~ADD(P/C:Rj,P/C:Rj,Thw:Rk)"P/C"位指明寄存器是否屬于父線程或者子線程??梢砸话慊@個方案,其中,可以在更高級別的上下文之內(nèi)指定更多位來對活動線程進(jìn)行編碼。接下來示出這個更加一般的方案。高級別的上下文在其狀態(tài)內(nèi)定義很少的線程。處理器架構(gòu)允許可以由指令集縮減的小規(guī)格存儲狀態(tài)。假設(shè)處理器硬件可以支持總共N個線程,則指令集可以支持這些線程的縮減,這使得M個線程在指令集編碼中通過寄存器進(jìn)行相互通信,其中M〈N。這將使得由指令集的架構(gòu)支持的線程數(shù)量大于經(jīng)縮減的編碼位允許的線程數(shù)量。例如,假設(shè)硬件可以支持128個線程(N-128)。可以將指令集編碼定義為只具有4個線程(M-4)的編碼,這樣,可以由128個線程當(dāng)中的4個活動線程來同時訪問那些線程的寄存器。根據(jù)程序的活動區(qū),該4個編碼可以在128個線程當(dāng)中輪換。可以使用很少的位(T卜.T^M沐在指令中編碼M個線程。在本示例中使用2位TJ2來編碼4個線程。r7r^DD(T7r2:ATO.A7V.iV可以將程序區(qū)內(nèi)的活動線程映射到由硬件支持的線程的所有組,下面示例性示出映射或者指定指令M^(TJ2=70義m=/www在上面代碼的示例中,指令將硬件線程映射到由映射指令的2位H表示的經(jīng)縮減的編碼。經(jīng)由示例,添加的指令為每個源和目的地的線程編碼為只2個經(jīng)縮減的位。然而,第三源明確地編碼其源的線程。在指令集中編碼以縮減線程而對位數(shù)的決定,是可以從一個架構(gòu)變化到另一個的實施決定,同樣,包括第三源或者具有其所明確編碼的線程也是實施的選擇。為了實施這種指令或微操作(指令的微代碼實施)的處理器的流水線,該流水線將存儲這些映射,并且當(dāng)處理器執(zhí)行指令以編碼經(jīng)縮減的線程位時,使用這些映射來訪問正確的線程狀態(tài)。這些映射狀態(tài)可以擴(kuò)展寄存器分配算法以將單一線程變量映射到寄存器,其中編譯器可以將更大的線程組分配給有限數(shù)量的映射狀態(tài),并且隨后在每個線程之內(nèi)進(jìn)行寄存器分配。通過使用與寄存器的生命范圍相類似的線程的生命范圍,這種方式可以將映射狀態(tài)在程序中重新分配給新的線程。<table>tableseeoriginaldocumentpage14</column></row><table>如果該處理器為亂序處理器,則它還可以允許對那些縮減映射進(jìn)行重新命名以允許更多的那些主動區(qū)線程同時執(zhí)行。例如,在這種亂序處理器中,將會解碼上面的代碼,來將實際微操作編碼內(nèi)部的那些經(jīng)縮減的位重新命名為完整的線程號碼。在這種亂序的機(jī)器中,還實施臨時推測寄存器來保留那些重新命名的寄存器和狀態(tài)。圖3實施了臨時寄存器,其中,在將諸如301之類的臨時存儲器交調(diào)撥給全局寄存器文件之前,推測狀態(tài)可以位于臨吋寄存器中。所描述的一般方案使細(xì)粒度線程能夠無需通過存儲器而在寄存器級別執(zhí)行上進(jìn)行通信、協(xié)作、和同步執(zhí)行,而在同時具有通過給線程提供寄存器關(guān)聯(lián)而極度緊密的指令集編碼,并減小了指令編碼空間。上面描述的所有方案需要編譯器插入指令以管理線程并且設(shè)置擴(kuò)展位,這可以由硬件管理單元來進(jìn)行,所述硬件管理單元對指令執(zhí)行類似的動作和管理這些擴(kuò)展位的設(shè)置(如通篇本文所描述的那樣)。我們一般化上面的機(jī)制來操縱超出子例程調(diào)用的細(xì)粒度線程,以包括跨循環(huán)邊界的線程并在循環(huán)體和循環(huán)體之外的代碼之間創(chuàng)建的線程??紤]下面的代碼Loo/"=/to卿丄oop()rWto》通過使用編譯器或者硬件管理單元,可以將表示內(nèi)部循環(huán)體的線程(指令1和2)和表示內(nèi)部循環(huán)體之外的指令的線程映射為硬件支持的線程。經(jīng)由示例,在下面的實施表示的一個方案中,可以使那些細(xì)粒度線程位于寄存器文件/寄存器緩存中,并且可以交換進(jìn)和交換出到更高級別的寄存器文件層級和存儲器層級。假設(shè),將編譯器設(shè)計為使用一些規(guī)范,所述15例程中使用的寄存器的數(shù)量來保存上下文。因此它可以以增加的方式來保存若干寄存器。例如,如果設(shè)計規(guī)范以8為增量使用寄存器批組,則當(dāng)子例程需要使用在1和8個寄存器之間的若干寄存器時,其將會保存舊的上下文的寄存器1到8(并且當(dāng)它恢復(fù)舊的上下文時恢復(fù)它們)。如果子例程需要使用在1和16個寄存器之間的若干寄存器時,則它將會保存寄存器1至16等等,以完整的程度保存由架構(gòu)支持的全部寄存器。允許建立虛擬寄存器文件的另一個方案是,對不同的上下文/線程的寄存器進(jìn)行混疊(aliasing),其需要比由指令架構(gòu)提供的寄存器數(shù)量更少的寄存器。例如,小子例程調(diào)用或者工作線程可能只需要使用所有寄存器的子集,例如,指令集可使用的32個寄存器當(dāng)中的8個寄存器(寄存器0到7)。如果是這種情況,則硬件/編譯器將這8個邏輯寄存器批組混疊在另一個空閑的物理寄存器批組的上面,線程映射到的寄存器批組不需要和相同的寄存器號碼在一起;即,可以將寄存器0-7映射到在另一個上下文物理狀態(tài)存儲中可使用的物理寄存器8-15或16-23或24-31上。圖4示出這樣的情形。將由寄存器0-7組成的線程5的狀態(tài)402混疊在空閑的物理寄存器批組8-15的上面。這意味著可以比將每個線程映射到全部32個寄存器狀態(tài)上的一般情況容納更多的線程。在圖4中,由于32個寄存器中只有4組可以同時使用,所以一般只有4個線程可以在同一時刻共存。然而如果大多數(shù)額外線程(除了自身可能需要32個寄存器大狀態(tài)的主線程之外)需要小組寄存器,并且它們的每個均可以和8個寄存器小狀態(tài)共存,則可以同時處理總共13個線程??梢栽谶@8個寄存器批組的混疊配置中共存的同時線程的最大數(shù)量是16個小狀態(tài)線程。顯然,我們不需要為了示例性的目的而像圖中所示出的那樣存儲每個寄存器的標(biāo)簽。在高效的實施中,可以存儲每個批組(在本示例中8個寄存器)的線程標(biāo)簽,或者可選地可以根據(jù)號碼混疊方案來分配線程,在所述號碼混疊方案中,線程的號碼在8的倍數(shù)的邊界處開始。例如,如果我們基于這個方案來開始分配寄存器,則圖4示出軟件線程號碼0、1、3、4、5、6、7和9。如上面所描述,(經(jīng)由編譯器)通過指令集或者通過硬件管理單元來將軟件線程映射給物理硬件線程。混疊方案現(xiàn)在允許將16個硬件線程映射到軟件線程。在這樣的情形中,軟件線程0保留硬件線程0、1、2和3,因為它需要全部32個寄存器大狀態(tài),并且因此使用8寄存器的4個批組中的每一個。然而,軟件線程1只保留一個小狀態(tài)硬件線程存儲并因此映射在硬件線程4上。將軟件線程5映射到硬件線程5上,將軟件線程3映射在硬件線程6上并且將軟件線程6映射在硬件線程12上(在圖中示出為點400)。在指令集或微指令編碼中,為了支持上面描述的混疊方案,對線程-寄存器對的弓l用(reference)可以是位的連續(xù)編碼,其中,頂上的4位為硬件線程號碼(指示了8個寄存器的哪個批組被線程引用),而較低的3位指示寄存器批組0-7中的個別寄存器。作為示例,假設(shè)軟件需要進(jìn)行接下來在不同的線程中添加特定寄存器的高級別線程的任務(wù),并且將結(jié)果寫進(jìn)軟件線程1的寄存器2中,如圖4中的403所示如下隨后,通過編譯器或者硬件管理單元來將軟件線程映射到硬件線程。這種映射確保需要超過8個寄存器的軟件線程保留不止僅一個硬件-線程存儲,因而其他的軟件線程不能使用那些保留的硬件線程來映射到其上。任務(wù)的實際指令編碼如下OlOOOl(K"ADD(0001101,0110010,1100011),其解碼如下注意,由于將軟件線程的映射混疊在4個小狀態(tài)線程0、1、2、3上,其中的每個具有只8個寄存器的批組,所以將軟件線程0寄存器13編碼為硬件線程1(401)寄存器5(0001101,前4位為硬件線程號碼而后3位為寄存器號碼)。可選地,可以將相同的編碼讀作硬件線程O寄存器13(0001101,前2位為大狀態(tài)硬件線程號碼(具有32個寄存器狀態(tài)),而后5位為32個寄存器當(dāng)中的寄存器號碼)。如圖所示,可以在之前寄存器緩存方案上面實施的另一個方案在這個寄存器緩存和存儲器緩存之間提供自動存儲加載機(jī)制,以當(dāng)上下文切換和線程上下文交換時,允許寄存器緩存自動地溢出和重新加載寄存器。下面代碼示出了方案、以及圖5中描述的硬件如何工作來允許無縫多線程的上下文切換。(類似于一般與組和方式相關(guān)聯(lián)的緩存而建立的)寄存器緩存具有牽引部分、標(biāo)簽陣列和數(shù)據(jù)陣列。對數(shù)據(jù)陣列的訪問類似于對任何線程的寄存器陣列的訪問;當(dāng)任何指令訪問該線程寄存器時,進(jìn)行寄存器讀取。然而,當(dāng)任何加載或存儲指令是上下文切換的一部分時,對標(biāo)簽陣列進(jìn)行訪問,這也被認(rèn)為是保存和恢復(fù)上下文。當(dāng)存儲的寄存器的當(dāng)前線程上下文(保存上下文)實現(xiàn),由于在寄存器文件緩存中的那個特定寄存器集中仍具有閑置的空間,因而不需要將值實際地存儲到存儲器上的時候,針對該特定寄存器,使用當(dāng)前堆棧存儲器地址來只更新寄存器緩存的標(biāo)簽部分。稍后,當(dāng)在寄存器緩存中沒有空閑的空間來存儲需要分配相同寄存器名稱的新的線程時,使用這個標(biāo)簽來實際地收回寄存器。下面代碼示出這些77zra3w/Save"gz'他r6加AfD-7J/i^Ae^JT—J6"ow及0,afifi^M(X一J+496及/,…,acWreM(3c一/+2》6及77c^wm義—46Wore及O,acWmw(X一4+力6及7,…,a<^mM(3c_4+2》6及7jThreat/(5/Saveregisterfe加/zfO-7JacWmwt<5//"afifefreMJrj56Wow及O,fl^fr"ew(X一6+力…,a^fr^s〔x一6+2》6及7j尸mwWow》o(fjf/jmj^》^j^/mwJT一S6Wore及O,ac^mw^r一S+々f及人…,a^mw(3c—S+2》6及7j及0i76move…18及3^"Sw6raC…""l及56附ove…及56sw6frv3"…f及06丄Z)ot^mw&i76Ua^3fmw(X—S+",…,及7<="ZZ>aoWreM(3c—S在上面代碼中,編譯器希望將由線程l、4和6重寫的線程0的寄存器R0到R7,保存到存儲器堆棧上。在這個方案中,分配堆棧中的存儲器區(qū)域來容納寄存器批組(0-7),但是當(dāng)線程l、4和6相遇時,硬件沒有真正地進(jìn)行將線程0的寄存器存儲到存儲器/存儲器緩存。這是因為多上下文的寄存器文件緩存能夠?qū)⒋鎯?01提供給那些線程所需的額外8個寄存器(0-7),而沒有破壞原來線程(線程O)的寄存器0-8。只要多上下文的寄存器文件緩存可以容納那些寄存器,它就使用由存儲指令意圖執(zhí)行的堆棧存儲器地址來只更新寄存器緩存中的標(biāo)簽陣列。注意當(dāng)遇到線程8時("子例程foo"),因為寄存器緩存的空間都為寄存器批組0-7占據(jù),所以必需進(jìn)行線程0的寄存器0-7的存儲,并且事實上這類似于在一般緩存中的收回過程,其中,將線程0的寄存器0-7收回到實際堆棧存儲器/緩存層級存儲500,而寄存器文件緩存在這之后在存儲區(qū)域502中包括線程8的寄存器0-7的值。對上下文切換的機(jī)制還可以促進(jìn)諸如動態(tài)自生成和線程同步之類的其他技術(shù)。單一任務(wù)或程序的不同部分的并發(fā)執(zhí)行當(dāng)前需要亂序"超標(biāo)量"處理器架構(gòu)的實施。然而,亂序執(zhí)行需要相當(dāng)大的硬件投入和復(fù)雜度。下面是使用了亂序微架構(gòu)的這種并發(fā)執(zhí)行所需要的一般性的實施組件1.分配邏輯,其以程序的序列順序來分配所有資源。2.重新命名邏輯和寄存器映射,其將邏輯寄存器映射處分配處的物理寄存器,并且在物理寄存器的退回(retirement)處更新邏輯寄存器。3.保留站,其根據(jù)資源的可用性并且在動態(tài)解決相關(guān)性之后來亂序地分派操作。4.重排序緩沖區(qū),其允許將所述結(jié)果退回到架構(gòu)狀態(tài)之前,以初始的序列順序?qū)Y(jié)果重新排序。所述重排序緩沖區(qū)還保持精確異常行為。5.存儲器重排序緩沖區(qū),其對亂序分派的存儲器訪問進(jìn)行重新排序,以保持相同一致的模式就如同它們按順序分派一樣,例如,在存儲到相同地址之后對加載進(jìn)行檢查。還有必要像存儲器映射的I/O—樣來為專門寄存器訪問保持訪問的順序。很少的架構(gòu)能夠利用亂序機(jī)器的超標(biāo)量的特性和它們的能力來分派指令的多個獨立流,以允許多個軟件線程在機(jī)器中同時地執(zhí)行。這個同時多線程需要為每個硬件支持的線程復(fù)制機(jī)器的架構(gòu)狀態(tài),并且分割線程之間的微架構(gòu)資源,并且共享存儲器結(jié)構(gòu)就像那些線程之間的緩存一樣。盡管事實是那些機(jī)器是亂序的,但它們并不由亂序硬件本身來在線程之間初始、自分派、同步或者進(jìn)行并發(fā)。于此形成對比,將所有的那些任務(wù)留給軟件,當(dāng)(例如,通過使用界限)滿足了線程的分派條件/相關(guān)性時,由軟件初始/生成并且分派那些線程。當(dāng)線程之間具有集中控制或相關(guān)性時,軟件(例如使用鎖定)同步它們。軟件還決定它們之間的并發(fā)性。前面提及的軟件可以為實際主線程編碼或者為試圖靜態(tài)地并行化非線程代碼的編譯器。由于自動并行化這些代碼的困難度,通??梢允褂么至6炔⑿衼韺嵤┻@些線程,而使細(xì)粒度并行沒有高效線程初始。下面的論述示出了,通過使用硬件/軟件的新的示例,即使沒有使用精細(xì)的亂序微架構(gòu)支持,也可以實現(xiàn)自動并行化。通過動態(tài)地檢測對控制條件和/或相關(guān)性的解決,并且/或者通過允許線程之間的寄存器的交叉引用,還通過消除跨線程的存儲器引用的歧義,新的硬件生成、同步、并行化、并且并發(fā)地執(zhí)行那些細(xì)/粗粒度靜態(tài)和動態(tài)線程。通過硬件監(jiān)視與觸發(fā)線程相關(guān)聯(lián)的控制條件,或者監(jiān)視當(dāng)前線程所依靠的交叉引用的寄存器的值的回寫來實現(xiàn)。當(dāng)所有線程相關(guān)的寄存器和/或控制條件,特別是交叉引用特性的那些(例如,線程間寄存器)滿足時,觸發(fā)了通過硬件來動態(tài)地初始/生成線程。這可以通過該線程所依靠的源的明確列表來監(jiān)視。可以將這些硬件初始的動態(tài)線程看作,或者實際地作為子例程調(diào)用、或者以重復(fù)的子例程調(diào)用的20形式封裝(encapsulate)的方法或者子程序或者甚至循環(huán)實例。該子例程調(diào)用具有其執(zhí)行所依靠的參數(shù)列表。監(jiān)視這些參數(shù)列表或者寄存器中出現(xiàn)的它們的回寫階段的。一旦每個參數(shù)/寄存器在其更新的指令執(zhí)行之后被回寫,則設(shè)置標(biāo)志。當(dāng)設(shè)置了這些參數(shù)/寄存器的所有標(biāo)志時,則由硬件來動態(tài)地分派子例程/線程。對在(硬件生成的和軟件生成的)不同線程之間的寄存器或虛擬寄存器的交叉引用和/或存儲器的引用的允許,通過使用自然相關(guān)的解決方法,例如用于通過使用寄存器來創(chuàng)建程序的一致執(zhí)行,以對相關(guān)性進(jìn)行通信的方法等,來建立一種方式來生成、同步、并行化、以及并發(fā)地執(zhí)行那些線程。上面提及的緩慢逐步上下文切換還幫助允許通過使用如上面所示出的其他存在的動態(tài)/靜態(tài)線程,來建立/交換那些動態(tài)生成的或軟件靜態(tài)的線程的新的狀態(tài)。圖6示出了在那些線程的動態(tài)執(zhí)行期間,對相同名稱的寄存器解決錯誤相關(guān)的一個可能的機(jī)制。這還可以通過給寄存器號碼增加在機(jī)器中的指令分配時刻用標(biāo)簽標(biāo)記以示區(qū)分的位字段,來保持寄存器更新的序列順序。在前端處,每個寄存器具有對應(yīng)于該位字段的2個計數(shù)器的值。在將該寄存器作為指令的目的地的每個新指定處增加一個計數(shù)器的值(領(lǐng)先計數(shù)器)601。在將對應(yīng)寄存器調(diào)撥給架構(gòu)狀態(tài)的每個調(diào)撥處增加另一個指針602(滯后計數(shù)器)。滯后計數(shù)器永遠(yuǎn)不會超過領(lǐng)先計數(shù)器。領(lǐng)先計數(shù)器可以在到達(dá)最大值之后,環(huán)繞到初始的值;滯后計數(shù)器具有相同的功能??梢詫⑦@些計數(shù)器擴(kuò)展到具體的線程,這樣每個線程擁有自己的計數(shù)器。當(dāng)相同寄存器的新的時刻作為目的地指定給新指令時,特定寄存器的領(lǐng)先計數(shù)器601持續(xù)增加。每次在將寄存器作為目的地來重新指定給新分配的指令603時,(在機(jī)器的前端中)增加該寄存器的位字段,并且將該位字段附著到硬件指令605上。使用這個寄存器作為源606的每個接下來的指令將會使用新增加的寄存器號碼的擴(kuò)展字段。當(dāng)該寄存器調(diào)撥給最終的架構(gòu)狀態(tài)的時候,則增加在前端處的該寄存器的位字段的滯后計數(shù)器602。使用和增加滯后計數(shù)器的原因是,(在指令寄存器讀取階段)通過將硬件指令的寄存器的擴(kuò)展字段,與來自滯后計數(shù)器指針的那個寄存器的滯后計數(shù)器作比較,來判斷特定的寄存器的值是否需要從推測重排序緩沖區(qū)或者從退回的寄存器文件中讀取。滯后計數(shù)器602在退回流水線階段604處增加。該機(jī)制還可以應(yīng)用到個別指令,并且不限于子例程的調(diào)用或線程。可以使用繼承向量來取代圖6中示出的領(lǐng)先計數(shù)器和滯后計數(shù)器表,所述繼承向量具有針對每個結(jié)構(gòu)寄存器的字段。在分配時刻,該向量將增加的值從每個指令轉(zhuǎn)發(fā)到下一個,而每個指令增加與其目的地寄存器相關(guān)的位字段中的值。在圖8.a/8.b中示出了類似的概念,區(qū)別是針對一組指令而非僅一個指令。在下面的段落中,描述優(yōu)選的方法,來隨同上面描述的上下文切換的操縱一起,來對自動/動態(tài)線程的生成和同步進(jìn)行統(tǒng)一。此外,披露了物理-分段-架構(gòu)-統(tǒng)一的寄存器的概念和非常適合于這個實施例的寄存器層級。架構(gòu)還可以包括指令矩陣/塊/桶架構(gòu)(可更換地使用矩陣、塊或者桶),其中,指令是超大指令矩陣(UltraLargeInstructionMatrix)的部分,請參見同一發(fā)明人的申請?zhí)枮镻CT/US2007/066536的先前發(fā)明來了解作為"ULIM架構(gòu)"的所述超大指令矩陣,通過引用的方式將該申請包含在本文中。指令矩陣/桶/塊是指令的集合,其可以完全地相互相關(guān)或者完全地獨立或者介于二者之間(一些指令依靠其他指令,而一些指令相對于其他指令獨立)。通常指令矩陣/塊以矩陣的格式來封裝指令,在所述矩陣的格式中,相關(guān)的指令必須占據(jù)矩陣之內(nèi)的一列,而獨立的指令占據(jù)行或者列??梢詮膶⒓軜?gòu)映射給其硬件執(zhí)行單元的少數(shù)可能的配置中選擇矩陣的維(行、列)。矩陣/塊/桶架構(gòu)的概念允許代替?zhèn)€別源而在指令塊/桶本身的級別上來傳送相關(guān)性。因而,架構(gòu)高效地移除了與CAM(內(nèi)容可尋址的匹配)相關(guān)聯(lián)的復(fù)雜度,所述CAM在大標(biāo)量并發(fā)指令執(zhí)行架構(gòu)中匹配源和目的地。可以在沒有明確的使用ULIM架構(gòu)或者甚至指令桶/塊下,通過使用替代的虛擬標(biāo)識符,來設(shè)計本發(fā)明,所述虛擬標(biāo)識符提供與^/桶相類似的作用,這樣,沒有真正的形成矩陣或塊而是通過使用簡單指令組,所述虛擬標(biāo)識符在源組的級別上追蹤(track)和解決相關(guān)性(dependency)。本實施相對于現(xiàn)有方案的優(yōu)勢在于,其對每個單一指令中使用個別源的相關(guān)性追蹤和解決。在指令桶之內(nèi)和桶之間,可以將指令組合為VLIW或者SIMD或者M(jìn)IMD。隨后將桶作為動態(tài)線程來分派或執(zhí)行。此外,靜態(tài)軟件線程可以共享動態(tài)線程的相同的機(jī)制,而不同之處在于其生成是基于軟件應(yīng)用線程的。圖7示出了如本領(lǐng)域相關(guān)技術(shù)所描述的傳統(tǒng)的超標(biāo)量亂序架構(gòu)。個別指令使用重命名表(圖中未示出)來重新命名,所述重命名表將架構(gòu)寄存器映射到物理的寄存器池中,隨后調(diào)度、執(zhí)行并且退回指令。圖7中示出的是具有3個分派端口704的一般指令調(diào)度器701。通過使用這些端口,可以以程序的亂序順序來調(diào)度和分派至多3個指令,以在3個執(zhí)行單元702上執(zhí)行。通過使用回寫端口705,指令在每個周期將它們的結(jié)果回寫到重排序緩沖區(qū)703。隨后至多3個指令可以從指令重排序/退回緩沖區(qū)703上退回,這樣它們的目的地寄存器可以非推測地并且持久地更新架構(gòu)狀態(tài)。與圖7的亂序硬件的一般實施形成對照,如圖8.a所示,本發(fā)明描述了動態(tài)調(diào)度亂序架構(gòu),其通過使用指令矩陣/桶和組級別相關(guān)性檢查以及指令組分派和執(zhí)行的概念來更好地定標(biāo)。指令矩陣緩沖區(qū)和調(diào)度器801存儲那些指令矩陣/塊/桶。在一個示例中,確定指令桶806來滿足其相關(guān)性源并且從而準(zhǔn)備進(jìn)行分派,桶808和809也是如此。如果內(nèi)部潛在的硬件允許,則這些桶可以在單一周期中執(zhí)行,或者它們可以以流水線或者非流水線的方式經(jīng)由多個推測周期來在執(zhí)行單元802上逐步執(zhí)行。在這些桶的執(zhí)行結(jié)束之后,將它們的結(jié)果寫入到指令矩陣退回寄存器文件803。通過使用回寫端口805,將它們寫作表示桶的一組寄存器。這些桶的目的地寄存器駐留在桶退回緩沖區(qū),直到桶作為一個整體可以以程序的原序列順序來更新架構(gòu)狀態(tài)為止。于此描述的這個概念的一個可能的實施例具有3個組件1-前端2-調(diào)度器和執(zhí)行3-后端退回前端包括推測線程桶-指針,桶源和目的地列表。調(diào)度器和執(zhí)行桶包括桶分派選擇器以及虛擬寄存器匹配和讀取,包括可能的寄存器層級和寄存器緩存。后端是將執(zhí)行的桶記錄,并且在退回之前加強了異常排序。寄存器層級/緩存還為執(zhí)行的桶的結(jié)果充當(dāng)中間存儲,直到該結(jié)果是非推測的并且可以更新架構(gòu)狀態(tài)為止(類似于圖8.a示出的803)。下面公開了前端、分派階段、以及后端的一個可能的實施,其中,記錄了執(zhí)行的桶。這些在圖8.b中示出。通過拾取新的線程矩陣/塊/桶,過程開始,并且隨后將新的線程桶指定到桶緩沖區(qū)中的空桶槽當(dāng)中。在線程分配指針陣列852中的每個線程分配指針包括桶的間隔,在所述間隔中,允許線程物理地放置其指令的塊/桶。每個這樣的線程以輪轉(zhuǎn)(round-robin)的方式將桶持續(xù)分配到在其對應(yīng)的臨近空間間隔內(nèi)部的桶緩沖區(qū)陣列中。給每個線程空間內(nèi)部的桶/塊指定新號碼852,其在指定新的桶/塊的每個時刻增加。對于在桶850中的每個有效的源,每個桶的有效的源具有有效的讀取位"Rv",其指示了該源在這個桶內(nèi)部所需要的指令。通過相同的規(guī)范,經(jīng)由指令在該桶中回寫的每個目的地寄存器在這個桶中具有有效的位"Wv"集,并且它具有目的地繼承向量853中的字段。當(dāng)將新的桶拾取到桶緩沖區(qū)時,它從之前分配的桶上繼承目的地繼承向量,所述之前分配的桶由線程桶分配指針852來指明。從之前分配的桶上拷貝繼承向量,并且隨后所述繼承向量重寫那些有效的目的地字段,所述有效的字段對應(yīng)于由那些桶指令更新的寄存器。當(dāng)從桶內(nèi)部的對應(yīng)的繼承向量上拷貝無效的目的地時,使用當(dāng)前桶的號碼來標(biāo)記有效的目的地。隨后通過增加線程桶指針,來為新拾取的桶更新線程桶指針(其在內(nèi)部環(huán)繞)。在桶分派和執(zhí)行階段,當(dāng)在沒有任何異常操縱下執(zhí)行桶時,則設(shè)置(包括桶號碼的)桶執(zhí)行標(biāo)志854,在整個桶緩沖區(qū)中廣播它,并且在每個桶之內(nèi)鎖住和監(jiān)視它,所述每個桶具有源和作為源的桶號碼。還可以根據(jù)桶的號碼傳送其他相關(guān)的信息,例如關(guān)于虛擬寄存器位置的信息等。當(dāng)在桶之內(nèi)設(shè)置了源桶的所有的執(zhí)行標(biāo)志時,則設(shè)置這個桶的就緒位855,并且準(zhǔn)備好對桶進(jìn)行分派和執(zhí)行。當(dāng)桶沒有任何異常地執(zhí)行,并且準(zhǔn)備好以程序的序列順序來更新架構(gòu)狀態(tài)時,則它退回桶,并且將退回線程指針857增加到陣列中的下一個桶??梢詫⑼嘶氐耐暗奈恢弥付ńo新的桶。所有的這些密切相關(guān)的線程可以在矩陣/桶/塊緩沖區(qū)內(nèi)部共存;每個線程將占據(jù)屬于該線程的連續(xù)的桶的間隔。該線程的分配指針以輪轉(zhuǎn)的方式在桶的該間隔內(nèi)部移動,來拾取新的指令桶并且以所描述的輪轉(zhuǎn)的方式在線程的間隔之內(nèi)分配它們。使用這樣的間隔區(qū)域,將整個桶緩沖區(qū)動態(tài)地劃分為不同的或者相同的間隔長度的桶。此處引入了指令桶和線程的繼承向量的概念。每個指令矩陣/塊/桶寫入到結(jié)構(gòu)寄存器當(dāng)中的特定寄存器中。在分配階段上的每個新桶通過將線程和其所擁有的桶號碼寫入到繼承向量來更新這個繼承向量,并且保留沒有寫入而未更新的寄存器字段。該桶繼承向量B—zV856以程序的順序從每個桶轉(zhuǎn)發(fā)到下一個。在圖8.b中,當(dāng)在矩陣中的指令寫入到寄存器中時,每個矩陣將其自己的號碼寫入到架構(gòu)目的地寄存器中,否則它從該線程中的之前桶的Bjv上繼承值。經(jīng)由圖9中的實施例所示出,這個概念從管理少量密切耦合的線程的桶緩沖區(qū)上,按比例縮放到管理多個桶緩沖區(qū)和線程的硬件電路上。將可以擴(kuò)展來處理具有更少緊密作用的更多線程的那些電路,描述為全局前端,所述全局前端處理線程頭(header)卯2,而無需處理線程內(nèi)的實際指令,來加強這些遠(yuǎn)線程的相關(guān)性的檢查。線程的頭和它的桶的子頭只包括關(guān)于線程和桶寫入到的結(jié)構(gòu)寄存器(那些指令的目的地寄存器)的信息,而不需要那些線程頭包括實際指令或指令的源。實際上,對那些目的地寄存器和位向量進(jìn)行列表是足夠的,在所述位向量中,為成為指令的目的地的每個寄存器設(shè)置每個個別位。不需要將頭物理地放置為指令的頭;它可以為任何格式的包或者緊密表示,或者在線程內(nèi)的指令的目的地寄存器的頭,其可以或者不可以用其余的指令信息存儲。該全局前端以程序的順序只拾取線程/塊的頭,并且生成動態(tài)線程和/或桶繼承向量901(I7v和/或5iV)。如903所示,在分配新的線程的每個時亥iJ,通過對當(dāng)前線程桶沒有寫到或者更新的舊的字段進(jìn)行保留,來轉(zhuǎn)發(fā)繼承向量。將那些繼承向量分發(fā)給很多個引擎/核心或者處理器卯4,其中的每一個可以包括局部前端和拾取單元(所述拾取單元將會拾取和存儲為每個桶產(chǎn)生相關(guān)性向量的實際指令)以及具有局部寄存器文件905的局部矩陣/塊/桶緩沖區(qū)。隨后,周部前-端拾取實際指令并且使用從全局前端獲得的繼承向量的信息,來為指令的指令源填充相關(guān)性信息,所述指令源帶入到引擎中來執(zhí)行。圖9示出了全局前端實施例,以及只使用關(guān)于指令的簡明信息(即是這些指令寫入到的寄存器)來將繼承向量散布到不同引擎卯4的方式。放置在頭中的其他有用信息是關(guān)于線程內(nèi)的或跨線程的控制路徑的變更信息??梢允褂萌址种ьA(yù)測器來預(yù)測跨這些線程的控制流。這樣,頭可以包括分支目的地和偏移量。除了用分支預(yù)測器確定控制流之外,硬件/編譯25器可以決定跨2個分支控制路徑來分派獨立線程。在這樣的情況下,如圖ll所示,它將使用繼承向量來稍后合并那2個路徑的執(zhí)行。圖9還示出當(dāng)由全局前部來拾取新的線程的頭時的轉(zhuǎn)發(fā)過程,例如,線程2(906)將更新對應(yīng)的繼承向量901,將所述繼承向量901轉(zhuǎn)發(fā)至結(jié)果的向量910,在所述向量910中,使用T2標(biāo)記來更新寄存器1,2,3,4,6,0和7。注意T2桶沒有寫進(jìn)910中的寄存器5,所以從之前的繼承向量繼承其標(biāo)記。一個值得注意的觀察結(jié)果是寄存器文件允許進(jìn)行跨核心/引擎之間的通信。只要將線程的指令桶拾取并且分配在局部桶緩沖區(qū)中,就可以安排跨引擎所需的寄存器的早期請求(以減小訪問等待時間),此時填入源的相關(guān)性信息,這樣在為執(zhí)行分派實際指令之前,此刻跨引擎的線程引用發(fā)布得可能很長。在任何情況下,指令將不會分派直到轉(zhuǎn)發(fā)和到達(dá)了交叉引用的源為止。可以將交叉引用的源存儲在局部多線程寄存器文件或者寄存器緩存中。盡管可以將該交叉弓I用的源存儲在類似于加載存儲緩沖區(qū)的緩沖區(qū)中(它可以重新使用加載存儲緩沖區(qū)的物理存儲裝置和相關(guān)性檢查機(jī)制,只是由寄存器加載代替存儲器加載)??梢允褂迷S多拓?fù)浣Y(jié)構(gòu)來連接跨引擎/核心的寄存器文件,所述拓?fù)浣Y(jié)構(gòu)可以為環(huán)式拓?fù)浣Y(jié)構(gòu)或是縱橫式(crossbar)拓?fù)浣Y(jié)構(gòu)或者網(wǎng)狀路由式互連。下面的論述示出如何在引擎內(nèi)部以及跨引擎來使用寄存器文件分段。當(dāng)對桶進(jìn)行分派時,將其源(同時地或順序地)發(fā)送到寄存器文件和寄存器緩存這二者上。如果將寄存器文件物理地統(tǒng)一并且具有對線程的直接支持,則從對應(yīng)的線程寄存器區(qū)域直接讀取操作數(shù)。如果寄存器文件是虛擬寄存器,包括使用了標(biāo)簽的物理分段的寄存器文件,則必須進(jìn)行標(biāo)簽匹配以作為虛擬寄存器讀取的一部分。如果標(biāo)簽是匹配的,則從分段的寄存器進(jìn)行讀取。圖9.b示出了總的虛擬寄存器文件和寄存器緩存。其還示出了執(zhí)行的分段和低級別的寄存器文件。SIMD或者M(jìn)IMD指令在每個區(qū)域訪問對應(yīng)的SIMD/MMD寄存器數(shù)據(jù)段,而VLIW指令在每個段中獨立地訪問不同的寄存器。在線程模式中,每個區(qū)域獨立地具有單獨的指令,所述單獨的指令獨立地訪問寄存器并且可以以統(tǒng)一的視點跨段寄存器來訪問。圖1-5中示出了線程如何使用寄存器文件層級的更多方式。在不允許硬件獨立地重新安排區(qū)域桶的情況下,為了允許保留指令調(diào)度的選擇權(quán),以作為由編譯器自動并行化或者VLIW或者SMID/MIMD的合成物的組成,通過使用位或者標(biāo)志來利用鎖合機(jī)制,所述鎖合機(jī)制將4個桶鎖合在一起以作為超桶。如果設(shè)置了該位或標(biāo)志,則超桶之內(nèi)的所有桶(在這個情況中4個桶)將在相同的周期之內(nèi)并行地執(zhí)行。如果沒有設(shè)置標(biāo)志,則不將那些桶鎖合來一起執(zhí)行,并且可以在各個時刻獨立地執(zhí)行。由線程或者亂序執(zhí)行或者VLIW架構(gòu)而導(dǎo)致的增加的并行給有限的帶寬的寄存器文件帶來了巨大的壓力。通常將寄存器文件設(shè)計為統(tǒng)一資源以允許訪問所有寄存器。分段的寄存器文件已經(jīng)在前進(jìn)行了設(shè)計,但是它們需要在架構(gòu)/軟件級別處跨讀/寫進(jìn)行操作,這阻止它們用作資源的統(tǒng)一集,并且增加了跨讀/寫的開銷。本發(fā)明所公開的寄存器架構(gòu)支持軟件線程、硬件生成的線程、VLIW執(zhí)行、SIMD&MIMD執(zhí)行、以及亂序超標(biāo)量執(zhí)行的模擬。盡管它是物理分段的,但可以將其看作統(tǒng)一的架構(gòu)資源。該分段的寄存器是虛擬寄存器文件的部分,其可以包括寄存器層級和寄存器緩存以及存儲和檢查寄存器標(biāo)簽的機(jī)制。如果我們使用利用相關(guān)性繼承向量的基于位置的方案,則無需訪問標(biāo)簽。方案這樣工作當(dāng)在分派階段期間廣播所執(zhí)行的桶的號碼時,接下來的指令的所有源進(jìn)行CAM(ContentAddressableMatch,內(nèi)容可尋址匹配),所述CAM將它們的源的桶與剛分派的/執(zhí)行的桶作比較,來為該源設(shè)置準(zhǔn)備好的標(biāo)志。此處,還可以將該桶執(zhí)行的物理位置隨同寄存器號碼一起進(jìn)行傳播,以便解決任何不確定點。例如,在圖9x中,有4個寄存器文件段,其中每個包括16個寄存器。例如,當(dāng)將桶^分派給區(qū)域2時,將桶的號碼x廣播到桶緩沖區(qū),并且還將段#2和其一起廣播,這樣與桶x相關(guān)的所有源將會記錄該桶寫入了段2中的其所有的寄存器。當(dāng)時間逐漸開始分派這些指令對,指令知道它們需要從段2而非其它段上讀取它們的寄存器,即使相同的寄存器號碼存在于其它段上時也是如此。這還可以應(yīng)用到寄存器緩存上來避免使用標(biāo)簽。我們可以將這個概念擴(kuò)展到全局前端,其中除了線程信息以外,繼承向量可以指明在哪個引擎中,分配了寫到這個寄存器的指令桶。下面描述能夠發(fā)布SIMD/MIMD、VLIW、ULIB桶指令以及動態(tài)和靜態(tài)線程的統(tǒng)一動態(tài)執(zhí)行架構(gòu)的描述。該架構(gòu)在沒有明確的亂序組件支持下,還支持對超標(biāo)量亂序?qū)嵤┑哪M。本發(fā)明還可以包括物理分段的、架構(gòu)的統(tǒng)一寄存器文件以及可能的寄存器緩存層級。本發(fā)明公開的技術(shù)允許使用一個統(tǒng)一的方法和實施,來執(zhí)行軟件初始的線程(靜態(tài)線程)和硬件生成的線程(動態(tài)線程)。如上面所提及的,在軟件靜態(tài)最優(yōu)化級別處識別細(xì)粒度并行是困難的,并且因而動態(tài)線程是這樣一種方式硬件可以通過將動態(tài)線程上下文指定給諸如子例程調(diào)用、方法子程序/步驟、獨立對象代碼或并行循環(huán)之類的軟件桶,來生成該細(xì)粒度并行。這使用公開的實施和方法,通過將一些線程和它們的位標(biāo)識字段保留給動態(tài)線程來實現(xiàn)。例如,在上面的實施例中,可以向硬件動態(tài)線程指定可使用的"m"個線程之內(nèi)的子集線程組。硬件可以使用那些分配的線程保留來動態(tài)地生成和/或發(fā)布硬件線程。例如,在(如集合的"Call"指令所指示的)子例程調(diào)用或子程序調(diào)用中,硬件可以將新的硬件線程指定給這樣的調(diào)用并且最終在返回子例程之后可以要求收回線程保留。相同的情況也適用于循環(huán),在所述循環(huán)中,可以在(如集合的"循環(huán)"指令所指示的灘環(huán)的入口處生成硬件線程并且可以在循環(huán)到達(dá)其末端指令之后收回硬件線程。還可以將其它指令用作可能的硬件線程機(jī)會,其直接映射為軟件線程可應(yīng)用的事件,例如面向?qū)ο蟮姆椒▓?zhí)行或者對象關(guān)聯(lián)代碼或者任何高級別或面向?qū)ο蟮木幊叹€程機(jī)會等。在所有情況中,可以通過寄存器/桶的交叉引用和控制標(biāo)志來解決那些線程的同步,這可以通過上面描述的機(jī)制來追蹤和解決。圖10示出了硬件(或者編譯器或者運行時間系統(tǒng))如何可以使用動態(tài)硬件線程來在在循環(huán)體內(nèi)和周圍不同的地區(qū)重疊指令的執(zhí)行。再一次地,線程頭封裝在循環(huán)體1004之內(nèi)的每個桶的目的地寄存器以及在循環(huán)體之外的代碼。在這樣的情況下,硬件或者編譯器將線程Tl分配到循環(huán)體之前的代碼,并且作為示例只有一個線程分配到循環(huán)體T2(通過將循環(huán)劃分為多個迭代直到可以將每個循環(huán)迭代指定給一個線程的程度,可以將多個線程指定給循環(huán)體,循環(huán)線程的數(shù)量是可以在運行時或基于編譯器分析來決定的動態(tài)決定),而將循環(huán)之后的代碼指定給線程T3。注意,由反饋回循環(huán)體自身T2的循環(huán)體的桶生成的繼承向量1005,與轉(zhuǎn)發(fā)到循環(huán)體T3之外的線程的那個繼承向量1005些許有些不同。這是因為T3需要由循環(huán)上迭代的寄存器的最后拷貝,該最后拷貝通過Ai指示在繼承向量1002中。當(dāng)?shù)竭_(dá)循環(huán)的最后迭代時,在該最后迭代中的所有桶運送標(biāo)志n,所述標(biāo)志n設(shè)置為桶號碼的一部分(即,最高有效位)。依靠循環(huán)體T2的T3寄存器將依靠這個迭代循環(huán)T2的最后迭代n。這也將記錄在轉(zhuǎn)發(fā)給T3的繼承向量中。此處假設(shè)T2內(nèi)部沒有任何控制路徑來在不同的迭代而非最后迭代處改變循環(huán)寄存器的更新,則可以使用預(yù)測來解決這種控制路徑(如果它存在于循環(huán)體的內(nèi)部的話)??梢詫?biāo)識符n作為如1003中的繼承向量的一部分來運送和轉(zhuǎn)發(fā)。這本質(zhì)上指代由循環(huán)的最后迭代所構(gòu)成的桶。此外,可以將這些動態(tài)線程指定到分支代碼(分支或控制變更接下來的代碼)??梢允褂迷摷夹g(shù)來發(fā)布2個線程,其中的一個沿著2個可能分支的每一個。在這樣的情況下,一旦架構(gòu)地解決了分支,則線程中的一個調(diào)撥,而另一個則丟棄??紤]到2個不同的控制路徑影響不同的寄存器的情況,正在轉(zhuǎn)發(fā)向量的繼承將指明標(biāo)志控制F,所述繼承將標(biāo)志控制F嵌入到其桶號碼字段1101中。在這樣的情況下,在這個控制路徑上的相關(guān)的桶中的每個源將為由可變的控制路徑影響的那些源的寄存器,來指明在繼承向量1102之內(nèi)的條件標(biāo)志。將標(biāo)志與桶的號碼一起來廣播,所述桶的號碼在CAM分派匹配期間將該標(biāo)志執(zhí)行/解決到所有相關(guān)的桶。這在圖11中示出。標(biāo)志的意圖是遠(yuǎn)離的桶目前不知道哪個線程將轉(zhuǎn)發(fā)它們所需要的特定寄存器的值(直到執(zhí)行和決定了標(biāo)志條件為止)。沿著2個可能的分支路徑的線程沿著其路徑繼續(xù)執(zhí)行,直到解決了標(biāo)志并且線程中的一個(沿著錯過預(yù)測的路徑)被毀滅為止。但是在沿著這2個路徑的執(zhí)行期間,拾取了和分配了沿著支路方向的許多其他桶,并且它們的繼承向量轉(zhuǎn)發(fā)。它們需要標(biāo)志,這樣它們可以使用從沿著正確的執(zhí)行路徑的控制線程而來的正確的桶號碼,來代替該標(biāo)志(且等待它們的相關(guān)性來解決)。注意我們還可以利用線程和桶的頭來找到需要的信息。另一個創(chuàng)新是在每個結(jié)構(gòu)寄存器之內(nèi)包含標(biāo)志字段,這樣每個架構(gòu)或者物理寄存器具有作為可視狀態(tài)的部分的標(biāo)志字段。這允許簡單的預(yù)測機(jī)制,來為了指令的條件執(zhí)行以及能夠為分支指令容易地創(chuàng)建延遲槽。例如,在循環(huán)中,對循環(huán)末端條件進(jìn)行測試的測試指令必須先于分支指令而在二者之間沒有其他標(biāo)志修改指令。使用寄存器標(biāo)志字段,并且通過指明這個分支依靠特定寄存器的標(biāo)志(在這個示例中為測試指令的目的地),測試條件可以放置在循環(huán)的開始處,而實際分支可以在循環(huán)的末端處。因此,到分支指令在機(jī)器的前端處的時候,已經(jīng)執(zhí)行了測試指令并且分支可以在前端階段處而非執(zhí)行階段處執(zhí)行,因而排除了氣泡。這些寄存器標(biāo)志還方便簡單指令預(yù)測或者線程預(yù)測,其中,可以基于特定指令的結(jié)果,來對指令或者特定線程中的指令進(jìn)行預(yù)測,該結(jié)果不需要在執(zhí)行序列中立即先于它。這在圖ll.b中示出。在分支位置處的前面執(zhí)行測試指令1150?;谄浣Y(jié)果,測試指令1150將拾取正確的程序指令路徑,并且將它們保留在一邊,直到將分支指令1151分配在前端處為止,并且隨后它在流水線中供給這些指令。該架構(gòu)還可以在分支1152之后預(yù)測指令,并且在分支之前執(zhí)行它們,并且在執(zhí)行分支之后使用有條件的移動。如圖ll.b所示,還可以與執(zhí)行的2個可能的控制路徑并排來發(fā)布2個線程。此外如圖ll.b所示,測試指令1150可以推測地執(zhí)行,即使其源是推測的或者由硬件或編譯器來預(yù)測也是如此,但該測試指令1150寫入到推測的標(biāo)志F2中,當(dāng)先于分支1151的實際測試指令執(zhí)行時,它寫入到標(biāo)志F1中,此時,將2個標(biāo)志進(jìn)行比較,并且如果它們匹配與測試指令1150—起開始的推測的執(zhí)行線程,則該線程繼續(xù)存在于正確的控制路徑中,而其他線程使用在圖ll.a示出的繼承合并機(jī)制來停止拾取指令。如果標(biāo)志沒有匹配,則其他線程繼續(xù)拾取,并且早期測試的線程停止。這允許線程推測和從錯過的推測中快速恢復(fù)(對于早期的分支推測沒有等待時間懲罰)。通過線程的寄存器交叉弓I用的操作是在線程自動生成和/自動同步中的另外一個關(guān)鍵要素??梢酝ㄟ^使用經(jīng)由加載和存儲的存儲器訪問,來進(jìn)行這些引用。在圖12中,我們大體上示出了全面的方案以及在線程之間和/或在加載和存儲之間的同步方案的實施。方案描述了優(yōu)選的方法,用于跨加載/存儲架構(gòu)的存儲器引用和/或跨存儲器引用和/或線程的存儲器訪問的同步和消除歧義。在圖12中,我們示出了寄存器文件(地址或數(shù)據(jù)寄存器)的多個段、執(zhí)行單元、地址計算單元、第1級緩存和/或加載存儲緩沖區(qū)和第2級緩存和地址寄存器互連1200和地址計算單元互連1201。通過將一個核心/處理30器的集中資源分段和分發(fā)給各個引擎,可以在一個核心/處理器內(nèi)構(gòu)建這些分段要件,或者從多核心/多處理器配置中的不同的核心/處理器要件來構(gòu)建它們。在圖中將段1211中的一個段示為段號1;可以將該段按比例縮放到大的號碼上(通常到如圖中示出的N段)。這個機(jī)制還當(dāng)作對于這些引擎/核心/處理器之間的存儲器架構(gòu)的一致方案。這個方案由地址請求開始,所述地址請求來自于一個段/核心/處理器中的地址計算單元之中的一個。例如,假設(shè)由段1(1211沐請求地址。通過使用屬于其自己段的地址寄存器,和/或使用地址互連總線1200從跨其他段的寄存器上,段1可以獲得并且計算它的地址。在計算地址之后,它創(chuàng)建用于訪問緩存和存儲器的32位地址或64位地址的基準(zhǔn)地址。通常將該地址切分為標(biāo)簽字段以及集和行字段。該特定的段/引擎/核心將地址存儲到它的加載存儲緩沖區(qū)和/或Ll和/或L2地址陣列1202中,同時,通過使用壓縮技術(shù),它將創(chuàng)建標(biāo)簽的壓縮版本(具有比地址的原標(biāo)簽字段更少的位)。更多的,不同的段/引擎/核心/處理器將集字段或集字段的子集用作索引來識別地址保持在哪個段/核心/處理器中。通過地址集字段位,該段的索引確保在特定的段/核心/引擎中的地址的所有權(quán)的排他性,即使與該地址相對應(yīng)的存儲器數(shù)據(jù)可以存在于另一個或多個其他的段/引擎/核心/處理器中也是如此。即使在每個段中均示出了地址CAM/標(biāo)簽陣列1202/1206與數(shù)據(jù)陣列1207相耦合,但它們的耦合也只是布置和規(guī)劃的物理近似,或者即使源于二者都屬于特定的引擎/核心/處理器的事實,但是在一個段內(nèi)的地址陣列中保留的地址和數(shù)據(jù)陣列中的數(shù)據(jù)之間也沒有關(guān)系。在形成壓縮的地址標(biāo)簽之后,使用集的字段位來識別請求尋址到的特定地址CAM陣列1202。假設(shè)其表明是那些集字段位將段/引擎/核心/處理器N認(rèn)作是擁有地址作用域的那個,則將經(jīng)壓縮的標(biāo)簽發(fā)送到該段/引擎/核心/處理器(段N)LlCAM和域相對應(yīng)的L2CAM陣列,該陣列隨后將在到來的壓縮標(biāo)簽和每個存儲在其陣列中的壓縮標(biāo)簽之間進(jìn)行內(nèi)容地址匹配(CAM)。由于這是經(jīng)壓縮的標(biāo)簽,因而CAM陣列的寬度是最小的并且因而能夠負(fù)擔(dān)對Cam陣列的構(gòu)造,所述CAM陣列具有與數(shù)據(jù)陣列相似的項號碼(通常CAM陣列是非常昂貴并且耗能的)。在CAM匹配完成之后,其結(jié)果可以是命中(hit)或錯過或多個命中(優(yōu)良的壓縮技術(shù)應(yīng)該減少多個命中的數(shù)量)。隨后在命中/多個命中的情況中,讀取在段N中對應(yīng)于CAM命中項的Loc陣列(位置陣列)1203,以識別屬于該地址CAM命中的存儲器數(shù)據(jù)的位置。將這個位置發(fā)送回至在請求段(本示例中的段l)中的請求地址計算單元。通過使用互連1205的地址總線,該地址計算單元請求緩沖區(qū)1204將完整的地址發(fā)送到該位置1206的地址/標(biāo)簽陣列。隨后進(jìn)行標(biāo)簽的査詢和比較,以確保準(zhǔn)確的/唯一的命中。隨后,如果確定命中,則使用互連1205的數(shù)據(jù)總線來返回數(shù)據(jù)。如果在CAM或是完整標(biāo)簽陣列中發(fā)生錯過,則代表請求段來放置對于主存儲器的請求。如前面所描述,還可以(通過使用作為索引的集字段位)削減更多的等待時間并且將完整的地址發(fā)送到擁有地址作用域的段上,并且在該段處,經(jīng)壓縮的標(biāo)簽形成并且首先訪問CAM陣列,而完整的地址保持在那直到檢查了CAM的結(jié)果為止,并且讀取位置陣列1203來識別在標(biāo)簽陣列1206中的項號碼,所述標(biāo)簽陣列1206在壓縮標(biāo)簽1202中命中。隨后使用與CAM相對的比較器,來在完整的地址上完成了完整比較。CAM陣列1202的實施并不需要真正地進(jìn)行CAM,由于這個比較可以在從完整的標(biāo)簽上獲得的并且經(jīng)過壓縮的少數(shù)位上進(jìn)行,所以CAM陣列可以實施為直接索引的寄存器陣列(RAM)或寄存器文件,例如,如果經(jīng)壓縮的標(biāo)簽形成為8位字,則可以將每個段的整個CAM陣列構(gòu)建為256項RAM陣列,當(dāng)8位經(jīng)壓縮的標(biāo)簽到來時,它直接進(jìn)行解碼來讀取位置陣列1202的256個項中的一個(事實上,在這種8位經(jīng)壓縮的標(biāo)簽的情況中,CAM陣列不需要存在為物理陣列),因此它實際只需要用作對于未知陣列1203的解碼器。下面所要描述的方案,通過定義稱為"Temp"和"Chain"的臨時存儲變量,來在沒有增大寄存器壓力的情況下,經(jīng)由發(fā)布(issue)存儲器加載時間頭,來定義存儲器等待時間的減少。只使用一次Temp,來允許指令指代存儲器中的位置并且將其預(yù)取到緩存緩沖區(qū)中的特定位置。這不同于將數(shù)據(jù)預(yù)取到緩存的一般方案,因為使用了Temp和Chain,在Temp預(yù)取的值和其消耗指令之間是直接1對1的映射;這類似于寄存器指定可以實現(xiàn)的。相反地,在一般的緩存預(yù)取方案中,將存儲器數(shù)據(jù)預(yù)取到緩存中的地址位置,消耗指令可以通過數(shù)據(jù)的存儲器地址只引用這個預(yù)取的數(shù)據(jù)。消耗指令的調(diào)度器并不知道,因而當(dāng)它執(zhí)行時消耗指令沒有關(guān)于發(fā)現(xiàn)數(shù)據(jù)的控制。在此處描述的新的Temp和Chain的方案的情況中,將存儲器數(shù)據(jù)帶入到緩存緩沖區(qū)中(加載到緩存中)并且指定一個名稱"例如,Temp0",這個加載的數(shù)據(jù)的消耗指令現(xiàn)在可以明確地指代Temp0這個名稱,并且當(dāng)它執(zhí)行時,期望以絕對的保證在Temp0的位置中發(fā)現(xiàn)它。因為將Temp號碼指示為在消耗指令中的相關(guān)性的源,所以調(diào)度器將不會發(fā)布該指令直到Temp是有效的為止(將數(shù)據(jù)從高級別緩存或存儲器實際地加載),這類似于當(dāng)將存儲器的值加載到寄存器中時所發(fā)生的。如圖12所示,除了精確預(yù)取(l對1映射)和消耗指令的精確調(diào)度之外,這還具有額外的益處,其允許等待時間可變的分布式緩存。為了防止Temp和Chain在它們的消耗者指令釋放它們之前毀滅,編譯器確保它將不會重新指定這個寄存器,直到它的消耗者指令消耗它為止。在寄存器指定和Temp指定之間的不同很少;使用Temp來將所需要的數(shù)據(jù)帶入到緩存緩沖區(qū)中的臨時位置,其根據(jù)消耗指令(引用該臨時位置的指令)消耗的值,來自動地進(jìn)行解除分配。這將確保該Temp的生命范圍很短,并且因此可以非常高效的使用??梢栽诔绦蛑兄付═emp的一個方式是通過使用與加載地址計算指令(或地址計算指令桶)相配的標(biāo)記,艮P:LabelTemp0:Load@Address(R5,R2,offset)R10<~R17,TempO在代碼段或子例程中使用的Temp的標(biāo)記必須在它們使用之前分配。所以,如果編譯器意圖使用lO個Temp位置來預(yù)取其數(shù)據(jù),它應(yīng)該使用分配指令/例行程序,來在緩存/緩沖區(qū)中分配這些Temp位置。在每個指令消耗其Temp之后,Temp位置將會空閑。硬件可以通過上下文切換來為另一個子例程重新分配這些Temp位置/標(biāo)記;可以通過使用緩存/緩沖區(qū)來實現(xiàn),所述緩存/緩沖區(qū)存儲和線程ID標(biāo)簽一起分配的Temp數(shù)據(jù)。當(dāng)遇到新的子例程的標(biāo)記分配指令時,硬件將指定新的線程ID和新的Temp位置。如果在緩存/緩沖區(qū)中沒有空間來供新的線程占據(jù)時,則在分配指令/例行程序的執(zhí)行期間,非閑置的Temp位置(由于它們的指令還沒有消耗它們)將和正在切換的33其余的舊的線程上下文一起,在存儲器中進(jìn)行保存/存儲。當(dāng)帶回該舊的線程上下文來繼續(xù)執(zhí)行時,需要回復(fù)和載回這些Temp數(shù)據(jù)。這將考慮到意料之外的上下文切換的執(zhí)行(例如,在對異常句柄的調(diào)用或系統(tǒng)調(diào)用時)。Chain類似于Temp,但具有兩個不同Chain是相對于只一個的位置序列;第二是無論具有多少要件"位置",整個Chain都用一個標(biāo)記進(jìn)行標(biāo)記。通過使用類似于Temp的分配指令/例行程序,來分配Chain。類似地,當(dāng)執(zhí)行該分配指令時,如果在緩存/緩沖區(qū)中沒有針對Chain的新的線程空間可以指定給新的線程Chain,則檢查該特定Chain要件以找到哪些已經(jīng)釋放(由于它們的消耗指令已經(jīng)使用了它們),將沒有釋放的那些保存到存儲器并且新的線程Chain可以使用那些空間。Chain允許在一列預(yù)取/加載指令和消耗指令之間創(chuàng)建1對1的映射,以允許獲得類似于具有可變名稱號碼的寄存器(例如,R(i))的效果。這在循環(huán)內(nèi)部訪問陣列是有作用的,其中,在遠(yuǎn)遠(yuǎn)先于消耗指令在循環(huán)中需要值之前Chain可以在循環(huán)內(nèi)部開始對值進(jìn)行預(yù)取,而沒有產(chǎn)生寄存器壓力??梢允褂镁彺婕軜?gòu)或緩存緩沖區(qū)來存儲這些Temp和Chain要件。圖13以亂序執(zhí)行的方式示出了對于這種概念的實施。在這里,我們再一次示出指令調(diào)度器/塊緩沖區(qū)1304以及轉(zhuǎn)發(fā)繼承向量。一旦分配了Chain,則它在繼承向量中具有重置為0的它的寫計數(shù)器1300。對于通過加載而到Chain的每個新的指定,寫計數(shù)器增加并且從而寫到Chain要件的每個指令中的目的地要件將得到這個新增加的號碼,例如,在3個指定將3個寄存器位置加載到緩存緩沖區(qū)之后,計數(shù)器的值將會為3個1301。在循環(huán)代碼內(nèi)部和對于每個循環(huán)迭代,通過每個Chain加載指令,寫計數(shù)器將繼續(xù)增加;加載到Chain中的這些展開的動態(tài)指令將具有這些增加的號碼。在消耗指令方面,具有讀計數(shù)器1303,當(dāng)遇到從Chain要件讀取的每個消耗指令時,讀計數(shù)器1303也保持增加。例如,引用ChainO來讀取其第一要件的第一指令將讀計數(shù)器從0增加到1,隨后,從Chain讀取的下一個消耗指令將計數(shù)器增加到2并且因而它知道它需要從Chain0第二要件讀取。在沒有真正依賴于實際的加載地址下,寫計數(shù)器和讀計數(shù)器的方案確保在Chain要件的加載和它們的消耗指令之間的隱含的同步。這將具有可變寄存器索引(例如,R(i))的類似效果。圖13.b示出在緩存或緩沖區(qū)1351中的項(例如示出為1350的Temp16)如何依靠由編譯器/硬件插入的分配指令1352來動態(tài)地指定給Temp和Chain。在圖中,將ChainA指定給硬件Chain0、1、2、3(其中每個在緩沖區(qū)中均具有4個位置,通過結(jié)合它們的存儲1353,因而總共給ChainA分配16個單位)。在圖中還示出了Chain和Temp的存儲如何覆蓋在彼此的上面,從而可以將存儲在同時指定給一個或其他。圖14所描述的機(jī)制使用地址寄存器,來提供亂序執(zhí)行以對存儲器地址進(jìn)行計算,而不需要過多的存儲空間來重命名那些地址寄存器。該方案利用下述事實地址寄存器一般通過增加或減少它們來更新1400,而可以通過增加和按比例縮放多個這種地址寄存器來構(gòu)建完整的寄存器地址以形成完整地址(例如,將基本寄存器添加到索引寄存器并且使用縮放比例因數(shù)和偏移量)。方案使用硬件調(diào)度器/指令桶緩沖區(qū)1401以及繼承向量1402來存儲增加/減少計數(shù)器1403,g卩,每次地址寄存器增加或減少時,繼承向量記錄進(jìn)行那個更新的指令/桶,并且在調(diào)度器/桶緩沖區(qū)內(nèi)部對增加/減少事件的計數(shù)器1403進(jìn)行追蹤。每個地址寄存器的名稱只有一個實際的物理地址寄存器,(所以不存在多個物理寄存器,可以如同在一般重命名的方案中所使用的那樣,來指代相同寄存器名稱)。為了加載其他的值或者進(jìn)行更新而不是增加或減少寄存器地址,則必須使用常規(guī)的數(shù)據(jù)寄存器(因為它們是重命名的并且可以存儲寄存器名稱和值的多個版本)。當(dāng)執(zhí)行這樣的引入的更新指令時,將數(shù)據(jù)寄存器的拷貝發(fā)送給一個地址寄存器,并且隨后,如描述的那樣可以使用繼承向量來增加或減少地址寄存器,以對更新進(jìn)行追蹤。圖15擴(kuò)展了加載的用法,以允許對傳送較早存儲指令1500的數(shù)據(jù)進(jìn)行推測的預(yù)取/加載(它們以程序順序先于加載而存儲)。方案在Temp指定指令1503(預(yù)取/加載指令)中使用限定符。該Temp指定/預(yù)取指令將數(shù)據(jù)帶入到緩存中的臨時位置,它對地址沒有執(zhí)行任何次序檢查(發(fā)現(xiàn)id,加載的地址與還沒有執(zhí)行的存儲的那個進(jìn)行匹配。進(jìn)行這個次序檢査來阻止所述加載從存儲器帶進(jìn)數(shù)據(jù),所述存儲器還沒有由在序列執(zhí)行中先于加載的存儲更新)。當(dāng)消耗指令1504執(zhí)行時進(jìn)行順序檢查,此時,如果順序檢査發(fā)現(xiàn)預(yù)取的地址正在從在前的存儲的相同地址上加載,則消耗指令1504將使用繞過機(jī)制(bypassmechanism)來得到存儲的值而不是Temp的值。通過為匹配的地址檢驗存儲緩沖區(qū),可以將繞過機(jī)制隨著次序檢查處理來實施,該處理執(zhí)行為消耗指令1504的執(zhí)行階段的部分,并且如果發(fā)現(xiàn)了針對在Temp指令加載來自存儲器的數(shù)據(jù)之后執(zhí)行的較早的存儲指令的那個,則該存儲的值將會繞到消耗指令而不是Temp的值。可以通過使用相同線程控制預(yù)測來在存儲指令前面預(yù)測地執(zhí)行消耗指令自身,通過對次序檢査發(fā)布和有條件的執(zhí)行預(yù)取/加載線程,在圖11中論述了所述相同線程控制預(yù)測,當(dāng)先前存儲1500執(zhí)行時,明確地或者隱含地執(zhí)行所述次序檢查。在本發(fā)明的描述中,通過示例示出使用了Temp、Chain、和指令桶的實施方案,通??梢詫⒈疚拿枋龅姆桨笐?yīng)用到加載或簡單指令上。而且,所示的同步和一致方案并不僅僅應(yīng)用到分布式緩存或單獨地址寄存器文件上,還可以將它們使用在不同處理器之間的集中緩存中,并且還可以部分地或通過對方案進(jìn)行輕微修改來使用它們。本發(fā)明的一個實施例涉及具有計算機(jī)可讀介質(zhì)的計算機(jī)存儲產(chǎn)品,所述計算機(jī)可讀介質(zhì)上有計算機(jī)代碼,以進(jìn)行各種計算機(jī)實施的操作。該介質(zhì)和計算機(jī)代碼可以是為了本發(fā)明的目的而專門設(shè)計和構(gòu)建的,或者它們可以是公知的并且對計算機(jī)軟件領(lǐng)域的技術(shù)人員來說是可得到的。計算機(jī)可讀介質(zhì)的示例包括但不限于諸如硬盤、軟盤、磁帶之類的磁介質(zhì);諸如CD-ROM、DVD和全息裝置之類的光介質(zhì);磁-光介質(zhì);以及專門配置為存儲和執(zhí)行諸如專用集成電路("ASIC")、可編程的邏輯裝置("PLD")以及ROM和RAM裝置之類的程序代碼的硬件裝置。計算機(jī)代碼的示例包括諸如由編譯器等產(chǎn)生的機(jī)器代碼,以及包含更高級別代碼的文件,所述更高級別代碼通過使用解釋器由計算機(jī)來執(zhí)行。例如,可以使用Java、C++、或者其他面向?qū)ο蟮某绦蛘Z言和開發(fā)工具來實施本發(fā)明的實施例??梢允褂糜布崿F(xiàn)的電路代替或結(jié)合機(jī)器可執(zhí)行的軟件指令,來實施本發(fā)明的另一個實施例。用于解釋目的的上文描述使用了具體的術(shù)語來提供對于本發(fā)明的全面理解。然而,對本領(lǐng)域技術(shù)人員顯而易見的是,實施本發(fā)明無需這些具體的細(xì)節(jié)。因而,將本發(fā)明的具體實施例的上文描述表示為示例和描述的目的。其目的并不在于窮舉舉例或是將本發(fā)明限制到所公開的準(zhǔn)確形式;顯然,可以根據(jù)上面的教誨來進(jìn)行各種修改和變化。為了最佳地解釋本發(fā)明的主旨和其實際的應(yīng)用,來選擇和描述實施例,因此它們使本領(lǐng)域的其他技術(shù)人員能夠最佳地使用本發(fā)明和各個實施例來進(jìn)行各種修改,以適合所預(yù)期的特定使用。由所附權(quán)利要求和其等價物來限制本發(fā)明的范圍。權(quán)利要求1、一種多線程架構(gòu),其包括多個線程寄存器,其存儲對應(yīng)的多個線程上下文;以及在所述多個線程寄存器之間的線程間通信電路,用于支持線程通信和同步。2、一種多線程架構(gòu),其包括-寄存器集;執(zhí)行單元集;電路,其用于調(diào)整所述寄存器集和執(zhí)行單元集,來支持指令級別并行以及軟件線程和硬件生成線程的執(zhí)行。3、如權(quán)利要求2所述的多線程架構(gòu),其中,所述電路對標(biāo)志位進(jìn)行處理來鎖定一組指令的執(zhí)行。4、如權(quán)利要求3所述的多線程架構(gòu),其中,所述一組指令是從SIMD、MIMD、VLIW、以及ULIB格式中選擇的。5、如權(quán)利要求3所述的多線程架構(gòu),其中,將所述一組指令用作組級別上的相關(guān)性追蹤和解決的虛擬引用。6、一種多線程架構(gòu),其包括寄存器文件集,其可被配置為包括上下文標(biāo)識,而沒有為每個上下文指定單獨的寄存器文件。7、一種多線程架構(gòu),其包括執(zhí)行桶;以及寄存器文件層級,其被配置為支持臨近所述執(zhí)行桶的高帶寬小容量的寄存器文件、以及從所述執(zhí)行桶移除的低帶寬大容量的寄存器文件。8、一種上下文切換架構(gòu),其包括上下文切換電路,其支持當(dāng)前狀態(tài)信息的獲取;以及上下文存儲機(jī)制,其被配置為同時存儲一部分所述當(dāng)前狀態(tài)信息以及一部分先前狀態(tài)信息,以增加地切換上下文。9、如權(quán)利要求8所述的上下文切換架構(gòu),其中,所述上下文存儲機(jī)制是后進(jìn)先出(LIFO)電路。10、一種多線程架構(gòu),其包括多個線程寄存器,其存儲對應(yīng)的多個線程上下文;以及在所述多個線程寄存器之間的線程間通信電路,用于支持線程通信和同步。全文摘要用于復(fù)雜指令格式的動態(tài)生成、執(zhí)行、同步以及并行的統(tǒng)一架構(gòu)包括虛擬寄存器文件、寄存器緩存以及寄存器文件層級。自生成和同步動態(tài)和靜態(tài)線程的架構(gòu)提供了高效的上下文切換。文檔編號G06F9/30GK101627365SQ200780046679公開日2010年1月13日申請日期2007年11月14日優(yōu)先權(quán)日2006年11月14日發(fā)明者M(jìn)·阿卜杜拉申請人:索夫特機(jī)械公司