欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

用于將順序程序分解為多個線程、執(zhí)行所述線程和重構(gòu)該順序執(zhí)行的系統(tǒng)、方法和裝置的制作方法

文檔序號:6595121閱讀:193來源:國知局
專利名稱:用于將順序程序分解為多個線程、執(zhí)行所述線程和重構(gòu)該順序執(zhí)行的系統(tǒng)、方法和裝置的制作方法
技術領域
本發(fā)明的實施例總體上涉及信息處理領域,并且更具體地說,涉及在計算系統(tǒng)和微處理器中的多線程執(zhí)行領域。
背景技術
在過去幾十年間,通過對指令級并行性(ILP)的使用,單線程處理器已經(jīng)表現(xiàn)出顯著的性能提高。然而,這種并行性有時難以使用并且需要復雜的硬件結(jié)構(gòu),而復雜的硬件結(jié)構(gòu)可能導致過高功耗和設計復雜性。此外,復雜性和功率的這種增加使得回報越來越小。 芯片多處理器(CMP)已經(jīng)成為前景看好的替代品,以在合理的功率預算下提供進一步的處理器性能提高。


在附圖中以示例的方式而非限制的方式說明了本發(fā)明的實施例,在附圖中相同的標記指示相同的元件,并且在附圖中圖1是說明細粒度多線程化系統(tǒng)的至少一個實施例的硬件和軟件元件的框圖。圖2說明了使用SpMT的示例性流程。圖3說明了由四個基本塊構(gòu)成的小循環(huán)的示例性細粒度線程分解。圖4說明了要在兩個處理核心中運行的兩個線程的示例,其中它們間具有示出為數(shù)據(jù)依賴圖(“DDG”)的兩個數(shù)據(jù)依賴。圖5示出了當考慮控制流時線程劃分結(jié)果的三個不同示例。圖6說明了一些實施例的分解方案的概述。圖7說明了用于在優(yōu)化器中使用細粒度SpMT生成程序代碼的方法的實施例。圖8說明了示例性多層圖。圖9說明了粗化方法的實施例。圖10說明了粗化方法的偽代碼表示的實施例。圖11說明了正在被提交到FIFO隊列中的線程的實施例。圖12說明了用于確定用于優(yōu)化區(qū)域的POP標記的方法的實施例。圖13說明了使用具有集合活動(hammock)的循環(huán)的示例。圖14說明了用于使用POP標記來重構(gòu)流的方法的實施例。圖15是說明在其上可以使用線程排序重構(gòu)機制的實施例的多核心系統(tǒng)的實施例的框圖。圖16說明了在協(xié)作模式中工作的區(qū)塊(tile)的示例。圖17是說明根據(jù)本發(fā)明的至少一個實施例的、支持推測多線程化的示例性存儲器層級的框圖。圖18說明了當一存儲指令在優(yōu)化模式中全局地引退時要進行的動作的方法的實施例。圖19說明了當一加載指令將在優(yōu)化模式中全局地引退時要進行的動作的方法的實施例。圖20說明了 ICMC的實施例。圖21說明了檢查點機制的ROB的至少一個實施例。圖22是說明寄存器檢查點硬件的至少一個實施例的框圖。圖23說明了使用檢查點的實施例。圖M說明了使用線程級重構(gòu)的微處理器的實施例。圖25說明了在其中可以使用本發(fā)明的一個實施例的前端總線(FSB)計算機系統(tǒng)。圖沈示出了根據(jù)本發(fā)明的一個實施例的系統(tǒng)的框圖。圖27示出了根據(jù)本發(fā)明的實施例的系統(tǒng)實施例的框圖。圖觀示出了根據(jù)本發(fā)明的實施例的系統(tǒng)實施例的框圖。
具體實施例方式本發(fā)明的實施例涉及用于將順序程序分解為多個線程或執(zhí)行流、并行地執(zhí)行它們和重構(gòu)該順序執(zhí)行的技術。例如,本文描述的一些實施例允許在指令被任意地分配給多個線程時重構(gòu)指令的順序次序。因此,本文描述的這些實施例可以與將順序程序分解為多個線程或執(zhí)行流的任意技術一起使用。特別地,本文可以使用它們來重構(gòu)已經(jīng)以指令粒度被分解為推測線程的應用程序的順序次序。推測多線程化是一種并行化技術,其中將順序代碼段分解為要在不同核心或相同核心的不同邏輯處理器(功能單元)中并行執(zhí)行的線程。推測多線程化(“SpMT”)可以使用多個核心或功能單元來提高單個線程性能。SpMT支持的線程可以取決于運行時條件而被原子地提交或銷毀(squash)。盡管下文在運行于不同核心上的線程的環(huán)境下進行討論,但是本文討論的概念也適用于類似推測多線程化的執(zhí)行。即,本文討論的概念也適用于在相同核心的不同SMT邏輯處理器上運行的推測線程。細粒度SpMT范例推測多線程化使用多個核心來提高單個線程性能。它支持的線程可以取決于運行時條件而被原子地提交或銷毀。在傳統(tǒng)的推測多線程化方案中,每一個線程執(zhí)行一大塊連續(xù)指令(例如,循環(huán)迭代或函數(shù)調(diào)用)。概念上,這相當于將動態(tài)指令流劃分成多個塊并且并行地執(zhí)行它們。然而,這種劃分可能最終在線程間有太多依賴,這限制了可使用的TLP并且損害性能。在細粒度SpMT中,可以以比傳統(tǒng)線程化方案中更細的粒度將指令分布在線程中。在該意義上,該新的模型是先前線程化范例的超集并且其能夠比傳統(tǒng)方案更好地使用 TLP。下文描述的是使用靜態(tài)或動態(tài)優(yōu)化器的推測多線程化范例的實施例,其中,所述靜態(tài)或動態(tài)優(yōu)化器使用多硬件環(huán)境(即,處理核心)來加速單線程應用程序。與其中大塊的連續(xù)指令被分配給線程的傳統(tǒng)線程化技術相比,順序代碼或動態(tài)流以非常細的粒度(單獨指令級)被分解為多個推測線程。該靈活性允許在順序應用程序上使用TLP,而傳統(tǒng)劃分方案最終具有可能限制性能的許多線程間數(shù)據(jù)依賴。這還可以提高線程的工作平衡和/或增加可以使用的存儲器級并行性的量。在存在線程間數(shù)據(jù)依賴的情況下,描述了用來管理它們的三種不同途徑1)使用顯式線程間通信;2)使用預計算片(復制的指令)來在本地滿足這些依賴;和/或3)忽略它們,推測沒有依賴并且允許硬件檢測可能的違反(violation)。在該細粒度線程化中,線程中的控制流被本地管理并且僅需要包括線程中影響其被分配的指令的執(zhí)行的那些分支指令。因此,核心前端不需要任何額外的硬件來處理線程的控制流或管理分支指令誤預測, 并且每一個核心獨立地取得、執(zhí)行和提交指令(除了由顯式線程間通信引起的同步點)。圖1是說明細粒度多線程化系統(tǒng)的至少一個實施例的硬件和軟件元件的框圖。原始線程101被送入包括用于線程生成103的一個或多個模塊的軟件,諸如編譯器、優(yōu)化器等。由一個或多個模塊將線程或其區(qū)域分解為多個線程105。每一個線程將在其自己的核心/硬件環(huán)境107上被執(zhí)行。這些核心/環(huán)境107耦合到若干不同的邏輯部件,例如用于重構(gòu)原始程序次序或其子集的邏輯109、用于存儲器狀態(tài)的邏輯111、用于寄存器狀態(tài)的邏輯113和其它邏輯115。圖2說明了使用SpMT的示例性流程。在201,由編譯器、優(yōu)化器或其他實體接收順序應用程序(程序)。該程序可以是可執(zhí)行代碼或源代碼形式。在203,順序應用程序的至少一部分被分解為構(gòu)成一個或多個優(yōu)化區(qū)的細粒度線程。下文描述了該分解的實施例并且其可以由編譯器、優(yōu)化器或其他實體執(zhí)行。在205,正常地執(zhí)行該順序應用程序。在207確定應用程序是否應當進入優(yōu)化區(qū)。 通常地,孵化(spawn)指令表示優(yōu)化區(qū)的開始。例如由編譯器在程序執(zhí)行之前正常地添加該指令或等價物。如果代碼應當正常地處理,那么在205進行處理。然而,如果存在孵化指令,那么為優(yōu)化區(qū)創(chuàng)建一個或更多線程,并且在209以協(xié)作(推測多線程化)模式執(zhí)行程序直到在 211確定優(yōu)化區(qū)完成為止。在213,當優(yōu)化區(qū)完成時,將其提交,并且繼續(xù)應用程序的正常執(zhí)行。細粒度線程分解細粒度線程分解是從順序代碼或動態(tài)流中生成線程,從而將單獨指令靈活地分布在其中。這可以在編譯時由動態(tài)優(yōu)化器實現(xiàn)或靜態(tài)地實現(xiàn)。圖3說明了由四個基本塊(A、B、C*D)構(gòu)成的小循環(huán)的示例性細粒度線程分解。 每一個基本塊由標記為Ai、Bi、Ci和Di的若干指令組成。附圖左側(cè)示出了循環(huán)的原始控制流圖(“CFG”),和當其在一環(huán)境中隨時間被執(zhí)行時的一段動態(tài)流。附圖的右側(cè)示出了一種可能的細粒度線程分解的結(jié)果,即被分解為兩個線程,每一個線程具有其自己的環(huán)境。在該圖中示出了每一個結(jié)果線程的CRi和當并行執(zhí)行它們時每一個的動態(tài)流。該線程分解比傳統(tǒng)方案更加靈活,在傳統(tǒng)方案中將大塊指令分配給線程(典型地,傳統(tǒng)線程化方案將循環(huán)迭代分配給每一個線程)。雖然在圖3中將循環(huán)示出為示例,但是細粒度線程分解是與任何高級代碼結(jié)構(gòu)不相關的,并且可以應用到任何一段順序代碼或動態(tài)流。這種在線程中分布單獨指令的靈活性可以用來實現(xiàn)用于生成它們的不同策略??梢杂兄陧樞虼a或動態(tài)流的線程分解并允許使用更多線程級并行性的一些策略包括但不限于以下策略中的一個或多個1)將指令分配給線程以最小化線程間數(shù)據(jù)依賴的量;2) 將指令分配給線程以平衡其工作負荷(細粒度線程分解允許工作負荷的細調(diào),因為可以在指令級作出平衡線程的決定);以及3)可以將指令分配給線程以更好地使用存儲器級并行性(“MLP”)。MLP是用于存儲器限制的應用程序的并行性的來源。對于這些應用程序,MLP 的增加可以帶來性能上顯著的提高。細粒度線程分解允許在線程中分布加載指令以便增加 MLP。線程間數(shù)據(jù)依賴管理推測多線程化范例的一個問題是對線程間數(shù)據(jù)依賴的處理。下文描述了用來解決線程間數(shù)據(jù)依賴的兩種機制1)預計算和2、通信。第一種機制是使用預計算片(簡稱“pslice”)來斷開線程間數(shù)據(jù)依賴并在本地滿足它們。例如,給定分配給線程Tl、需要由線程T2生成的數(shù)據(jù)的指令“I”,將還沒有分配給 Tl的、屬于其pslice的所有需要的指令(生成I需要的數(shù)據(jù)所需的指令的子集)復制(復寫)到Tl中。在本文中這些指令稱為被復制的指令。這些被復制的指令被視為常規(guī)指令并且可以與分配給線程的其余指令一起調(diào)度。因此,在推測線程中,被復制的指令與其余指令混合并且可以被重排序以最小化線程的執(zhí)行時間。此外,預計算一值不意味著復制屬于其 pslice的所有指令,因為計算該值所需的一些中間數(shù)據(jù)可以在不同的線程中被計算并且可以如下文所解釋的那樣被傳送。第二種是通過顯式的線程間通信來解決依賴,其中這些依賴(i)可能需要太多被復制的指令來在本地滿足它們或(ii)可以延遲一定的周期量而不損害執(zhí)行時間。這減少了必須復制的指令量,但是(至少在接收機指令中)引入了針對每一個顯式通信的同步點。圖4說明了要在兩個處理核心中運行的兩個線程的示例,其中它們間具有示出為數(shù)據(jù)依賴圖(“DDG”)的兩個數(shù)據(jù)依賴。然而,本領域技術人員將認識到,本文描述的重排序?qū)嵤├梢耘c涉及分解為更大數(shù)量的線程和/或更大數(shù)量的在其上運行分解后的線程的核心或邏輯處理器的細粒度多線程化一起使用。在該圖中,圓圈是指令,箭頭表示兩個指令之間的數(shù)據(jù)依賴。在左側(cè)是原始順序控制流圖(“CFG”)和循環(huán)的順序執(zhí)行的示例性指令動態(tài)執(zhí)行流。在該CFG中,指令“b”和“d”具有與指令“a”的數(shù)據(jù)依賴。右側(cè)示出了針對左側(cè)的順序循環(huán)CFG的示例性線程分解。在以指令粒度將循環(huán)分解為兩個線程(在兩個線程中都復制指令Dl)后,創(chuàng)建了兩個CFG和兩個動態(tài)執(zhí)行流。這說明了用于兩個分解后的線程的分解后的控制流圖,并且還說明了并發(fā)執(zhí)行循環(huán)的分解后的線程的示例性可能的指令動態(tài)執(zhí)行流。為此假設孵化指令被執(zhí)行并且孵化程序(spawner) 和孵化(spawnee)線程開始取得和執(zhí)行其被分配的指令,而在兩個執(zhí)行流之間的沒有任何明確次序。右側(cè)說明知道屬于該示例中不同線程執(zhí)行流的兩個給定指令之間的次序不是無關緊要的。如能看到的,一個依賴通過在線程1中需要一個被復制的指令(“a”)的預計算片來解決,而另一個依賴通過(“h”和“f”之間)的顯式通信來解決。在運行時可能出現(xiàn)在線程分解時沒有預見的額外的依賴。實現(xiàn)細粒度SpMT的系統(tǒng)(硬件、固件、軟件和其組合)應當檢測這種依賴違反并且銷毀違反的線程并重啟它/它們的執(zhí)行。對于至少一個實施例,在硬件中進行從分解后的指令流來重構(gòu)順序執(zhí)行。對于一些實施例,由下文更詳細描述的核心間存儲器一致性模塊(Inter-Core Memory Coherence Module) (ICMC)執(zhí)行該硬件功能。
控制流管理當使用細粒度SpMT、以指令粒度將指令分布到線程以并行地執(zhí)行它們時,應當考慮和/或管理原始順序執(zhí)行的控制流。例如,當生成推測線程時可以由軟件來管理控制流。 這樣,使用細粒度SpMT的處理器前端不需要任何額外的硬件來處理細粒度SpMT線程的控制流或管理分支指令誤預測。相反,在其通過使用傳統(tǒng)預測和恢復機制來執(zhí)行的環(huán)境中,在本地管理給定線程的控制推測。在細粒度SpMT中,每一個線程包括其需要用來計算其指令的控制路徑的所有分支指令。執(zhí)行給定線程的任意指令所需要但不是原始地包括在該線程中的那些分支指令被復制。注意,并非所有分支指令在所有線程中都是需要的,僅影響其指令的執(zhí)行的那些分支指令是需要的。此外,在線程中具有分支指令不意味著也需要包括線程中計算該分支指令所需的所有指令,因為SpMT范例允許線程間通信。例如,一種可能的情形是,僅一個線程計算分支指令條件并且它會將該分支指令條件傳送到其余的線程。另一情形是,給定分支指令的控制流的計算被完全地分散在所有線程中。圖5示出了當考慮控制流時線程劃分結(jié)果的三個不同示例??刂屏髦猩婕暗闹噶畋煌怀?,并且箭頭示出了顯式的線程間通信。如能夠看到的,在所有三種情況中,分支指令 (原始代碼中的Bz LABEL)在需要它的所有線程(Tl和T2)中被復制。在單個控制流計算的情況(a)中,計算該分支指令的指令由T2執(zhí)行,并且結(jié)果被發(fā)送到Tl。在完整復制控制流的情況(b)中,該計算在兩個線程(Tl和T2)中被復制,并且不需要顯式通信。像程序中任意其他計算一樣劃分該分支指令的計算,從而其可以被拆分到顯式通信的不同線程中 (包括不真正關心該分支指令的線程)。該示例示出在控制流的拆分計算(c)中。對于至少一個實施例,順序代碼段可以是無法用傳統(tǒng)工具有效并行化的完整順序程序。對于至少一個其他實施例,順序代碼段可以是并行化應用程序的一串行部分。推測多線程化使得多核心架構(gòu)表現(xiàn)為能夠更快地執(zhí)行單線程應用程序的有效復雜度 (complexity-effective)很寬的核心。對于本文描述的至少一些實施例,假設原始的單線程應用程序或其部分已被分解為若干推測線程,其中這些線程的每一個執(zhí)行原始順序應用程序或其部分的全部工作的子集。這種分解可以例如由外部工具(例如,動態(tài)優(yōu)化器、編譯器等)執(zhí)行。從單線程程序生成多個推測線程其中將順序應用程序分解為推測線程的處理階段在本文中稱為“后期”(anaphase)。為了討論的目的,將假設這種分解在編譯時發(fā)生。然而,如上文所提及的, 這種分解可以經(jīng)由除了編譯器之外的其他外部工具(例如,動態(tài)優(yōu)化器)進行。為覆蓋應用程序的大部分執(zhí)行時間的那些區(qū)生成SpMT線程。在本部分,首先描述該模型中考慮的推測線程,然后描述相關聯(lián)的執(zhí)行模型,最后描述用于生成它們的編譯器技術。推測線程間可能出現(xiàn)線程間依賴。當另一個推測線程中需要一個推測線程中產(chǎn)生的值時,產(chǎn)生這些依賴??梢栽诰幾g時通過分析代碼和/或使用簡檔(profile)信息來檢測線程間依賴。然而,可能不是所有可能的依賴都在編譯時被檢測到,并且分解為線程的分解以推測方式執(zhí)行。對于至少一個實施例,硬件負責處理可能在運行時期間在分配給不同推測線程的兩個指令間出現(xiàn)的并且當編輯器生成線程時未考慮到的存儲器依賴。對于在編譯時識別的所有線程間依賴,在推測線程中生成適當?shù)拇a來處理它們。特別地,應用以下技術中的一種⑴通過顯式通信來滿足所述依賴;或( )通過預計算片(p-slice)來滿足所述依賴,所述預計算片是生成消耗的數(shù)據(jù)(“存活期” (live-in)) 所需的指令的子集。包括在P-slice中的指令可能需要被分配給多于一個線程。因此,推測線程可以包括被復制的指令,如圖3中的指令Dl的情況。最后,從控制流的角度看,每一個推測線程都是自包含的。這意味著每一個線程具有其需要用來解決其自身執(zhí)行的所有分支指令。注意,為了達到該目的,需要將影響線程指令執(zhí)行的那些分支指令放置在相同的線程上。如果一分支指令需要被放置在多于一個線程上,那么其被復制。這也由編譯器在生成線程時處理。關于執(zhí)行,如下文所說明的,以協(xié)作方式在多核心處理器上執(zhí)行推測線程。在圖6 中給出了一些實施例的分解方案的概述。為了該討論的目的,假設由兩個不同核心(例如參見圖15的區(qū)塊)或由相同或不同核心的兩個不同邏輯處理器并發(fā)執(zhí)行推測線程(對應于線程id 0( "tid 0”)和線程id 1( "tid 1”))。然而,本領域的技術人員將認識到,用于執(zhí)行一組原本為排序指令的并發(fā)執(zhí)行的區(qū)塊可以包括多于兩個核心。類似地,本文描述的技術可應用到每個核心包括多個SMT邏輯處理器的系統(tǒng)。如上所討論的,編譯器或類似實體檢測適于應用推測多線程化的特定區(qū)(在該說明中為區(qū)B 610)。然后該區(qū)610被分解為推測線程620、630,推測線程620、630被映射到應用程序代碼中其他位置,以作為區(qū)610的優(yōu)化版本640。在進入被優(yōu)化的區(qū)(區(qū)B 610)之前,將孵化指令650插入到原始代碼中。孵化操作創(chuàng)建新的線程,并且孵化程序和孵化推測線程二者開始執(zhí)行代碼的優(yōu)化版本640。對于示出的示例,孵化程序線程可以執(zhí)行一個推測線程(例如,620),而孵化線程可以執(zhí)行另一個 (例如,630)。當兩個推測線程處于協(xié)作方式時,當通過顯式通信滿足線程間依賴時,在線程間進行同步。然而,通信可能暗示僅使用者側(cè)進行同步,只要合適的通信機制被適當設置即可。常規(guī)存儲器或?qū)S眠壿嬁梢杂糜谶@些通信。另一方面,當處于協(xié)作模式時可能發(fā)生違反、異常和/或中斷,并且推測線程可能需要被回滾。這可以由硬件以對軟件線程完全透明的方式來處理,或通過包括一些額外代碼來在編譯時對其進行處理(例如,見回滾代碼660)。當兩個線程到達最后指令時,它們同步以退出優(yōu)化區(qū),推測狀態(tài)變?yōu)榉峭茰y,并且執(zhí)行以一個單線程繼續(xù)進行,區(qū)塊恢復到單核心模式。下文結(jié)合附圖15更詳細地描述本文所使用的“區(qū)塊”。一般地,區(qū)塊是工作來并發(fā)地執(zhí)行一組原本為順序指令的一組指令的不同部分的兩個或更多核心的組(其中,所述“不同”部分還可以包括被復制的指令)。推測線程通常在編譯時生成。這樣,編譯器負責(1)剖析應用程序,(2)分析代碼并且檢測代碼中最適宜進行并行化的區(qū),(3)將所選擇的區(qū)分解為推測線程;以及(4)生成優(yōu)化代碼和回滾代碼。然而,下文描述的技術可以應用到已經(jīng)編譯的代碼。另外,本文討論的技術可以應用到所有類型的循環(huán)以及非循環(huán)代碼。對于至少一個實施例,針對其生成推測線程的循環(huán)可以是展開的和/或頻繁執(zhí)行內(nèi)聯(lián)例程的。圖7說明了用于在優(yōu)化器中使用細粒度SpMT生成程序代碼的方法的實施例。在 701,接收或生成“原始”程序代碼。該程序代碼通常包括若干代碼區(qū)。在703,原始程序代碼用于生成數(shù)據(jù)依賴圖(DDG)和控制流圖(CFG)。可替換地,可以由優(yōu)化器接收DDG和ere。分析這些圖來查找將為多線程推測執(zhí)行的候選的一個或多個區(qū)。例如,“熱”(hot) 區(qū)可以指示SpMT將是有益的。作為該分析的一部分,通過其動態(tài)發(fā)生和在指令間出現(xiàn)的數(shù)據(jù)依賴(寄存器或存儲器)的次數(shù)來加權DDG中的節(jié)點(例如x86指令)和邊,并且通過所采取路徑的頻率來加權CRi中的控制邊。在705,將該簡檔信息添加到圖并且將兩個圖壓縮(collapse)成程序依賴圖(PDG)。在其他實施例中,所述圖不被壓縮。在一些實施例中,通過應用如代碼重排序、常量傳播、循環(huán)展開和例程專門化等的安全數(shù)據(jù)流和控制流代碼轉(zhuǎn)換來優(yōu)化PDG。在707執(zhí)行粗化(coarsening)。在粗化期間,將節(jié)點(指令)迭代地壓縮成更大的節(jié)點直到具有與所期望的劃分數(shù)量一樣多的節(jié)點為止(例如,在兩個線程的情況中的兩個劃分)。粗化提供相對好的劃分。在粗化步驟中,通過將節(jié)點對壓縮成超節(jié)點直到最終圖具有與線程一樣多的超節(jié)點為止來迭代地減小圖大小,描述了到線程的指令的第一劃分。在該過程期間,在多層圖 (在圖8中說明了示例性多層圖)中創(chuàng)建不同層的超節(jié)點。來自給定層的節(jié)點包括來自其下層的一個或多個節(jié)點。這可以在圖8中看到,其中,層0的節(jié)點是單獨的指令。較粗的節(jié)點稱為超節(jié)點,并且術語節(jié)點和超節(jié)點在整個本說明書中是可互換的。此外,每一層以如下方式具有更少的節(jié)點底層包含原始圖(傳遞到算法的該步驟的圖)并且最高層僅包含與期望生成的線程一樣多的超節(jié)點。屬于一個超節(jié)點的節(jié)點將被分配給相同的線程。為此,在實施例中,在圖中的層i選擇一對節(jié)點來進行粗化并且在層i+Ι構(gòu)造包括這兩個節(jié)點的超節(jié)點。該示例可以在圖8中看到,其中層0的節(jié)點a和b被聯(lián)合來形成層1 的節(jié)點ab。重復該過程直到所有的節(jié)點都被投影到下一層或再沒有要壓縮的有效對為止。 當這發(fā)生時,只是在當前層還沒有壓縮的節(jié)點才被添加到下一層以作為新的超節(jié)點。這樣, 完成了新的層并且針對該新的層重復算法直到獲取了期望數(shù)量的超節(jié)點(線程)為止。當粗化所述圖時,對于至少一個實施例,將最高優(yōu)先級給予屬于關鍵路徑的那些指令的融合。在同等重要的情況下,可以將優(yōu)先級給予具有更大數(shù)量的共同祖先的那些指令。共同祖先的數(shù)量越多,連通性越強,并且因此通常更適合將它們?nèi)诤系较嗤€程中。另一方面,為了在線程中合適地分布工作負荷,極低的優(yōu)先級被給予以下的融合(1)彼此不 (直接地或間接地)依賴的節(jié)點;以及( 不良加載指令及其使用者。在剖析期間在L2高速緩存中具有很高未命中率的加載指令可以被認為是不良的。圖9說明了粗化方法的實施例。在920,創(chuàng)建多層圖,其中區(qū)的指令位于該多層圖的第一層,并且將多層圖的當前層設置為例如0的初始值。參考圖8,這是多層圖中的L0。在930判決劃分的數(shù)量是否大于期望的線程數(shù)量。例如,劃分的數(shù)量大于2 (將創(chuàng)建3個線程而不是2個)?如果已經(jīng)獲取了所述數(shù)量的劃分,那么粗化完成。然而,如果劃分的數(shù)量大于期望的數(shù)量,那么在940創(chuàng)建矩陣。再次參考圖8的例子,層0的劃分數(shù)量是9,因此將需要創(chuàng)建矩陣來創(chuàng)建下一層(Li)。在實施例中,矩陣的創(chuàng)建包括三個子例程。在971,初始化矩陣M并且將其值設置為0。根據(jù)節(jié)點之間的關系構(gòu)建矩陣M,其中矩陣位置M[i,j]描述節(jié)點i和j之間的關系比率,并且M[i,j] =M[j,i]。這個比率是范圍在0(最差比率)和2(最好比率)之間的值比率越高,兩個節(jié)點越相關。在被初始化為全0后,根據(jù)一組預定準則來填充矩陣M的單元。這種準則的第一個是檢測不良加載指令,所述不良加載指令是將很可能在高速緩存中經(jīng)常未命中并且因此影響性能的那些加載指令。在實施例中,確定未命中率高于閾值(例如,10%)的那些不良加載指令。具有不良加載指令的節(jié)點和其預計算片的形成有助于進行改善(晚些描述),以將這些加載指令建模為與其使用者相分離。因此,連接不良加載指令和使用者的數(shù)據(jù)邊被給予非常低的優(yōu)先級。在實施例中,這些節(jié)點的比率在矩陣M中被固定為0. 1(非常低的優(yōu)先級),而不管下面的松弛度(slack)和公共前驅(qū)評估。因此,對于矩陣M中被識別為不良節(jié)點的那些節(jié)點,其被給予值0. 1。在圖10中表示了該情況的實施例的偽代碼表示。在972,計算PDG的每一條邊的松弛度并且相應地更新矩陣M。松弛度是指令必須延遲其執(zhí)行而不影響總的執(zhí)行時間的自由度。為了計算該松弛度,首先,計算每一個指令的最早調(diào)度時間。對于該計算,只考慮數(shù)據(jù)依賴。此外,忽略不同迭代之間的依賴。在這之后, 用類似或相同的方式計算每一個指令的最晚調(diào)度時間。每一條邊的松弛度被定義為使用者和產(chǎn)生者節(jié)點分別的最早和最晚調(diào)度時間之間的差。這種方式下不具有松弛度的邊(控制邊和迭代間依賴)具有缺省松弛度值(例如,100)。由具有非常低松弛度的邊連接的兩個節(jié)點i和j被認為是關鍵路徑的一部分并且將被壓縮為具有更高優(yōu)先級。關鍵邊是具有松弛度為0的那些邊,并且那些節(jié)點的比率M[I,j] mm, i]被設置為最佳比率(例如,2. 0)。 在圖10中表示了該情況的偽代碼表示。在973,通過查看公共前驅(qū)來填充矩陣M的剩余節(jié)點。通過向后遍歷邊來計算每一個節(jié)點對(i,j)共享的前驅(qū)指令的數(shù)量。這幫助將依賴指令分配給相同線程和將獨立指令分配給不同線程。在實施例中,每一個節(jié)點對的前驅(qū)關系被計算為其祖先的交集和其祖先的并集之間的比率。以下等式定義了節(jié)點i和j之間的比率(R)函數(shù)P(i)和P(j)表示前驅(qū)i或j的集合,其包括節(jié)點i或j。在實施例中,通過其剖析的執(zhí)行頻率來加權P(i)中的每一個前驅(qū)指令,以給予對動態(tài)指令流具有更深影響的指令更高的重要度。該比率一定程度上描述了兩個節(jié)點有多相關。如果當向后遍歷圖時兩個節(jié)點共享節(jié)點的重要量,那么這意味著它們共享許多計算并且因此將它們映射到相同線程是有意義的。它們在矩陣M中應當具有大的關系比率。另一方面,如果兩個節(jié)點不具有公共前驅(qū),那么它們是獨立的并且是被映射到不同線程的良好候選。在存在重現(xiàn)的情況下,許多節(jié)點具有比率1. 0(他們共享所有的前驅(qū))。為了解決這些問題,比率被計算兩次,一次是正常計算,而第二次忽略不同迭代(重現(xiàn))之間的依賴。 最終比率是這兩個比率之和。這提高了所獲取線程化的質(zhì)量并且因此提高了性能。使用最終比率來填充矩陣M的剩余單元。圖10中表示了這種情況的偽代碼表示。注意,可以開啟/關閉這三個給出的準則中的任意一個以便生成良好的線程。當矩陣已在940被填充時,在950遞增當前層并且在960壓縮節(jié)點。該壓縮將節(jié)點對聯(lián)合為新的超節(jié)點。對于每一個節(jié)點對,如果該節(jié)點對滿足一條件集合,那么將他們進行壓縮。例如,在實施例中,對于給定的節(jié)點,針對壓縮的一個條件是節(jié)點i和j都沒有從先前層壓縮到當前層。在另一實施例中,M[i,j]的值應當最多比任意k的M[i,k] /Jn 5%, 并且最多比任意一個節(jié)點的M[l,j]小5%。換言之,有效對是具有高比率值的那些對,并且一個節(jié)點只能與最多比其最好選擇差5%的另一節(jié)點成為伙伴。不具有有效伙伴的那些節(jié)點被投影到下一層,并且一個節(jié)點在每層只能被壓縮一次。在壓縮之后,迭代過程返回到930處的對劃分數(shù)量的確定。隨著矩陣大小的減小,因為節(jié)點可以包含多于一個來自層0(原始節(jié)點位于其中) 的節(jié)點,所以層0的所有依賴被投影到其余層。例如,通過層0節(jié)點a和b以及節(jié)點b和c 之間的所有依賴來將圖8中層1的節(jié)點ab連接到節(jié)點Cd。因此,矩陣M在所有層自然地被填充。當完成粗化時,在709形成了多層圖。在實施例中,在711重評估和改善該多層圖。改善也是迭代過程,該迭代過程從最高層到最底層經(jīng)過多層圖的層,并且在每一層通過將一個節(jié)點移動到另一劃分來試圖找到更好的劃分??梢栽趫D8中看到移動的示例,其中在層2判決節(jié)點efg應當在線程0還是線程1。改善通過在粗化期間改善已經(jīng)找到的“良好”劃分來找到更好的劃分。在每一次改善嘗試中研究的劃分不僅包括分解后的指令,還包括每一個線程中用于允許其控制獨立執(zhí)行以及需要的所有通信和ρ-slice的所有必要分支指令。因此,編譯器是在改善過程中決定如何管理線程間依賴。在每一層,使用Kernighan-Lin(K-L)算法來改進劃分。K-L算法工作過程如下 對于層1的每一個超節(jié)點n,計算使用目標函數(shù)將η移動到另一線程tid的增益F (n, tid)。 將超節(jié)點從一個線程移動到另一個意味著移動屬于該超節(jié)點的所有層0的節(jié)點。然后,選擇和移動具有最高F(n,tid)的超節(jié)點。重復該過程直到所有的超節(jié)點都被移動為止。注意,一個節(jié)點不能被移動兩次。還注意,所有的節(jié)點均被移動,即使基于目標函數(shù),新的解決方案比先前的解決方案更糟糕。這使得K-L算法勝過本地優(yōu)化解決方案。在所有節(jié)點都被移動后,在該層完成了一輪操作。如果一層包含N個節(jié)點,那么一輪操作期間存在N+1個解決方案(劃分)每節(jié)點移動為一個解決方案再加上初始的一個解決方案。選擇這些解決方案中最優(yōu)的解決方案。如果最優(yōu)解決方案與初始解決方案不同 (即,最優(yōu)解決方案涉及移動至少一個節(jié)點),那么在同一層執(zhí)行另一輪操作。這是因為在當前層找到了更好的解決方案,因此在當前層探索其他可能的移動。注意,較高層中的移動拖動較低層中的節(jié)點。因此,當在層1找到解決方案時,該解決方案是層1-1的開始點。該方法的優(yōu)點是可以在上層找到好的解決方案,其中存在少量節(jié)點并且K-L算法表現(xiàn)良好。 在低層中,對于K-L而言經(jīng)常存在太多節(jié)點而不能從頭開始找到好的解決方案,但是因為算法從已經(jīng)是好的解決方案開始,所以低層的任務僅是提供細粒度提高。正常地,在高層獲取大部分增益。因此,如果期望的話,可以使用啟發(fā)式方法來避免遍歷低層以減少算法的計算時間。因此,在給定層,通過使用目標函數(shù)、移動過濾和查看線程間依賴來獲得益處或?qū)⒚恳粋€節(jié)點η移動到另一個線程。在實施例中,在用目標函數(shù)評估劃分之前,執(zhí)行移動過濾和線程間依賴評估。試圖移動給定層的所有節(jié)點是高代價的,尤其是當PDG中有許多節(jié)點時??梢允紫葘⒐?jié)點過濾為在提高線程間工作負荷平衡和/或減少線程間依賴方面具有更高影響的節(jié)點。為了提高工作負荷平衡,關注于可以幫助工作負荷平衡的前K個節(jié)點。通過將分配給給定線程的動態(tài)指令的最大估計數(shù)量除以分配給給定線程的動態(tài)指令的總數(shù)來計算工作負荷平衡,其中通過估計的動態(tài)指令的總數(shù)來向給定線程分配動態(tài)指令。線程之間的好的平衡可以是.5。前L個節(jié)點用來減少線程間依賴的數(shù)量。在實施例中,L和K是10。在評估通過一次移動得到的劃分之前,判決如何處理線程間依賴和是否應當復制一些指令,包括可能重新安排控制流。這些可以被顯示傳送,或者通過指令復制來預計算。 一些控制指令必須在線程中被復制,以使得所有需要的分支指令都在需要它們的線程中。在評估特定劃分之前,算法決定如何管理線程間依賴。它們可以通過以下方式來實現(xiàn)1)使用顯式的線程間通信(可以用顯式的發(fā)送/接收指令或由指令提示來標記通信并且(至少在接收者端)引入線程間的同步);幻使用預計算片來在本地滿足這些依賴(預計算片由在本地滿足依賴所需的最少指令構(gòu)成,并且可以將這些指令復制到其他核心中以避免所述通信);和/或3)它們被忽略,如果依賴很少出現(xiàn)那么推測沒有依賴,并且如果出現(xiàn)可能的違反那么允許硬件檢測可能的違反。傳送依賴是相對昂貴的,因為所傳送的值在產(chǎn)生者到達其對應核心的ROB的頭部時要經(jīng)過共享L2高速緩存(下文描述)。另一方面,過度復制指令可能最終會延遲推測線程的執(zhí)行并且還會影響性能。因此,為每一個線程間依賴選擇最合適的替換可能對性能具有影響。在實施例中,如果要復制的指令的加權量沒有超過特定閾值,那么可以肯定地作出預計算依賴的判決。否則,通過顯式通信來滿足依賴。在我們的實驗中已經(jīng)發(fā)現(xiàn)值500 是好的閾值,但是在其他環(huán)境和實施例中其他值可能更合適。給定線程間依賴,如果估計用來在本地滿足依賴的被復制的動態(tài)指令的量超過了閾值,那么算法可以決定顯式傳送該依賴。否則,可以構(gòu)造該依賴的p-slice,并將其復制在目標線程中。為了合適地定義每一個區(qū)的有效閾值,通過多層圖劃分方法改變復制閾值和外層循環(huán)的展開因素來生成若干替換劃分。然后,可以通過考慮預期加速來選擇最終代碼生成的最優(yōu)候選。選擇具有最大預期加速的候選。在預期加速相等的情況下,選擇在線程間提供更好指令平衡的替換。在改善期間,每一個劃分(線程化解決方案)必須被評估并與其他劃分進行比較。 目標函數(shù)估計該劃分在多核心處理器的區(qū)塊上運行時的執(zhí)行時間。在實施例中,為了估計劃分的執(zhí)行時間,使用通過剖析獲取的區(qū)的20,000個動態(tài)指令流。使用該指令序列,基于考慮數(shù)據(jù)依賴、線程間通信、發(fā)射寬度資源(issue width resource)和目標核心的ROB的大小的簡單性能模型,將執(zhí)行時間估計為最長線程。在713,改善的完成產(chǎn)生表示代碼區(qū)的優(yōu)化版本的多個線程。在715,在已經(jīng)生成線程之后,編譯器創(chuàng)建用于執(zhí)行這些線程的代碼。該生成包括在合適點插入孵化指令和映射屬于邏輯地址空間的不同區(qū)中的不同線程的指令,以及相應地調(diào)整分支指令偏移量。從分解后的指令流重構(gòu)順序執(zhí)行如上文所討論的,將原始單線程應用程序分解為若干推測線程,其中每一個線程執(zhí)行原始順序應用程序的全部工作的子集。盡管大部分時間可以并行地執(zhí)行生成的線程, 但是程序的并行化有時可能是不正確的,因為它是推測地生成的。因此,執(zhí)行這些線程的硬件應當能夠識別和從這些情形中恢復。這種硬件機制依靠緩沖來保持推測狀態(tài)(例如,使用顯式的緩沖器、擴展有額外狀態(tài)的存儲器層級等),并依靠邏輯來確定分配給線程的指令的順序次序。線程有效性和存儲器一致性需要確定/重構(gòu)推測多線程化執(zhí)行的順序次序。應當檢測和糾正影響程序結(jié)果的順序次序違反(線程有效性)。例如,加載操作讀取失效值,因為產(chǎn)生正確值的存儲操作在不同核心中執(zhí)行。附加地,外部設備和軟件應當看到推測線程的執(zhí)行,如同以順序次序執(zhí)行原始應用程序一樣(存儲器一致性)。因此,存儲器更新應當以與執(zhí)行原始單線程應用程序時的次序一樣的次序?qū)W(wǎng)絡互連可見。在一個實施例中,推測多線程化通過將全部迭代(或連續(xù)迭代的塊)分配給每一個線程來并行地執(zhí)行多個循環(huán)迭代。由一個核心在迭代i中執(zhí)行的孵化指令創(chuàng)建開始在另一核心中執(zhí)行迭代i+Ι的新線程。在該情況中,由孵化程序線程執(zhí)行的所有指令比由孵化線程執(zhí)行的那些指令更老。因此,重構(gòu)順序次序是直接的,并且以與線程被創(chuàng)建的次序相同的次序驗證線程。在使用細粒度推測多線程化的實施例中,以指令粒度將順序代碼分解為線程,并且可以將一些指令分配給多于一個線程(稱為被復制的指令)。在使用細粒度推測多線程化的實施例中,為了清楚的目的,假設要在兩個核心中運行的兩個線程,孵化指令被執(zhí)行, 并且孵化程序和孵化線程開始取得并執(zhí)行其被分配的指令,而在二者之間沒有任何顯式的次序。在圖3中示出了這種范例的示例,其中在左邊示出了原始順序CFG和可能的動態(tài)流, 在右側(cè)示出了可能的線程分解。注意,知道兩個給定指令之間的次序并非無關緊要的。本文中的實施例關注在細粒度推測線程化的假設下重構(gòu)存儲器指令的順序次序。 然而,這里介紹的描述可以外推到除了存儲器之外的為任何其他處理器狀態(tài)重構(gòu)順序排序。在并行執(zhí)行中,出于許多原因,包括支持處理器一致性、調(diào)試或分析程序,能夠重構(gòu)原始順序次序是有用的。用于進行此重構(gòu)的有成本效益的機制可以包括以下特征中的一個或多個1)將簡單POP標記(其可以僅是幾比特)分配給靜態(tài)指令的子集(不需要必須標記所有指令;僅標記對重構(gòu)期望次序重要的子集);和幻即使指令已經(jīng)被以很細的粒度(單獨指令級)分解到為多個線程,仍然重構(gòu)次序。如本文所使用的,“線程次序”是線程查看其自身被分配的指令的次序,以及“程序次序”是所有指令在原始順序流中看起來的次序??梢灾貥?gòu)線程次序,因為每一個線程按次序取得和提交其自身指令。因此,可以通過將由線程提交的所有指令放入到FIFO隊列(在圖11中說明的)中來滿足線程排序線程次序中最老的指令是在FIFO的頭部的指令,而最年輕的指令是在尾部的指令。這里,術語“次序”、“順序次序”和“程序次序”可交換地使用。將指令任意分配到線程在指令必須屬于至少一個線程的約束下在細粒度多線程化中是可能的。在存在被刪除的指令(由硬件或軟件優(yōu)化刪除的指令)的情況下,對本文討論方案的擴展是直接的,因為要重構(gòu)的程序次序是沒有這些被刪除的指令的原始次序。如圖11所示,可以通過具有切換件來重構(gòu)程序次序,所述切換件以由POP標記指定的次序選擇線程排序FIFO隊列。實際上,POP標記指示切換件應當在何時選擇哪個FIFO。 每一個FIFO隊列具有以線程次序分配給中線程的排序指令。通過將切換件從一個FIFO隊列移動到由POP標記編排的另一個隊列來以程序次序更新存儲器。在給定的時間點,用相應的FIFO隊列的第一個排序指令來更新存儲器。然后將該指令從其隊列中彈出,并且讀取其POP值以將切換件移動到指定的FIFO隊列。
應當知道第一個排序指令在順序程序次序中按次序所處的位置,以便提供開始點。POP指針可以描述下一個排序指令的特性,并且第一個指令不具有任何前驅(qū)排序指令。 對于至少一個實施例,該開始標記被編碼在寄存器中。可替換地,將第一個排序指令分配給靜態(tài)FIFO隊列。本領域的技術人員將認識到,用來定義第一個標記的許多其他實現(xiàn)在所描述的實施例的范圍內(nèi)。使用本文所描述的機制的實施例,可以以順序程序次序更新存儲器。然而,可以容易地將其他實施例擴展到其中通過將標記添加到靜態(tài)程序來實施具體順序的任何并行范例。對于各種實施例,標記排序指令的實體可以是編譯器、動態(tài)二進制優(yōu)化器(DBO) 或硬件塊。對于一些實施例,用于將由POP標記指定的線程的邏輯標識符映射到物理線程 (OS線程、硬件線程……)的實體可以是OS或硬件塊。如果在用戶級或OS級定義標記,那么它們將通過指令編碼的一部分為可見,或在對用戶可見的一塊硬件(存儲器、特定的用戶可見緩沖器等)中為可見。如果標記是由硬件定義的,那么假設該硬件知道程序的靜態(tài)控制流。因此,對于在硬件中定義標記的至少一些實施例,使用硬件/軟件混合方法來使用軟件向硬件通知控制流。在沒有控制流的代碼段中(例如,基本塊),可以確定存儲指令的次序。在程序次序中在分配給線程1的下一個存儲指令Sw之前的被分配給線程0的存儲指令Si將具有為1的POP,表示下一個排序指令已經(jīng)被分配給線程1。這些POP標記針對任何類型的代碼 (集合工作、循環(huán)……)標記合適的次序。用兩個POP標記分支指令,一個指示當采取分支指令時包含程序次序中下一個排序指令的線程,以及另一個指示當沒有采取分支指令時包含程序次序中下一個排序指令的線程。最后,不是所有的存儲指令和所有的分支指令都需要由POP標記,這取決于指令到線程的分配。通常,如果POP標記是指示從一個FIFO隊列到另一個FIFO隊列的改變的標記,那么只標記一些存儲指令和一些分支指令一如果不存在附在排序指令的POP值,那么這意味著下一個排序指令位于相同的FIFO隊列中(其已經(jīng)被分配給相同線程)。然而,對于期望對指令進行同類標記的一個或多個實施例,可以標記所有的排序指令。對于本文描述的示例性實施例,假設不需要標記所有的排序指令。這是標記所有排序指令的實施例的超集, 因為該示例性實施例需要更復雜的邏輯。應當注意,“偽”(fake)排序指令可以被設計為沒有架構(gòu)副作用??商鎿Q地,實施例可以使用確實有架構(gòu)副作用的“偽”排序指令,只要這些副作用在控制之中。例如,如果 rax不是對應基本塊中的存活期并且其在基本塊中被重定義,那么“偽”排序指令可以是像 "and rax, rax,,的指令。分配給多個線程的指令是如上文所討論的“被復制的指令”。可以以直接的方式處理對被復制的指令的管理。相同指令的單獨實例之間的次序是不相關的,只要相對于剩余排序指令維持該次序即可。因此,可以選擇這些實例間任何的任意次序。如果所需POP 標記的數(shù)量的確是個問題,則可以使用使所需POP標記的數(shù)量最小化的次序。例如,如果將指令I分配給線程0、1、2,那么這三個實例的有效次序是Ic^ Ip I2 (其中數(shù)字表示線程標識符)或12、I0,11,或任何其他次序,只要POP指針對于先前和即將到來的排序指令是正確的即可。
在優(yōu)化區(qū)的代碼生成期間,生成程序次序指針(POP)并且將其插入到優(yōu)化代碼中。在細粒度推測多線程化中,標記對重構(gòu)期望的順序次序有用的指令的相對次序。這些指令是“排序指令”。因為本發(fā)明的實施例嘗試重構(gòu)存儲器排序以正確地更新存儲器,所以存儲指令和分支指令是排序指令的示例??梢杂肗比特(其中,N=「k^2M],M是線程的數(shù)量)標記排序指令,所述N比特對線程ID進行編碼,以包含順序程序次序中的下一排序指令。POP標記可以作為指令提示與指令編碼在一起,或位于任何位置,只要系統(tǒng)知道如何將POP標記與指令進行映射即可。圖12說明了用于確定優(yōu)化區(qū)的POP標記的方法的實施例。在1201,解析該區(qū)的指令。該指令可以是優(yōu)化區(qū)的第一個指令或在該第一個指令之后出現(xiàn)的某個指令。在1203,確定該指令是否是排序指令。如果該指令不是排序指令,那么它將不接收 POP標記,并且確定這是否是優(yōu)化區(qū)的最后的指令。在一些實施例中,為所有指令創(chuàng)建POP 標記。如果指令不是最后的指令,那么在1209解析所述區(qū)的下一個指令。如果指令是排序指令,那么在1211,解析所述區(qū),以獲得該排序指令在順序次序中的下一個排序指令。在1213,確定該后續(xù)排序指令是否屬于不同線程。如果該后續(xù)排序指令的確屬于不同線程,那么在1217產(chǎn)生指示線程切換的POP標記,并且在1205確定該指令是否是線程的最后的指令。如果該后續(xù)排序指令不屬于另一線程,那么在1203找到的該先前的排序指令被標記為屬于相同線程。在一些實施例中,該標記為“X”,而在其他實施例中,該POP標記保持與先前排序指令相同。在一些實施例中,存在關于何時分配不同POP值的預置規(guī)則。例如,在一些實施例中,給定分配給線程Ti的存儲指令Si :1)如果在Si之后存在分配給線程L的存儲指令I, 其中二者之間沒有分支指令,Ti與L不同,那么將用POP值L標記Si ;2)如果在Si和分配給線程L的下一個分支指令B之間沒有其他存儲指令S,Ti與L不同,那么將用POP值Tj 標記Si ;以及3)其他情況,不需要標記存儲指令Si。在一些實施例中,給定分配給線程Ti的條件分支指令Bi 1)如果下一個排序指令 (其可以是分支指令或存儲指令)在該分支指令被采取時被分配給Tp Ti與L不同,那么用其采取的POP標記中的POP值Tj標記Bi,否則,不需要將采取的POP標記分配給Bi ;2)如果下一個排序指令(其可以是分支指令或存儲指令)在該分支指令沒有被采取時被分配給 Tj, Ti與Tj不同,那么用其的穿過(fallthru)POP標記中的POP值Tj標記Bi,否則,不需要將穿過POP標記分配給B”在一些實施例中,給定分配給線程Ti的無條件分支指令Bi,應用與條件分支指令相同的算法,但是只進行對采取的POP值的計算。在一些實施例中,給定Ti中的排序指令,其后是具有N條可能路徑P1……Pn且在其間沒有任何排序指令的間接分支指令,其中下一個排序指令屬于不同于Ti的線程L的路徑Pk將執(zhí)行Ti中具有POP值L的“偽”排序指令。偽排序指令是其唯一目的是保持排序一致性的指令。它可以是專門指令或一般操作碼,只要其不具有架構(gòu)副作用即可。圖13說明了使用具有集合活動的循環(huán)的示例。在該實施例中,可以重構(gòu)程序次序并且排序指令是存儲指令和分支指令。為了簡單,僅示出了排序指令,但是本領域的技術人員將認識到存在其他指令。圖13中說明的排序指令被標記以指示它們是被分配給線程0還是1。條件分支指令具有兩個POP標記,而存儲指令和無條件分支指令僅具有一個POP標記。POP標記“X”意味著該標記是不需要的。POP標記“? ”意味著未知,因為沒有示出完整的控制流。在右下部分,示出了在執(zhí)行循環(huán)兩次時如何重構(gòu)程序次序,每一個迭代沿著集合活動的不同路徑。為了簡單,假設代碼被分解為兩個線程,但是此機制意圖以任意數(shù)量線程工作,為POP標記提供了足夠的比特。此外,僅描述了排序指令。存儲指令S5被分配給兩個線程并且具有兩個POP標記。所有其他存儲指令具有一個POP標記。無條件分支指令也具有一個POP標記(采取的標記T)。條件分支指令具有兩個POP標記一個是采取的(T)以及一個是未采取的(NT)。第一個指令(存儲指令Si) 被分配給線程0并且具有為1的POP值,因為順序程序中下一個排序指令S2被分配給線程 1。存儲指令S3不需要POP值(因此為“X”),因為順序次序中的下一個排序指令被分配給相同線程0。因此,不需要編碼指示從一個FIFO隊列到另一個FIFO隊列的改變的標記。條件分支指令Bl不需要采取的POP值,因為在采取分支指令時下一個排序指令被分配給相同線程0。然而,Bl需要未采取的POP值,因為在不采取分支指令時下一個排序指令S6被分配給其他線程。在該情況下,標記是1。作為另一特定情況,存儲指令S5被分配給兩個線程 (它已經(jīng)被復制)。在該情況下,其兩個實例之間的次序是不相關的。在附圖中,通過不將 POP指針分配給線程0中的存儲指令S4和分別地將POP指針1和0分配給線程0和1中的 S5實例,線程0中的S5實例在線程1中的S5實例之前進行。然而,可以存在其他方式,但是POP值會不相同。圖13的右下部分說明了假設程序沿著由{基本塊A、B、C、E、B、D、E……}構(gòu)成的執(zhí)行流進行的情況下,如何通過使用POP指針將排序指令進行相關。在附圖的該部分,從框 X的中間離開的線表示“在執(zhí)行X中的指令之后”,而到達框X的開頭的箭頭線表示“在執(zhí)行 X中的指令之前”。該程序流包括運行循環(huán)兩次,其中經(jīng)過循環(huán)的每一次迭代沿著集合活動的不同路徑。因此,全局次序是 Si、S2、S3、Bi、S4、S5。、S5” B2、S7、S8、B4、S2、Bi、S6......。上文描述了標記已經(jīng)任意地分配給線程的存儲指令和分支指令以便按照合適順序程序次序更新存儲器的實施例。對于至少一個實施例,在指令級構(gòu)建分解后的線程,耦合核心的執(zhí)行以提高多核心設計中的單線程性能。下文詳細討論了支持在編譯時生成的線程的執(zhí)行的硬件機構(gòu)的實施例。這些線程產(chǎn)生于對原始應用程序的細粒度推測分解,并且它們在修改的多核心系統(tǒng)下執(zhí)行,所述修改的多核心系統(tǒng)包括(1)用于檢測線程間違反的機構(gòu);(2)用于重構(gòu)原始順序次序的機構(gòu);以及(3)用于處理誤推測的檢查點和恢復機構(gòu)。實施例通過以細粒度方式分解單線程應用程序來加速在多核心系統(tǒng)中的所述單線程應用程序。編譯器負責將來自單線程應用程序或并行應用程序的順序區(qū)的指令分布到可以在支持推測多線程化的多核心系統(tǒng)中并行執(zhí)行的線程中。本領域的技術人員將認識到,這可以擴展到重構(gòu)任何類型的次序給定的并行代碼。一些替代實施例包括但不限于1) 重構(gòu)控制流(排序指令僅有分支指令);2)重構(gòu)整個程序流(所有指令都是排序指令并且應當具有分配的POP標記);幻重構(gòu)存儲器流(分支指令、加載指令和存儲指令是排序指令);4)對并行程序的指令強制實施特定次序,以便對其進行驗證、調(diào)試、測試或調(diào)整(從已經(jīng)并行化的代碼開始,用戶/編譯器/分析工具將POP標記分配給指令,以在指令間強制實施特定次序并在每一點查看程序的該順序視圖的情況)。在圖14中說明了使用POP標記重構(gòu)流的方法的實施例。如上文所詳述的,用來重構(gòu)程序流的排序指令是存儲指令和分支指令。在1401,使用多個核心來推測地執(zhí)行程序。在該執(zhí)行期間,每一個線程的指令在其被分配到的線程中被本地引退,并且由MLC經(jīng)由ICMC 被全局引退。在1403,發(fā)現(xiàn)要求恢復或重構(gòu)流(程序、控制、存儲器等)的條件。例如,發(fā)現(xiàn)執(zhí)行優(yōu)化區(qū)的核心之間有不一致的存儲器值。當然,可以由于其他原因重構(gòu)流,例如不是在執(zhí)行期間發(fā)現(xiàn)的條件的微調(diào)。在1405,從合適的FIFO (這些FIFO在下文中稱為memFIFO或存儲器FIFO隊列,并且隨著程序的執(zhí)行而被填充)中獲取第一個(最老的)排序指令??梢杂缮衔拿枋龅囊环N方式來指示該指令的位置。使用前面討論的具有集合工作的循環(huán)作為例子,第一個指令是存儲指令si并且它屬于線程0。因為指令被引退,所以包括其POP值的指令被存儲在合適的FIFO中,或存儲在可由重構(gòu)流的機構(gòu)識別的另一位置。在1407,讀取該指令的POP值。再次參考圖4,存儲指令si的POP標記值是“1”。在1409,確定這是否是最后的排序指令。如果是,則流已經(jīng)被確定。如果不是,則在1411確定是否切換FIFO。如果POP值與先前獲取的指令的線程不同,那么進行切換。在前面的例子中,讀取值“1”指示下一個程序流指令屬于線程1,與存儲指令si所屬的線程0 不同。如果值是X,則它指示下一個程序流指令屬于相同的線程并且將沒有FIFO切換。在先前的例子中,這在存儲指令s3之后獲取分支指令而發(fā)生。如果要進行切換,那么選擇由POP值指示的FIFO,并且在1413讀取該FIFO中的最老的指令和其POP值。如果不進行切換,那么不切換FIFO并且在1415從FIFO中讀取下一個最老的指令。讀取指令和基于所讀取的POP值切換FIFO的過程繼續(xù)進行,直到重新創(chuàng)建了程序流或FIFO被耗完為止。在實施例中,如果FIFO被耗完,則從另一存儲位置(例如主存儲器)補充FIFO。在實施例中,通過使用流來確定重新開始執(zhí)行程序的位置來繼續(xù)程序的執(zhí)行。在一個實施例中,下文描述的ICMC執(zhí)行上面的方法。在另一實施例中,軟件例程執(zhí)行上面的方法。多核心推測多線程化處理器和系統(tǒng)的實施例圖15是說明在其上可以使用線程排序重構(gòu)機制的實施例的多核心系統(tǒng)的實施例的框圖。為了便于參考而進行了簡化,圖15的系統(tǒng)可以具有額外的元件,但是這些元件沒有在圖15中明確地說明。如上文所討論的,在細粒度SpMT生態(tài)系統(tǒng)中,程序被劃分為在一個或多個處理核心上執(zhí)行的一個或多個線程。這些處理核心分別處理一線程,并且合并該處理的結(jié)果以創(chuàng)建與如同該程序作為單個線程在單個核心上運行一樣的結(jié)果(但是所述劃分和/或并行執(zhí)行應當更快)。在由不同核心進行的這種處理期間,執(zhí)行的狀態(tài)是可推測的。當線程到達其最后的指令時,它們同步退出優(yōu)化區(qū),推測狀態(tài)變成非推測狀態(tài),并且執(zhí)行繼續(xù)以一個單線程繼續(xù)進行,區(qū)塊恢復為針對該程序的單核心模式。下文結(jié)合圖15更詳細地描述了本文使用的“區(qū)塊”。一般地說,區(qū)塊是工作來并發(fā)地執(zhí)行一組原本為順序指令的一組指令的不同部分的兩個或更多核心的組(其中,“不同”部分還可以包括被復制的指令)。圖15說明了邏輯地劃分為兩個區(qū)塊1530、巧40的多核心系統(tǒng)。對于至少一個實施例,系統(tǒng)的處理核心1520基于x86架構(gòu)。然而,處理核心1520可以是任何架構(gòu),例如PowerPC等。對于至少一個實施例,系統(tǒng)的處理核心1520執(zhí)行無序指令。然而,這種實施例不應當作為限制。本文討論的機制可以等同地應用到執(zhí)行有序指令的核心。對于至少一個實施例,區(qū)塊1530、巧40的一個或多個實現(xiàn)具有專用第一級寫透過數(shù)據(jù)(write-through) 高速緩存(“DCU,,)和指令高速緩存(“IC”)的兩個核心1520。這些高速緩存,IC和DCU, 可以通過拆分事務總線1560耦合到共享拷貝回(copy-back)L2高速緩存1550。最后L2高速緩存1550經(jīng)由另外的互連網(wǎng)絡1570耦合到主存儲器1580和其他區(qū)塊1530、巧40。L2高速緩存1550稱為MLC( “合并級高速緩存” (Merging Level Cache))并且是區(qū)塊的核心之間的共享高速緩存。對于圖15中說明的實施例,第一級共享高速緩存是二級高速緩存。在該合并級高速緩存處執(zhí)行處理核心(線程)之間的合并。然而對于其他實施例,L2高速緩存不需要必須是區(qū)塊的核心之間的合并級高速緩存。對于其他實施例,MLC可以是位于存儲器層級的任何級的共享高速緩存。對于至少一個實施例,圖15中說明的區(qū)塊1530、1540具有兩個不同的操作模式 單核心(正常)模式和協(xié)作模式。區(qū)塊中的處理核心1520在區(qū)塊處于單核心模式時執(zhí)行常規(guī)線程,并且在區(qū)塊處于協(xié)作模式時它們執(zhí)行來自同一分解后的應用程序的推測線程(每一個核心中一個線程)。應當注意,應當在具有所述線程的區(qū)塊的協(xié)作模式中執(zhí)行優(yōu)化代碼。因此,當這兩個線程開始運行優(yōu)化代碼時,孵化指令觸發(fā)核心從單核心模式到協(xié)作模式的轉(zhuǎn)換。當兩個推測線程在協(xié)作模式激活的區(qū)塊(例如,1530或1540)上運行時,它們之間的同步在必須通過顯式通信來滿足線程間依賴時發(fā)生。然而,通信可能暗示僅在使用者方進行同步。常規(guī)存儲器或?qū)S眠壿嬁梢杂糜谶@些通信。正常執(zhí)行模式或正常模式(或單模式)是指當一個處理核心正在執(zhí)行非推測多線程化代碼的同時,區(qū)塊中的另一處理核心處于空閑或在執(zhí)行另外的應用程序。例如,區(qū)塊 1530的處理核心0在執(zhí)行非推測多線程化代碼而核心1處于空閑。推測執(zhí)行模式或推測模式是指兩個核心協(xié)作來執(zhí)行推測多線程化代碼。在正常和推測模式中,每一個核心獨立地取得、執(zhí)行和引退指令。在推測模式中,以規(guī)則間隔采取檢查點(后面討論),以使得如果發(fā)現(xiàn)存儲器違反可以回滾到先前的一致狀態(tài)。在一個核心引退孵化指令(假設其他核心處于空閑,否則執(zhí)行恢復到正常狀態(tài)) 后,處理核心從正常模式轉(zhuǎn)換到推測模式。另一方面,在應用程序跳到還沒有分解為多個線程的代碼區(qū)或當檢測到存儲器違反時,處理核心從推測模式轉(zhuǎn)換到正常模式。當在一個核心中執(zhí)行的加載指令需要在另一核心中執(zhí)行的存儲指令生成的數(shù)據(jù)時發(fā)生存儲器違反。這發(fā)生的原因是系統(tǒng)不能保證分配給不同線程的指令的執(zhí)行間的次序。在出現(xiàn)存儲器違反時,由ICMC生成的消耗信號被傳播到所有的核心和高速緩存,狀態(tài)回滾到先前的一致狀態(tài)并且執(zhí)行恢復到正常模式。為了更新架構(gòu)存儲器狀態(tài)和檢查原始順序程序次序中可能的存儲器違反,進行原始程序次序的重構(gòu)。在實施例中,這通過下述方式來實現(xiàn)將每一個處理核心的所有在本地引退的存儲器指令放到對應的FIFO結(jié)構(gòu)中(這在下文更詳細地討論),并借助于一些指令標記以原始順序程序次序訪問和移除這些隊列中的頭指令。當指令在處理核心中引退時, 這意味著其是該處理核心中最老的指令并且將其放到其對應的FIFO的尾部(稱為本地引退)。存儲器層級不斷地獲取系統(tǒng)中最老的指令(位于任何一個FIFO的頭部)并且以順序
20程序次序訪問MLC和其相關聯(lián)的比特(稱為指令的全局引退)。圖16說明了在協(xié)作模式中操作的區(qū)塊的示例。在該附圖中,指令3和4正分別地在核心1和0中本地引退。ICMC已經(jīng)按程序次序全局地提交了指令0、1和2并且將相應地更新MLC。ICMC還將檢查存儲器違反。核心間存儲器一致性模塊(ICMC)支持分解后的線程,并且可以控制以下中的一個或多個1)分類存儲器操作以使得由分解后的應用程序進行的改變對其他區(qū)塊可見,如同其被順序地執(zhí)行一樣;幻識別在該區(qū)塊的核心上運行的線程之間的存儲器依賴違反;3) 管理存儲器和寄存器檢查點;和/或4)在發(fā)生誤推測、異常或中斷的情況下,觸發(fā)核心中的回滾機制。 對于至少一個實施例,ICMC對處理核心的干涉極少。因此,在處理協(xié)作模式中,核心大部分時間以去耦合方式從推測線程中取得、執(zhí)行和引退指令。然后,在指令引退之后將指令的子集發(fā)送到ICMC,以便進行對執(zhí)行的驗證。對于至少一個實施例,由ICMC考慮的指令集被限制為存儲器和控制指令。當在協(xié)作模式中執(zhí)行時,ICMC重構(gòu)已經(jīng)被任意地分配給推測線程的存儲器指令的原始順序次序,以便檢測存儲器違反和正確地更新存儲器。這種次序是由ICMC使用稱為程序次序指針(POP)比特的標記進行重構(gòu)的。POP比特由編譯器包括在存儲器指令和某些無條件分支指令中。用于推測多線程化的示例性存儲器層級圖17是說明根據(jù)本發(fā)明的至少一個實施例的支持推測多線程化的示例性存儲器層級的框圖。在操作的正常模式下(非推測),存儲器層級充當常規(guī)層級(即,傳統(tǒng)的存儲器層級協(xié)議(MESI或任何其他))、進行傳播以及根據(jù)需要使高速緩存行無效。圖17的層級包括一個或多個處理核心(核心1701和170 。層級的每一個處理核心具有在附圖中標示為“Li”的專用第一級數(shù)據(jù)高速緩存單元(DCU) 1705。處理核心還共享至少一個更高級的高速緩存。在所說明的實施例中,處理核心1701和1703共享第二級數(shù)據(jù)高速緩存1709和末級高速緩存“L3” 1711。層級還包括諸如主存儲器1713的存儲器和諸如硬盤、光學驅(qū)動器等的其他存儲設備。附加地,層級包括稱為核心間存儲器一致性模塊(ICMC) 1715的部件,其負責控制當區(qū)塊內(nèi)的核心在協(xié)作模式下執(zhí)行時這些核心的活動。 該模塊可以是電路、軟件或其組合。下面詳細地討論存儲器層級的這些示例性部件的每一個。數(shù)據(jù)高速緩存單元(D⑶)當在正常模式操作時,DCU是寫透過的并且作為常規(guī)Ll數(shù)據(jù)高速緩存進行操作。 在推測模式中,它們既不是寫透過的也不是寫回的,并且被取代的臟行被拋棄。此外,不傳播修改的值。這些從正常模式的改變允許版本化(versioning),因為合并和最終正確的值將會位于稍后將討論的合并級高速緩存(“MLC”)中。在實施例中,通過包括每行版本化比特(“V”)來擴展DOT,所述版本化比特僅在推測模式和在模式間轉(zhuǎn)換時使用。該比特標識在執(zhí)行當前推測多線程化代碼區(qū)時已經(jīng)被更新的行。取決于實現(xiàn),在推測模式中,當行被修改時,將其版本化比特設置為1以指示改變。 當然,在其他實現(xiàn)中,版本化比特值0可以用來指示與指示沒有改變的值1 一樣的情況。當從正常模式轉(zhuǎn)換到推測模式時,V比特被重置為指示沒有進行改變的值。當從推測模式轉(zhuǎn)換為正常模式時,將具有設置為指示改變的行的版本化比特的所有行修改為無效并且重置版本化比特。這種轉(zhuǎn)換在標記區(qū)的結(jié)束的指令全局地引退時或在由ICMC生成銷毀信號(下文討論銷毀信號)時發(fā)生。在推測模式中,每一個D⑶獨立地工作,并且因此每一個具有每段數(shù)據(jù)的可能版本。因此,不將修改的值傳播到更高級的高速緩存。MLC是在不同DCU高速緩存行值之間執(zhí)行合并所在的級,并且這遵循原始順序程序語義來進行,如前面部分所解釋的。當從推測模式轉(zhuǎn)換為正常模式時,有效行僅位于MLC。因此,在DCU中清理了推測行。將存儲操作發(fā)送到ICMC,ICMC負責當存儲操作全局地提交時以原始次序更新L2高速緩存。合并級高速緩存在實施例中,L2高速緩存1709充當作為處理核心之間的共享高速緩存的MLC。然而,對于其他實施例,L2高速緩存不需要必須是處理核心之間的合并級高速緩存。對于其他實施例,MLC是位于存儲器層級的其他級的共享高速緩存。如所說明的,通過包括每高速緩存行的推測(“S”)比特和每塊的兩個最后版本 (“LV”)比特(當然,對于更多處理核心將有更多LV比特)來從傳統(tǒng)的高速緩存擴展MLC。 塊是檢測兩個推測線程之間的存儲器歧義消除(并且因此,存儲器違反)的粒度。其范圍可以介于字節(jié)和行的大小之間,并且是精確度和區(qū)之間的權衡。S比特指示高速緩存行包括推測狀態(tài)。當執(zhí)行檢查點時其被清理并且如下文所討論的存儲器又安全了。另一方面,LV比特指示哪個核心執(zhí)行了對每一個塊的最后改變。例如,在一個實施例中,行的第一塊的LV值“01”指示核心1是對該塊執(zhí)行改變的最后核心。 當存儲指令全局地引退時設置這些比特,并且不清理它們直到轉(zhuǎn)換回正常模式為止(與在檢查點之間被清理的S比特相反)。按照原始程序次序執(zhí)行全局引退。此外,存儲指令被標記以識別它們是否被復制。這有助于確保系統(tǒng)能夠捕獲存儲器違反。缺省設置所有行的 LV比特為指示從任何核心進行的讀取都是正確的。圖18中說明了當存儲指令在優(yōu)化模式中全局地引退時要進行的動作的方法的實施例。在1801,確定存儲指令是否在MLC中未命中(即,為L2高速緩存未命中)。如果存儲指令是未命中,則在1803停止全局引退直到該行存在于MLC中行為止。如果存儲指令已存在于MLC中(或當該行到達MLC時),則在1805確定該行是否是臟的。如果它是具有非推測數(shù)據(jù)的臟的行(例如,S比特未設置),則在1807將行寫回到存儲器層級中的下一級。 否則,在1809修改數(shù)據(jù)并且將S比特設置為1。在1811確定存儲指令是否被復制。如果存儲指令未被復制,那么在1813,針對執(zhí)行存儲指令的核心將對應于每一個修改的塊的LV比特設置為1,并且針對其他核心將LV比特設置為0。如果存儲指令被復制,則在1815作出另一個確定。即,確定存儲指令是否是第一個拷貝。如果存儲指令被復制并且其是第一個拷貝,那么在1813,針對執(zhí)行存儲指令的核心將對應于每一個修改的塊的LV比特設置為1,并且針對其他核心將LV比特設置為0。如果存儲指令被復制并且其不是第一個拷貝,那么在1817,針對執(zhí)行存儲指令的核心將對應于每一個修改的塊的LV比特設置為1,并且其他核心保持不變。圖19中說明了當加載指令將在優(yōu)化模式中全局地引退時要進行的動作的方法的實施例。在1901,確定加載指令是否在MLC中未命中。如果它是未命中,那么在1903將填充請求發(fā)送到存儲器層級的下一級并且正確地全局引退加載指令。
如果它是命中,那么在1905確定是否有任何對應塊的LV比特是0。如果對于對應核心的這些LV比特中任意一個具有為0的值,那么這意味著該特定核心沒有生成數(shù)據(jù)的最后版本。因此,在1907生成銷毀信號,回滾狀態(tài),并且將系統(tǒng)從推測模式轉(zhuǎn)換為正常模式。 否則,在1909正確地全局引退加載指令。此外,在一些實施例中,在存在其他事件時MLC的行為如下1)當滿意地完成當前檢查點(檢查點的最后指令正確地全局引退)時,將所有行的推測( 比特設置為0,注意, 不清理LV比特直到執(zhí)行從推測模式轉(zhuǎn)換為正常模式為止;2)當從MLC中取代具有設置的 S比特的行時,生成銷毀信號。這意味著當前高速緩存配置不能保持自從上一檢查點后完整推測存儲器狀態(tài)。因為規(guī)則地采取檢查點,所以從我們的仿真中來觀察,這很少發(fā)生。然而,如果關注于此,那么可以使用改善替換算法(其中給予推測行低優(yōu)先級)或犧牲高速緩存來減少銷毀量;幻當從推測模式轉(zhuǎn)換為正常模式時,除了清理所有的S比特之外,還清理 LV比特(設置為1);以及4)當產(chǎn)生銷毀信號時,具有被設置為1的推測比特的所有行被設置為無效(和所有D⑶中發(fā)生的一樣)并且S比特被重置。此外,LV比特被清理(設置為 1)。核心間存儲器一致性模塊(ICMC)除了通常的高速緩存級別,存在下文更詳細討論的其他結(jié)構(gòu)。這些額外的結(jié)構(gòu)構(gòu)成核心間存儲器一致性模塊(“ICMC”)。ICMC和附于D⑶和MLC的行的比特不在正常模式中使用。ICMC接收排序指令并且通過三種結(jié)構(gòu)處理它們1)存儲器FIFO ;2)更新描述表 (UDT);以及3)寄存器檢查點邏輯(見圖20)。ICMC對排序指令進行分類以使得由多線程化的應用程序進行的改變對其他區(qū)塊可見,如同它是順序地執(zhí)行一樣,并且檢測在區(qū)塊的核心上運行的線程之間的存儲器依賴違反。區(qū)塊中的ICMC和存儲器層級允許在協(xié)作模式中運行的每一個核心更新其自身存儲器狀態(tài),同時仍然提交相同狀態(tài)和避免推測更新在區(qū)塊外部傳播,所述相同狀態(tài)為將通過允許多個Ll高速緩存中的相同行的不同版本生成原始順序執(zhí)行。附加地,寄存器檢查點允許回滾到先前的狀態(tài)以糾正誤推測。ICMC實現(xiàn)稱為存儲器FIFO(memFIFO)的每核心一個FIFO隊列。當核心引退排序指令時,該指令存儲在與核心相關聯(lián)的memFIFO中。ICMC基于POP比特處理和從memFIFO 移除指令。最后提交的指令的POP比特的值識別要提交的下一個指令位于的memFIFO的頭部。注意,當指令成為系統(tǒng)中原始順序次序中最老的指令時,ICMC提交這些指令。因此,這是存儲操作可以更新共享高速緩存級別并且在區(qū)塊外部可見的次序。在下文討論期間,當指令成為核心中最老的指令并且引退發(fā)生時該指令引退。相反,當因為指令是區(qū)塊中最老的指令而由ICMC處理該指令時,指令全局地提交(或簡稱提交)。MemFIFO條目可以包括1)標識指令類型(加載指令、存儲指令、分支指令、檢查點)的類型比特;2)POP值;3)存儲器地址;4)描述存儲器地址的大小的比特;5)用于存儲值的比特;以及6)用于標記被復制(r印)的指令的比特。標記被復制的指令以避免使ICMC 檢查依賴違反。MemFIFO允許每一個核心獨立地取得、執(zhí)行和引退指令。僅在核心阻止其他核心引退指令時發(fā)生同步。核心可以最終填滿其memFIFO,然后停止直到其引退的指令的一個或多個離開memFIFO為止。這在要提交的下一個指令必須由不同核心執(zhí)行且該指令還沒有引退時發(fā)生。
高速緩存一致性協(xié)議和區(qū)塊中的高速緩存模塊被稍微地修改以便允許多個第一高速緩存級別中相同行的不同版本。此外,還需要一些改變來避免推測更新在區(qū)塊外部傳播。當更新行并且因此每一個Ll高速緩存可以具有相同數(shù)據(jù)的不同版本時,Ll數(shù)據(jù)高速緩存不會使處于協(xié)作模式的其他Ll高速緩存無效。如上文所討論的,在存儲指令在一個核心中執(zhí)行并類似于Iref}更新該行時設置該核心中該行的V比特。不將針對Ll的這些推測更新傳播(寫透過)到共享L2高速緩存。存儲操作被發(fā)送到ICMC并且將在它們提交時更新L2高速緩存。因此,當從Ll取代其V比特被設置的行時,拋棄其內(nèi)容。最終,當核心從協(xié)作模式轉(zhuǎn)換為單核心模式時,使V比特被設置的所有Ll行無效,因為正確的數(shù)據(jù)位于 L2 禾口 ICMC 中。當存儲指令提交時,其更新對應的L2行并且將其S比特設置為1。這種S比特描述行在上一檢查點之后已被修改。一旦采取新的檢查點,清理S比特。如果發(fā)生誤推測,那么線程回滾并且使S比特被設置的行無效。因此,當推測存儲指令要更新非推測臟行時, 必須將該行寫回到下一存儲器級別,以便在存儲器層級的某位置具有行的有效的非推測版本。因為推測狀態(tài)不能超出L2高速緩存,所以從L2逐出標記為推測(S)的行意味著回滾到先前的檢查點以恢復執(zhí)行原始的應用程序。另一方面,LV比特指示什么樣的核心具有特定塊的最后版本。當存儲指令提交時, 它將屬于該核心的修改的塊的LV比特設置為1并且重置其余的LV比特。如果存儲指令被標記為被復制(由兩個核心執(zhí)行),那么兩個核心將都具有最新的拷貝。在該情況中,將LV 比特設置為11。當全局提交加載指令時,檢查這些比特以查看執(zhí)行該加載指令的核心是否是具有數(shù)據(jù)的最后版本的核心。如果表示執(zhí)行了加載指令的核心的LV比特是0并且其他核心的該比特是1,那么檢測到違反并且銷毀這些線程。這是因為每一個核心獨立地取得、 執(zhí)行和引退指令并且Ll高速緩存也彼此去耦合地工作,系統(tǒng)只能夠保證如果正確值已在相同核心中生成則加載指令將讀取正確值。UDT是描述由位于memFIFO隊列中的存儲指令(還沒有全局地引退的存儲指令) 更新的L2行的表。對于至少一個實施例,UDT被構(gòu)造為高速緩存(全相關的,例如,32個條目),其中每一個條目識別一行并且具有每個線程的以下字段有效比特(V)和FIFO條目 id,其是指向該線程的FIFO條目的指針。只要仍然有等待更新該行的一些存儲指令,UDT就延遲從共享L2高速緩存到Ll高速緩存的填充。這幫助避免用來自L2的失效行填充Ll。特別地,延遲對給定核心的Ll的填充直到在memFIFO中不再有等待的針對該特定核心的存儲指令(UDT中沒有針對行標記的任何條目)為止。因此,如果UDT中存在針對請求的行(其具有對應于該核心的、被設置為1的有效比特)的條目,DCU填充位于延遲請求緩沖器中。 一旦該有效比特被復位,那么將處理這種填充。不需要等待由其他核心對該相同行的存儲, 因為如果存在存儲器依賴,那么LV比特將已經(jīng)檢測到它,并且如果兩個核心訪問相同行的不同部分,那么ICMC將在L2適當?shù)睾喜⒏隆T谕茰y模式中,當存儲指令在本地引退并且添加到FIFO隊列時,更新UDT。讓我們現(xiàn)在假設條目是可獲得的。如果不存在針對該行的條目,那么將創(chuàng)建一個新的條目,并且填充標簽,設置該線程的有效比特,用其中放置存儲指令的FIFO條目的ID更新對應的FIFO 條目id,并且復位對應于其他核心的有效比特。如果已經(jīng)存在針對該行的條目,那么設置該線程的有效比特并且用在其中放置存儲指令的FIFO條目的id更新對應的FIFO條目id。
當存儲指令全局地引退時,它在UDT中找到其對應的條目(它總是命中)。如果該核心的FIFO條目id與正在引退的存儲指令的UDT中的條目相匹配,那么將對應的有效比特設置為0。如果條目的兩個有效比特都是0,那么釋放UDT條目并且其可以再用于即將來臨的請求。當從推測模式轉(zhuǎn)換為正常模式時,清理UDT。為了避免溢出,實現(xiàn)了 UDT “停止和進行”機制。當UDT中可用條目的數(shù)量少并且存在溢出的風險時,向核心發(fā)送信號以阻止它們在本地引退新的存儲指令。注意,不能實現(xiàn)基于信用的控制,因為UDT是可以從若干核心進行寫入的共享的結(jié)構(gòu)。此外,為了避免死鎖和確保向前進行,核心不能使用多于N-I個UDT條目,其中N是條目的總數(shù)。在這種情況中, 阻止該核心在本地引退新存儲指令。如果其他線程是執(zhí)行系統(tǒng)中最老的指令的線程,則這給該其他線程的進行留下了空間,。UDT中的條目具有以下字段標識L2高速緩存行的標簽,和針對每一個核心的附于memFIFO條目id的有效比特。memFIFO條目id是更新該行的最后存儲指令的該特定 memFIFO的條目號。每當將存儲指令附加到memFIFO時更新該字段。如果存儲指令對在UDT 中沒有條目的行進行寫入,那么它分配新的條目。相反,如果由memFIFO條目ID指向提交的存儲指令,那么將其有效比特設置為假;并且如果兩個有效比特都是假,那么從UDT移除該條目。ICMC還可以包括下文詳細描述的寄存器檢查點邏輯。對于在其中上移或下移核心間專用/共享接口的實施例,上文討論的結(jié)構(gòu)(例如,ICMC和S、V、和LV比特)可以位于存儲器層級中的其他位置。因此,可以在任何特定的存儲器子系統(tǒng)配置中使用本文描述的實施例。計算推測地并行化代碼的架構(gòu)寄存器狀態(tài)本文討論的重構(gòu)方案的實施例包括用于在特定推測是錯誤時將狀態(tài)回滾到正確狀態(tài)的寄存器檢查點。檢查點的頻率與性能具有重要的關系。檢查點越頻繁,由于誤推測產(chǎn)生的開銷越低,但是用于創(chuàng)建檢查點的開銷越高。在該部分中描述的方案能夠針對其計算被拆分并且分布到多個核心的單線程代碼采取架構(gòu)寄存器狀態(tài)的頻繁檢查點,而具有極低的開銷。用于寄存器檢查點的機制的至少一個實施例允許核心引退指令、回收執(zhí)行資源并即使在其他核心停止時仍然保持繼續(xù)向前進行。該部分中描述的寄存器檢查點允許安全的早期寄存器回收,以使得它允許向前進行而對寄存器文件增加極少的壓力。對于本發(fā)明的至少一個實施例,非常頻繁地采取檢查點(每幾百條指令),以使得當由于中斷或數(shù)據(jù)誤推測導致需要回滾時浪費的工作量非常少。因此,所公開的機制的實施例使得有可能執(zhí)行更積極的優(yōu)化,因為降低了數(shù)據(jù)誤推測的開銷。與之前的推測多線程化方案相比,本發(fā)明的實施例不需要生成完整架構(gòu)狀態(tài);替代地可以由多個核心部分地計算架構(gòu)狀態(tài)。這允許更靈活的線程化,其中以比在傳統(tǒng)推測多線程化方案中更細的粒度將指令分布在核心中。根據(jù)本發(fā)明的至少一個實施例,核心不必同步來在特定點獲取架構(gòu)狀態(tài)。本技術虛擬地無縫合并和構(gòu)造架構(gòu)狀態(tài)。本發(fā)明的實施例創(chuàng)建R0B(重排序緩沖器),其中以它們應當提交的次序存儲由核心引退的指令,以具有與執(zhí)行原始單線程應用程序相同的結(jié)果。然而,因為線程異步地執(zhí)行,所以該ROB中的條目不是順序分配的。替代地,存在這樣的區(qū),其中既不知道分配到該區(qū)的指令的數(shù)量也不知道分配到該區(qū)的指令的類型。如果例如核心0在執(zhí)行應當在從核心 1執(zhí)行了指令之后提交的代碼區(qū),則這種情形可能發(fā)生。在該情況中,在該概念性ROB中,在已經(jīng)由核心1引退的指令和由核心0引退的屬于核心1還沒有執(zhí)行/引退的那些指令的指令之間存在間隙。圖21說明了檢查點機制的ROB的至少一個實施例。在該ROB中,GRetireJ)指向由核心0引退的最后指令,GRetire_l指向由核心1引退的最后指令。如能夠看到的,核心 0在核心1之前,從而ROB中GRetire_0和GRetire_l之間存在間隙(示出為陰影區(qū))。在給定時間,完整檢查點具有指向針對每一個邏輯寄存器的值位于其中的寄存器文件中的物理寄存器(在核心0或核心1中)的指針。在每次每一個核心引退預定量的指令時由該核心采取檢查點(ckp)。注意,由引退系統(tǒng)中最年輕的指令的核心采取的檢查點是部分檢查點。它不能夠確保該核心實際生成用于該執(zhí)行點的架構(gòu)狀態(tài),直到其他核心引退了比所采取檢查點更老的所有指令為止。相反,由不引退系統(tǒng)中最年輕的指令的核心采取的檢查點是完整檢查點,因為它知道比其他核心已經(jīng)執(zhí)行的檢查點更老的指令。因此,它知道架構(gòu)值的每一個此時的位置。 該例子中核心0在特定數(shù)量的指令之后還采取周期性的檢查點(盡管他們是部分的)的原因是,這些部分檢查點未指向的所有物理寄存器被回收。該特征允許核心向前進行,而對其寄存器文件增加極少的壓力。此外,核心1 一到達該檢查點,它就確保包括由核心0產(chǎn)生的屬于架構(gòu)狀態(tài)的值的寄存器此時被回收,以使得可以與來自核心1的信息一起構(gòu)建完整的檢查點。此外,在核心0中分配的不屬于該檢查點的那些寄存器因為被核心1覆寫所以也可以被釋放。只要引退不是系統(tǒng)中最年輕的指令的核心(例子中的核心1)采取更年輕的完整檢查點,那么就可以釋放檢查點并且回收其物理寄存器。然而,可能發(fā)生線程化方案要求在指令成為系統(tǒng)中最老的指令時執(zhí)行的一些驗證。因此,比該指令老的檢查點用于在驗證失敗的情況下回滾到那里。在該情形中,在具有相關聯(lián)的完整檢查點的另一指令成為系統(tǒng)中最老的指令并且被適當?shù)仳炞C之后,釋放完整檢查點。由線程執(zhí)行的每一個指令具有相關聯(lián)的IP_orig以在恢復該指令相關聯(lián)的檢查點時進行跳轉(zhuǎn),其中所述IP_orig是原始代碼中指令的指令指針(“IP”)。執(zhí)行的指令的 IP和其IP_orig之間的轉(zhuǎn)變存儲在存儲器中(在實施例中,編譯器或動態(tài)優(yōu)化器負責創(chuàng)建該轉(zhuǎn)變表)。因此,只有由于數(shù)據(jù)誤推測或中斷而導致恢復檢查點時,執(zhí)行將在與恢復的檢查點相關聯(lián)的原始單線程應用程序的IP_orig處繼續(xù)。應當注意,前面的核心和后面的核心不總是相同的,并且該角色可以取決于原始應用程序被調(diào)整成線程的方式而隨著時間變化。在給定時間,完整檢查點具有指向針對每一個邏輯寄存器的值位于其中的寄存器文件中的物理寄存器(在核心0或1中)的指針。當已經(jīng)全局地提交所有的指令并且更年輕的檢查點成為完整的檢查點時,可以釋放檢查點并回收其物理寄存器。當發(fā)現(xiàn)由編譯器插入的CKP指令并且自從最后檢查點(CKP_DIST_CTE)之后已經(jīng)全局地提交至少最少數(shù)量的動態(tài)指令時,采取檢查點。圖15中示出了該邏輯。該CKP指令具有與檢查點一起存儲的恢復代碼的IP,以使得當中斷或數(shù)據(jù)誤推測發(fā)生時,將由先前的檢查點指向的值拷貝到將恢復應用程序的執(zhí)行的核心。圖22是說明寄存器檢查點硬件的至少一個實施例的框圖。對于至少一個實施例, 所說明的寄存器檢查點硬件的一部分位于區(qū)塊的核心之間/之中。例如,在實施例中,邏輯門在區(qū)塊的外邊并且LREG_FIF0是ICMC的一部分。在實施例中,ICMC包括以下的一個或多個1)每核心的FIFO隊列(LREG_FIF0) ;2)每LREG_FIF0的指針集合;以及3)每LREG_ FIFO的檢查點表的池。例如可以使用諸如多路復用器(MUX)的其他邏輯替代NOR門。寫入邏輯寄存器的引退的指令分配并進入LREG_FIF0。圖22說明了條目的構(gòu)成 1)名稱為ckp的字段,其中,如果存在與該條目相關聯(lián)的架構(gòu)狀態(tài)檢查點,則所述字段被設置為1 ;幻存儲指令覆寫的邏輯寄存器的標識符的LDest字段;以及幻用于標識包括程序次序中下一個指令的線程的POP字段。POP指針是用于識別來自不同線程的指令應當引退的次序以獲得與順序地執(zhí)行單線程應用程序相同的結(jié)果的機制。然而,本發(fā)明能夠與可以用來識別從單線程應用程序生成的不同線程的指令之間的次序的任何其他機制一起工作。指針集合包括1)指向在其中新引退的指令分配由該寄存器指向的條目的LREG_ FIFO的第一個未使用的條目的每核心RetireP指針;2)指向用來按次序解除分配LREG_ FIFO條目的LREG_FIF0中的最老分配的條目的每核心CommitP指針;以及幻指向按次序經(jīng)過LREG_FIF0時的最后條目以構(gòu)造完整檢查點的每核心Gretire指針。還說明了 CHKP_ Dist_CTE寄存器或常量值。該寄存器定義LREG_FIF0中兩個檢查點之間多個條目的距離。 還說明了在最后檢查點之后計數(shù)LREG_FIF0中分配的條目的數(shù)量的每LREG_FIF0的Inst_ CNT寄存器。每LREG_FIF0的檢查點表的池定義正在處理的檢查點的最大數(shù)量。每檢查點的每一個池作為按次序分配和回收檢查點的FIFO隊列進行工作。檢查點包括在其中創(chuàng)建檢查點的指令的IP、回滾代碼的IP和用于架構(gòu)中每一個邏輯寄存器的條目。這些條目的每一個具有針對該特定邏輯寄存器在檢查點之前生成的最后值所位于的物理寄存器 (“PDest”);如果PDest標識符與先前檢查點中的PDest不同則被設置為1的覆寫比特 (“0”);以及如果架構(gòu)狀態(tài)為邏輯寄存器位于另一核心則被設置為1的遠程比特(“R”)。 下文詳細地描述了這些比特。圖22還說明了位于應用程序存儲空間中的數(shù)據(jù)結(jié)構(gòu),所述應用程序存儲空間由 IP和來自多個線程中的一個的指令的線程id索引并且將其映射到原始單線程應用程序的 IP中,以在恢復該線程的特定IP中的架構(gòu)狀態(tài)時進行跳轉(zhuǎn)。每當核心引退產(chǎn)生新的架構(gòu)寄存器值的指令時,該指令分配在對應的LREG_FIF0 中的新的條目。然后,針對它覆寫的邏輯寄存器讀取激活檢查點中的條目。當0比特被設置時,回收存儲在條目中的PDest標識符。然后,0比特被設置并且R比特被復位。最后, 將PDest字段更新為引退的指令分配的物理寄存器的標識符。一旦已經(jīng)更新了激活檢查點,那么^istCNT計數(shù)器減少,并且當其是0時,將當前檢查點拷貝到下一個檢查點,以使得該下一個檢查點成為激活檢查點并且重置該新的激活檢查點中的所有0比特并且再次將 InstCNT 寄存器設置為 CKHP_Dist_CTE。如果GRetire指針與RetireP指針匹配,那么這意味著該指令不是系統(tǒng)中最年輕的指令,所以它應當像圖14的示例中的核心1 一樣運作。因此,檢查POP比特并且當它指向其他核心時,使用其他核心的GRetire指針來經(jīng)過其他核心的LREG_FIF0直到找到具有
27POP指針指向的條目為止。對于經(jīng)過的每一個條目,讀取LDest的值并且更新激活檢查點如下當0比特被設置時,回收PDest中寫入的物理寄存器標識符。然后,重置0比特,設置R 比特,并且更新PDest。如果條目具有被設置為1的ckp比特,那么用激活檢查點的信息來完成部分檢查點。該合并涉及回收在其中設置部分檢查點的0比特和重置激活檢查點的R 比特的部分檢查點中的所有PDest。然后,通過重置這些條目的0比特來更新激活檢查點。 另一方面,如果GRetire指針與RetireP不匹配,那么不進行其他任何操作,因為系統(tǒng)中最年輕的指令是已知的。最后,當確定不需要回滾到檢查點時可以釋放該檢查點。如果確保所有引退的指令都是正確的并且將不會引起任何異常,那么只要更年輕的檢查點成為完整檢查點,就可以釋放檢查點。相反,引退的指令有可能需要進一步的驗證,如在線程化方案中發(fā)生的一樣。該驗證在當指令成為系統(tǒng)中最老的指令時發(fā)生。在該情況中,只要具有相關聯(lián)的檢查點的更年輕的指令成為系統(tǒng)中最老的指令并且驗證是正確的,那么就可以釋放檢查點。只要當發(fā)生中斷或數(shù)據(jù)誤推測時,就應當將由先前檢查點指向的值拷貝到將恢復應用程序執(zhí)行的核心中。該拷貝可以由硬件或軟件作為將顯式地拷貝這些值的服務例程的開始而進行。一旦拷貝了架構(gòu)狀態(tài),那么將采取檢查點的指令的IP(該IP在采取檢查點時進行存儲)加入到用于從線程的IP轉(zhuǎn)變到原始IP的表中,以獲取原始單線程應用程序的 IP。然后,執(zhí)行恢復跳轉(zhuǎn)到所獲取的原始IP,并且將執(zhí)行原始單線程應用程序直到在其中可以再次生成線程的應用程序中的另一個點被找到為止。圖23中示出了上文的詳細說明。示例性SpMT系統(tǒng)圖M說明了使用線程級重構(gòu)的微處理器的實施例,特別地,圖M說明了具有一個或多個處理器核心M05和MlO的微處理器M00,每一個所述處理器核心分別具有與其相關聯(lián)的本地高速緩存M07和M13。圖M中還說明了可以存儲在本地高速緩存M07和 2413的每一個中存儲的信息的至少一些的版本的共享高速緩沖存儲器對15。在一些實施例中,微處理器MOO還可以包括沒有在圖M中示出的其他邏輯,例如集成存儲器控制器、 集成圖形控制器,以及用于執(zhí)行計算機系統(tǒng)中諸如I/O控制的其他功能的其他邏輯。在一個實施例中,多處理器系統(tǒng)中的每一個微處理器或多核心處理器中的每一個處理器核心可以包括或以其他方式關聯(lián)邏輯對19,以根據(jù)至少一個實施例從分解后的指令流重構(gòu)順序執(zhí)行。邏輯可以包括電路、軟件(體現(xiàn)為有形介質(zhì))或二者,以使得比某些現(xiàn)有技術的實現(xiàn)更有效地在多個核心或處理器之間進行資源分配。例如,圖25說明了在其中可以使用本發(fā)明的一個實施例的前端總線(FSB)計算機系統(tǒng)。任何處理器2501、2505、2510或2515可以訪問來自處理器核心2525、2527、2533、 2537,2543,2547,2553,2557的一個中的或以其他方式與其相關聯(lián)的任何本地1級(Li) 高速緩沖存儲器2520、2527、2530、2535、2M0、2545、2550、2555的信息。此外,任何處理器2501、2505、2510或2515可以經(jīng)由芯片組2565訪問來自共享2級(U)高速緩存2503、 2507、2513、2517的任意一個或來自系統(tǒng)存儲器2560的信息。圖25中的處理器的一個或多個可以包括或以其他方式與邏輯2519相關聯(lián)以根據(jù)至少一個實施例從分解后的指令流重構(gòu)順序執(zhí)行。除了圖25中說明的FSB計算機系統(tǒng)之外,其他系統(tǒng)配置也可以與本發(fā)明的各種實施例結(jié)合使用,包括點到點(P2P)互連系統(tǒng)或環(huán)互連系統(tǒng)。
現(xiàn)在參考圖沈,示出了根據(jù)本發(fā)明的一個實施例的系統(tǒng)沈00的框圖。系統(tǒng)沈00 可以包括耦合到圖形存儲器控制器中心(GMCH)沈20的一個或多個處理元件沈10、2615。圖 26中用虛線標示額外處理元件沈15的可選性。每一個處理元件可以是單個核心或可以可替換地包括多個核心。處理元件除了處理核心之外還可以可選地包括其他片上元件,例如集成存儲器控制器和/或集成I/O控制邏輯。此外,對于至少一個實施例,處理元件的核心可以是多線程的,因為對于每個核心它們可以包括多于一個硬件線程環(huán)境。圖沈說明GMCH沈20可以耦合到例如可以是動態(tài)隨機存取存儲器(DRAM)的存儲器沈40。對于至少一個實施例,DRAM可以與非易失性高速緩存相關聯(lián)。GMCH洸20可以是芯片組或芯片組的一部分。GMCH洸20可以與處理器洸10、2615 進行通信并且控制處理器2610、2615和存儲器沈40之間的交互。GMCH沈20還可以充當處理器沈10、2615和系統(tǒng)沈00的其他元件之間的加速總線接口。對于至少一個實施例,GMCH 2620經(jīng)由諸如前端總線(FSB) 2695的多點總線與處理器沈10、2615進行通信。此外,GMCH 2620耦合到顯示器洸40 (例如平板顯示器)。GMCH 2620還包括集成圖形加速器。GMCH沈20還耦合到可以用來將各種外圍設備耦合到系統(tǒng)沈00的輸入/輸出 (I/O)控制器中心(ICH)沈50。圖沈的實施例中作為示例示出了外部圖形設備沈60和另一外圍設備2670,其中所述外部圖形設備沈60可以是耦合到ICH 2650的分立圖形設備。可替換地,系統(tǒng)沈00中還可以有額外的或不同的處理元件。例如,額外的處理元件2615可以包括與處理器沈10相同的額外處理器、與處理器沈10異構(gòu)或不對稱的額外處理器、加速器(例如,圖形加速器或數(shù)字信號處理(DSP)單元)、現(xiàn)場可編程門陣列或任何其他處理元件。依據(jù)包括架構(gòu)、微架構(gòu)、熱量、功耗特性等的指標度量譜,物理資源沈10、2615 之間可以存在各種差別。這些差別可以有效地將自身表現(xiàn)為處理元件沈10、2615之間的非對稱性和異構(gòu)性。對于至少一個實施例,各種處理元件沈10、2615可以位于相同的管芯封裝中。現(xiàn)在參考圖27,輸出了根據(jù)本發(fā)明的實施例的第二系統(tǒng)實施例2700的框圖。如圖27中所示,多處理器系統(tǒng)2700是點到點互連系統(tǒng),并且包括經(jīng)由點到點互連2750耦合的第一處理元件2770和第二處理元件2780。如圖27中所示,處理元件2770和2780的每一個可以是多核心處理器,包括第一和第二處理器核心(即,處理器核心277 和2774b以及處理器核心278 和2784b)??商鎿Q地,處理元件2770、2780的一個或多個可以是不同于處理器的元件,例如加速器或現(xiàn)場可編程門陣列。盡管只示出了兩個處理元件2770、2780,但是應當理解,本發(fā)明的范圍并不受限于此。在其他實施例中,在給定的處理器中可以有一個或多個額外的處理元件。第一處理元件2770還可以包括存儲器控制器中心(MCH) 2772和點到點(P_P)接口 2776和2778。類似地,第二處理元件2780可以包括MCH2782和P-P接口 2786和2788。 處理器2770、2780可以使用PtP接口電路2778、2788經(jīng)由點到點(PtP)接口 2750交換數(shù)據(jù)。如圖27中所示,MCH的2772和2782將處理器耦合到各自的存儲器,即存儲器2742和存儲器2744,其中所述存儲器2742和2744可以是在本地附于各自處理器的主存儲器的部分。
處理器2770、2780每一個可以使用點到點接口電路2776、2794、2786、2798經(jīng)由單獨PtP接口 2752、27M與芯片組2790交換數(shù)據(jù)。芯片組2790還可以經(jīng)由高性能圖形接口 2739與高性能圖形電路2738交互數(shù)據(jù)。本發(fā)明的實施例可以位于具有任意數(shù)量的處理核心的任何處理器中,或圖27的PtP總線代理的每一個中。在一個實施例中,任何處理器可以包括或以其他方式與局部高速緩沖存儲器(未示出)相關聯(lián)。此外,共享高速緩存(未示出)可以包括在兩個處理器外部但仍經(jīng)由p2p互連與這些處理器相連的任一處理器中, 以使得如果處理器處于低功率模式時可以將處理器二者或之一的本地高速緩存信息存儲到共享高速緩存中。圖27中的處理器或核心的一個或多個可以包括或以其他方式與邏輯 2719相關聯(lián),以根據(jù)本發(fā)明的至少一個實施例從分解后的指令流重構(gòu)順序執(zhí)行。第一處理元件2770和第二處理元件2780可以分別地經(jīng)由P-P互連2776、2786和 2784耦合到芯片組2790。如圖27中所示,芯片組2790包括P-P接口 2794和2798。此外, 芯片組2790包括用于將芯片組2790與高性能圖形引擎2748進行耦合的接口 2792。在一個實施例中,可以使用總線2749來將圖形引擎2748耦合到芯片組2790??商鎿Q地,點到點互連2749可以耦合這些部件。芯片組2790又可以經(jīng)由接口 2796耦合到第一總線2716。在一個實施例中,第一總線2716可以是外圍部件互連(PCI)總線,或諸如快速PCI總線的總線或另外第三代I/O 互連總線,但是本發(fā)明的范圍不局限于此。如圖27所示,各種I/O設備2714以及總線橋2718可以耦合到第一總線2716,其中所述總線橋2718將第一總線2716耦合到第二總線2720。在一個實施例中,第二總線2720 可以是低引腳數(shù)(LPC)總線。在一個實施例中,可以將各種設備耦合到第二總線2720,所述各種設備包括例如鍵盤/鼠標2722、通信設備27 和可以包括代碼2730的諸如磁盤驅(qū)動器或其他大容量存儲設備的數(shù)據(jù)存儲單元27觀。代碼2730可以包括根據(jù)上文描述的一個或多個實施例的排序指令和/或程序次序指針。此外,音頻I/O 27M可以耦合到第二總線 2720。注意,其他架構(gòu)是可能的。例如,系統(tǒng)可以實現(xiàn)多點總線或其他這種架構(gòu)而不是圖27 的點到點架構(gòu)。現(xiàn)在參考圖28,示出了根據(jù)本發(fā)明的實施例的第三系統(tǒng)實施例觀00的框圖。圖 27和28中相同的元件具有相同的標號,并從圖28中省略了圖27的某些方面以免模糊圖 28的其他方面。圖觀說明了處理元件2770、2780可以分別地包括集成存儲器和I/O控制邏輯 (“CL”)2772和2782。對于至少一個實施例,CL 2772、2782可以包括諸如上文結(jié)合圖26 和27描述的存儲器控制器中心邏輯(MCH)。此外,CL 2772,2782還可以包括I/O控制邏輯。圖觀說明不僅存儲器2742、2744耦合到CL 2772、2782,而且I/O設備觀14也耦合到控制邏輯2772、2782。傳統(tǒng)的I/O設備觀15耦合到芯片組2790。本文公開的機制的實施例可以實現(xiàn)為硬件、軟件、固件或這些實現(xiàn)方式的組合。本發(fā)明的實施例可以實現(xiàn)為在可編程系統(tǒng)上執(zhí)行的計算機程序,其中,所述可編程系統(tǒng)包括至少一個處理器、數(shù)據(jù)存儲系統(tǒng)(包括易失性和非易失性存儲器和/或存儲元件)、至少一個輸入設備和至少一個輸出設備。可以應用諸如圖27中所說明的代碼2730的程序代碼來輸入數(shù)據(jù)以執(zhí)行本文描述的功能和生成輸出信息。例如,程序代碼2730可以包括被編碼來執(zhí)行圖25中說明的方法
302500,2550的實施例的操作系統(tǒng)。因此,本發(fā)明的實施例還包括機器可讀介質(zhì),所述機器可讀介質(zhì)包含用于執(zhí)行本發(fā)明的實施例的操作的指令或包含諸如HDL的設計數(shù)據(jù)的,所述設計數(shù)據(jù)定義本文描述的結(jié)構(gòu)、電路、裝置、處理器和/或系統(tǒng)特征。這些實施例還可以稱為
程序產(chǎn)品。這種機器可讀存儲介質(zhì)可以包括但不限于由機器或設備制造或形成的粒子有形排列,包括諸如硬盤、任何其他類型盤(包括軟盤、光學盤、光盤只讀存儲器(CD-ROM)、可重寫光盤(CD-RE)以及磁光盤)的存儲介質(zhì),半導體器件(例如,只讀存儲器(ROM)、隨機存取存儲器(RAM)(例如,動態(tài)隨機存取存儲器(DRAM)、靜態(tài)隨機存取存儲器(SRAM))、可擦除可編程只讀存儲器(EPROM)、閃速存儲器、電可擦除可編程只讀存儲器(EEPROM)、磁卡或光卡),或適于存儲電子指令的任何其他類型的介質(zhì)??梢砸砸阎姆绞綄⑤敵鲂畔玫揭粋€或多個輸出設備。為了該應用的目的, 處理系統(tǒng)包括具有處理器的任何系統(tǒng),其中所述處理器例如數(shù)字信號處理器(DSP)、微控制器、專用集成電路(ASIC)或微處理器。程序可以以高級的過程或面向?qū)ο缶幊陶Z言來實現(xiàn),以與處理系統(tǒng)通信。如果需要,程序還可以以匯編或機器語言來實現(xiàn)。實際上,本文描述的機制不受限于任何特定編程語言的范圍。在任何情況下,所述語言可以是編譯型或解釋型語言??梢酝ㄟ^存儲在機器可讀介質(zhì)上的表示處理器中的各種邏輯的表示性數(shù)據(jù)來實現(xiàn)至少一個實施例的一個或多個方面,其中所述表示性數(shù)據(jù)當由機器讀取時使得機器構(gòu)造邏輯來執(zhí)行本文描述的技術。稱為“IP核心”的這種表示可以存儲在有形的機器可讀介質(zhì)中,并且可以被供應給各個使用者或制造機構(gòu)以加載到實際制造邏輯或處理器的生產(chǎn)機器中。因此,描述了方法、裝置的實施例。應當理解,以上描述意圖是說明性的而非限制性的。當本領域的技術人員閱讀和理解了以上描述時,許多其他實施例將會變得顯而易見。 因此,參照所附權利要求以及被授予這些權利要求的等價物的全部范圍來確定本發(fā)明的范圍。
權利要求
1.一種裝置,包括多個數(shù)據(jù)高速緩存單元(DCU),用于存儲推測執(zhí)行的線程的本地引退的指令,其中,所述DCU包括用來分類每一行的推測更新狀態(tài)的每行版本比特;合并級高速緩存(MLC),其耦合到所述DCU以合并來自所述DCU的行的數(shù)據(jù),其中,所述 MLC包括用于指示高速緩存行包括推測狀態(tài)的每高速緩存推測比特和用于指示對塊的改變的最后版本比特;以及核心間存儲器一致性模塊(ICMC),用于在所述MLC中全局地引退所述推測執(zhí)行的線程的指令。
2.根據(jù)權利要求1所述的裝置,其中,所述ICMC還包括多個存儲器先進先出(FIFO)隊列,用于在推測執(zhí)行的線程的排序指令引退之后存儲所述排序指令,其中所述存儲器FIFO隊列中的每一個條目包括用于標識要提交的下一個指令位于的所述存儲器FIFO隊列的頭部的程序次序指針(POP)。
3.根據(jù)權利要求2所述的裝置,其中,所述ICMC還包括切換件,用于在所述ICMC進行流重構(gòu)期間在所述存儲器FIFO隊列之間進行改變。
4.根據(jù)權利要求2所述的裝置,其中,所述ICMC還包括更新描述表(UDT),用于標識位于所述存儲器FIFO隊列中的存儲指令要更新的所述 MLC的行。
5.根據(jù)權利要求3所述的裝置,其中,所述ICMC還包括寄存器檢查點邏輯,用于在所述推測執(zhí)行的線程的執(zhí)行期間回滾到先前狀態(tài)以糾正誤推測。
6.根據(jù)權利要求1所述的裝置,還包括多個功能單元,用于處理所述推測執(zhí)行的線程的所述指令。
7.根據(jù)權利要求1所述的裝置,還包括耦合到所述MLC的L3高速緩存。
8.一種機器可讀存儲介質(zhì),包括當由機器執(zhí)行時使得執(zhí)行方法的指令,所述方法包括接收計算機程序的多個區(qū);識別所述多個區(qū)中作為并行多線程執(zhí)行的候選的區(qū);以指令級為所識別的區(qū)生成要在多個核心上并行地執(zhí)行的多個細粒度線程,其中,所述多個線程形成所識別的區(qū)的優(yōu)化版本;以及從所述多個線程生成程序代碼。
9.根據(jù)權利要求8所述的機器可讀存儲介質(zhì),其中,所述方法還包括 從所述計算機程序生成數(shù)據(jù)依賴圖(DDG)和控制流圖(CFG);將簡檔信息添加到所述DDG和CFG ;以及從具有簡檔信息的所述DDG和CFG創(chuàng)建程序依賴圖(PDG)。
10.根據(jù)權利要求9所述的機器可讀存儲介質(zhì),其中,所述方法還包括對所述PDG執(zhí)行粗化,以找到所述PDG中的指令節(jié)點的相對好的劃分,并且通過以下步驟來生成多層圖檢測所述PDG中的不良加載,其中不良加載是在高速緩存中將很可能經(jīng)常未命中的加載指令;計算所述PDG的節(jié)點的每一條邊的松弛度; 計算所述PDG的節(jié)點的公共前驅(qū)。
11.根據(jù)權利要求10所述的機器可讀存儲介質(zhì),其中,所述方法還包括 改善所述多層圖以管理線程間依賴。
12.根據(jù)權利要求8所述的機器可讀存儲介質(zhì),其中,所述方法還包括生成程序次序指針(POP),所述程序次序指針用于定義優(yōu)化區(qū)被非推測執(zhí)行情況下的相對次序,并指示應當在何時評估正執(zhí)行的機器的哪個存儲器先進先出(FIFO)隊列以重構(gòu)所識別的區(qū)的優(yōu)化版本的流;將所述POP添加到所識別的區(qū)的優(yōu)化版本的每一個排序指令。
13.根據(jù)權利要求8所述的機器可讀存儲介質(zhì),其中,所述生成POP包括 確定所述優(yōu)化區(qū)的第一指令是排序指令;找到所識別的區(qū)的優(yōu)化版本中的順序次序中的下一個排序指令;以及當順序次序中的所述下一個排序指令屬于與所述第一指令不同的線程時,標記所述第一指令以指示改變。
14.根據(jù)權利要求8所述的機器可讀存儲介質(zhì),其中,所述方法還包括在所述優(yōu)化區(qū)之前插入孵化指令,所述孵化指令當由所述機器執(zhí)行時使得創(chuàng)建所述多個線程。
15.一種方法,包括分別在第一處理核心和第二處理核心中推測執(zhí)行來自代碼區(qū)的第一線程和第二線程;在所述第一處理核心和所述第二處理核心的每一個的第一級高速緩存中本地引退所述第一線程和所述第二線程的每個指令;在共享合并級高速緩存中全局地引退的所述第一線程和所述第二線程的每個指令; 將所述第一線程和所述第二線程的每一個執(zhí)行的排序指令存儲在與所述第一處理核心和所述第二處理核心的每一個相對應的存儲器先進先出(FIFO)隊列中;確定在所述第一線程和所述第二線程的執(zhí)行期間發(fā)生的條件,所述條件要求重構(gòu)所述代碼區(qū)的流;以及使用是存儲的執(zhí)行的排序指令來重構(gòu)所述代碼區(qū)的流。
16.根據(jù)權利要求15所述的方法,還包括讀取存儲在所述存儲器FIFO隊列之一中的被推測執(zhí)行的所述代碼區(qū)的第一排序指令;讀取與所述第一排序指令相關聯(lián)的程序次序指針(POP)值;以及當所述POP值指示存儲器FIFO切換時,切換到其他存儲器FIFO隊列并且讀取其首先存儲的指令。
17.根據(jù)權利要求16所述的方法,其中,所述POP值是存儲在所述存儲器FIFO中的1 比特值。
18.根據(jù)權利要求16所述的方法,還包括當所述POP值指示沒有存儲器FIFO切換時,讀取所述存儲器FIFO隊列的下一個存儲的指令。
19.根據(jù)權利要求15所述的方法,其中,軟件使用所存儲的執(zhí)行的排序指令來執(zhí)行所述代碼區(qū)的流的重構(gòu)。
20.根據(jù)權利要求15所述的方法,其中,硬件核心間存儲器一致性模塊(ICMC)使用所存儲的執(zhí)行的排序指令來執(zhí)行所述代碼區(qū)的流的重構(gòu)。
全文摘要
描述了用于將順序程序分解為多個線程、執(zhí)行這些線程和重構(gòu)線程的順序執(zhí)行的系統(tǒng)、方法和裝置。多個數(shù)據(jù)高速緩存單元(DCU)存儲推測執(zhí)行的線程的在本地引退的指令。合并級高速緩存(MLC)合并來自DCU的行的數(shù)據(jù)。核心間存儲器一致性模塊(ICMC)在MLC中全局地引退推測執(zhí)行的線程的指令。
文檔編號G06F12/00GK102171650SQ200980139244
公開日2011年8月31日 申請日期2009年11月24日 優(yōu)先權日2008年11月24日
發(fā)明者A·岡薩雷斯, A·馬蒂內(nèi), C·馬德里斯, E·吉貝爾, F·拉托雷, J·M·科迪納, P·洛佩斯, R·馬蒂內(nèi) 申請人:英特爾公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
千阳县| 内丘县| 黄浦区| 灌云县| 华池县| 嵊州市| 宜兴市| 沂南县| 称多县| 临猗县| 正宁县| 洛阳市| 永嘉县| 天等县| 湘西| 修武县| 临夏市| 元江| 门头沟区| 荣成市| 宁陕县| 晋中市| 泗洪县| 赣州市| 登封市| 桐庐县| 揭东县| 永新县| 漾濞| 镇雄县| 汝阳县| 石棉县| 溧阳市| 沙洋县| 塔城市| 德安县| 镇远县| 隆子县| 赣榆县| 清苑县| 甘肃省|