發(fā)明領(lǐng)域
本發(fā)明總體上涉及處理器設(shè)計(jì),并具體地涉及用于運(yùn)行時(shí)代碼并行化的方法和系統(tǒng)。
發(fā)明背景
已經(jīng)提出了用于在運(yùn)行時(shí)動(dòng)態(tài)地并行化軟件代碼的各種技術(shù)。例如,akkary和driscoll在1998年12月的第31屆微體系結(jié)構(gòu)年度國(guó)際研討會(huì)的論文集“adynamicmultithreadingprocessor”中描述了實(shí)現(xiàn)單個(gè)程序的動(dòng)態(tài)多線程執(zhí)行的處理器架構(gòu),該文章通過引用并入本文。
marcuellu等人在1998年的第12屆國(guó)際超級(jí)計(jì)算會(huì)議的論文集“speculativemultithreadedprocessors”中描述了一種處理器微架構(gòu),該微架構(gòu)通過不需要編譯器或用戶支持的控制推測(cè)技術(shù)來同時(shí)執(zhí)行從單個(gè)程序獲得的多個(gè)控制線程,該文章通過引用并入本文。
marcuello和gonzales在1999年的第13屆國(guó)際超級(jí)計(jì)算會(huì)議的論文集“clusteredspeculativemultithreadedprocessors”中提出了在運(yùn)行時(shí)從單線程應(yīng)用中產(chǎn)生推測(cè)性線程的微架構(gòu),該文章通過引用并入本文。
在2000年的第14屆并行與分布式處理國(guó)際研討會(huì)的論文集“aquantitativeassessmentofthread-levelspeculationtechniques”(其通過引用并入本文)中,marcuello和gonzales分析了不同線程推測(cè)技術(shù)的益處以及線程單元中的值預(yù)測(cè)、分支預(yù)測(cè)、線程初始化開銷和連接的影響。
ortiz-arroyo和lee在2003年的第16屆并行與分布式計(jì)算系統(tǒng)的國(guó)際會(huì)議(pdcs'03)的論文集“dynamicsimultaneousmultithreadedarchitecture”中描述了被稱為動(dòng)態(tài)同時(shí)多線程(dsmt)的多線程架構(gòu),該多線程架構(gòu)在同時(shí)多線程處理器核上執(zhí)行來自單個(gè)程序的多個(gè)線程的,該文章通過引用并入本文。
發(fā)明概述
本文所述的本發(fā)明的實(shí)施例提供一種方法,該方法包括在執(zhí)行程序代碼的指令的處理器中,監(jiān)控遍歷流控制軌跡的指令的重復(fù)序列中的指令,以構(gòu)造所監(jiān)控的指令進(jìn)行的寄存器訪問的規(guī)范?;谠撘?guī)范,調(diào)用多個(gè)硬件線程以至少部分地并行地執(zhí)行重復(fù)指令序列的相應(yīng)段。在執(zhí)行期間,在段中的至少一個(gè)中繼續(xù)進(jìn)行對(duì)指令的監(jiān)控。
在一些實(shí)施例中,繼續(xù)監(jiān)控指令包括響應(yīng)于在給定段中檢測(cè)到對(duì)不同流控制軌跡的變化,通過監(jiān)控沿著不同流控制軌跡的指令來創(chuàng)建并構(gòu)造用于不同流控制軌跡的不同規(guī)范。該方法可以包括在監(jiān)控不同的流控制軌跡之后,保存不同的規(guī)范或不同的流控制軌跡。
在一些實(shí)施例中,重復(fù)序列包括循環(huán)或函數(shù)。在實(shí)施例中,繼續(xù)監(jiān)控指令包括繼續(xù)監(jiān)控所有段。可替代地,繼續(xù)監(jiān)控指令可以包括繼續(xù)監(jiān)控跟隨流控制軌跡的段的至少一個(gè)子集。此外,可替代地,繼續(xù)監(jiān)控指令可以包括選擇段的部分子集,并且繼續(xù)監(jiān)控所選擇的子集中的段。選擇子集可以包括選擇用于繼續(xù)監(jiān)控的被創(chuàng)建的每第n個(gè)段,根據(jù)預(yù)定義的周期模式選擇用于繼續(xù)監(jiān)控的段,和/或隨機(jī)選擇用于繼續(xù)監(jiān)控的段。
在一些實(shí)施例中,該方法包括在中止重復(fù)序列之后的給定數(shù)量的周期、指令或微操作內(nèi)終止對(duì)給定段中的指令的監(jiān)控。在示例實(shí)施例中,基于為具有不同控制流軌跡的不同段設(shè)置的給定數(shù)量來設(shè)置給定段的給定數(shù)量。
根據(jù)本發(fā)明的實(shí)施例,另外提供了包括執(zhí)行流水線和監(jiān)控單元的處理器。執(zhí)行流水線被配置為執(zhí)行程序代碼的指令。監(jiān)控單元被配置為監(jiān)控遍歷流控制軌跡的指令的所識(shí)別的重復(fù)指令序列,以便構(gòu)造所監(jiān)控的指令進(jìn)行的寄存器訪問的規(guī)范,被配置為基于該規(guī)范,調(diào)用執(zhí)行流水線中的多個(gè)硬件線程以至少部分并行地執(zhí)行重復(fù)指令序列的相應(yīng)段,并且在執(zhí)行期間繼續(xù)監(jiān)控段中的至少一個(gè)中的指令。
根據(jù)本發(fā)明的實(shí)施例,還提供了一種方法,該方法包括在執(zhí)行程序代碼的指令的處理器中,監(jiān)控指令的重復(fù)序列中的指令,以構(gòu)造所監(jiān)控的指令進(jìn)行的寄存器訪問的規(guī)范?;谒O(jiān)控的指令,對(duì)終止標(biāo)準(zhǔn)進(jìn)行評(píng)估。如果滿足終止標(biāo)準(zhǔn),則終止對(duì)指令的監(jiān)控。如果對(duì)指令的監(jiān)控在不滿足終止標(biāo)準(zhǔn)的情況下結(jié)束,則基于規(guī)范,將重復(fù)指令序列的多個(gè)段的執(zhí)行并行化。
在一些實(shí)施例中,終止標(biāo)準(zhǔn)取決于對(duì)寄存器的最后寫入的位置,被寫入的寄存器的數(shù)目,指令或微操作的計(jì)數(shù)、執(zhí)行周期的計(jì)數(shù)和/或分支指令的數(shù)目超過閾值。另外或可替代地,終止標(biāo)準(zhǔn)可以取決于監(jiān)控到達(dá)先前監(jiān)控的程序代碼中的位置、監(jiān)控到達(dá)被識(shí)別為重復(fù)的程序代碼中的位置、在監(jiān)控期間或之前發(fā)生的分支誤預(yù)測(cè),和/或取決于處理器的一個(gè)或更多個(gè)標(biāo)志作為全局或全局-局部的分類。
在實(shí)施例中,該規(guī)范與由所監(jiān)控的指令遍歷的流控制軌跡唯一地相關(guān)聯(lián)。在另一個(gè)實(shí)施例中,該規(guī)范與由所監(jiān)控的指令遍歷的兩個(gè)或更多個(gè)流控制軌跡相關(guān)聯(lián)。
在實(shí)施例中,在處理器的執(zhí)行流水線中對(duì)指令進(jìn)行解碼之后立即執(zhí)行對(duì)指令的監(jiān)控。在另一個(gè)實(shí)施例中,在處理器的執(zhí)行流水線中執(zhí)行指令之前執(zhí)行對(duì)指令的監(jiān)控,其包括監(jiān)控隨后將被清除的推測(cè)性指令。在一些實(shí)施例中,該方法包括在整個(gè)監(jiān)控期間保留寄存器的相應(yīng)名稱。
根據(jù)本發(fā)明的實(shí)施例,還提供了一種方法,其包括在執(zhí)行程序代碼的指令的處理器中,監(jiān)控指令的重復(fù)序列,并且根據(jù)其中每個(gè)寄存器被指令用作操作數(shù)或目的地的相應(yīng)順序來對(duì)由所監(jiān)控的指令訪問的寄存器進(jìn)行分類?;诩拇嫫鞯姆诸悾瑢⒅貜?fù)序列的多個(gè)段的執(zhí)行并行化。
在一些實(shí)施例中,對(duì)寄存器進(jìn)行分類包括將寄存器中的至少一些分類為以下寄存器中的一個(gè):局部寄存器,其在所監(jiān)控的序列中的第一次出現(xiàn)是作為目的地;全局寄存器,其在所監(jiān)控的序列中僅用作操作數(shù);以及全局-局部寄存器,其在所監(jiān)控的序列中的第一次出現(xiàn)是作為操作數(shù),并且隨后在所監(jiān)控的序列中被用作目的地。
在實(shí)施例中,對(duì)寄存器進(jìn)行分類包括,如果給定寄存器作為條件指令中的目的地首次出現(xiàn)在所監(jiān)控的序列中,則將該給定寄存器分類為全局-局部寄存器。在實(shí)施例中,對(duì)寄存器進(jìn)行分類包括,如果給定寄存器作為條件指令中的目的地第一次出現(xiàn)在所監(jiān)控的序列中,則將該給定寄存器分類為全局-局部寄存器,否則如果滿足條件指令的條件,則將給定寄存器分類為局部寄存器。
在另一個(gè)實(shí)施例中,對(duì)寄存器進(jìn)行分類包括,如果給定寄存器作為相同指令中的操作數(shù)和目的地兩者第一次出現(xiàn)在所監(jiān)控的序列中,則將該給定寄存器分類為全局-局部寄存器。
在一些實(shí)施例中,對(duì)寄存器進(jìn)行分類還包括針對(duì)寄存器的至少一個(gè)子集,識(shí)別對(duì)寄存器的最后寫入操作在所監(jiān)控的序列中的相應(yīng)位置。在公開的實(shí)施例中,識(shí)別最后寫入操作的位置包括將對(duì)寄存器的至少一個(gè)子集的寫入進(jìn)行計(jì)數(shù)??商娲?,識(shí)別最后寫入操作的位置可以包括記錄最后寫入操作的地址。
在實(shí)施例中,除了寄存器之外,還對(duì)處理器的一個(gè)或更多個(gè)標(biāo)志執(zhí)行對(duì)最后寫入操作的位置的識(shí)別。在另一個(gè)實(shí)施例中,寄存器的子集至少包括分類為局部寄存器的寄存器。在又一個(gè)實(shí)施例中,寄存器的子集至少包括分類為全局-局部寄存器的寄存器。
在示例實(shí)施例中,對(duì)最后寫入操作的位置的識(shí)別包括對(duì)相應(yīng)寄存器的條件寫入操作。在實(shí)施例中,除了寄存器之外,還針對(duì)處理器的一個(gè)或更多個(gè)標(biāo)志執(zhí)行根據(jù)作為操作數(shù)或目的地的使用順序的分類。
根據(jù)本發(fā)明的實(shí)施例,另外提供了包括執(zhí)行流水線和監(jiān)控單元的處理器。執(zhí)行流水線被配置為執(zhí)行程序代碼的指令。監(jiān)控單元被配置為監(jiān)控指令的重復(fù)序列中的指令,以便構(gòu)造所監(jiān)控的指令進(jìn)行的寄存器訪問的規(guī)范,被配置為基于所監(jiān)控的指令,對(duì)終止標(biāo)準(zhǔn)進(jìn)行評(píng)估,如果滿足終止標(biāo)準(zhǔn),則終止對(duì)指令的監(jiān)控,并且如果對(duì)指令的監(jiān)控在不滿足終止標(biāo)準(zhǔn)的情況下結(jié)束,則基于規(guī)范,將重復(fù)指令序列的多個(gè)段的執(zhí)行并行化。
根據(jù)本發(fā)明的實(shí)施例,還提供了包括執(zhí)行流水線和監(jiān)控單元的處理器。執(zhí)行流水線被配置為執(zhí)行程序代碼的指令。監(jiān)控單元被配置為監(jiān)控指令的重復(fù)序列,被配置為根據(jù)其中每個(gè)寄存器被指令用作操作數(shù)或目的地的相應(yīng)順序來對(duì)由所監(jiān)控的指令訪問的寄存器進(jìn)行分類,并且基于寄存器的分類來并行化重復(fù)序列的多個(gè)段的執(zhí)行。
從結(jié)合附圖進(jìn)行的本發(fā)明的實(shí)施例的以下詳細(xì)描述,本發(fā)明將被更完全地理解,其中:
附圖簡(jiǎn)述
圖1是根據(jù)本發(fā)明的實(shí)施例示意性地圖示了執(zhí)行運(yùn)行時(shí)代碼并行化的處理器的框圖;
圖2是根據(jù)本發(fā)明的實(shí)施例示意性地圖示了程序循環(huán)的運(yùn)行時(shí)并行化的圖;
圖3是根據(jù)本發(fā)明的實(shí)施例的具有多個(gè)軌跡和相應(yīng)記分板的程序循環(huán)的圖;以及
圖4是根據(jù)本發(fā)明的實(shí)施例示意性地圖示了用于連續(xù)監(jiān)控重復(fù)指令序列的方法的流程圖。
具體實(shí)施方式
綜述
本文中描述的本發(fā)明的實(shí)施例提供了用于在處理器中對(duì)代碼的運(yùn)行時(shí)并行化的改進(jìn)的方法和設(shè)備。在所公開的實(shí)施例中,處理器識(shí)別重復(fù)的指令序列,且創(chuàng)建和執(zhí)行被稱為段的多個(gè)并行代碼序列,其執(zhí)行不同出現(xiàn)的序列。這些段被調(diào)度,以用于通過多個(gè)硬件線程進(jìn)行并行執(zhí)行。
例如,重復(fù)序列可以包括循環(huán),在這種情況下,段包括多個(gè)循環(huán)迭代、迭代的部分或循環(huán)的延續(xù)。作為另一示例,重復(fù)序列可以包括函數(shù),在這種情況下,段包括多個(gè)函數(shù)調(diào)用,函數(shù)的部分或函數(shù)延續(xù)。在運(yùn)行時(shí),對(duì)預(yù)編譯代碼執(zhí)行并行化。術(shù)語“重復(fù)序列”通常指的是被重新訪問并執(zhí)行多次的任何指令序列。
在一些實(shí)施例中,在識(shí)別重復(fù)序列時(shí),處理器監(jiān)控序列中的指令并構(gòu)建“記分板”-由所監(jiān)控的指令對(duì)寄存器的訪問的規(guī)范。記分板與由所監(jiān)控的序列遍歷的特定流控制軌跡相關(guān)聯(lián)。處理器基于在記分板和軌跡中收集的信息來決定如何以及何時(shí)創(chuàng)建和執(zhí)行多個(gè)段。
在一些實(shí)施例中,記分板包括由所監(jiān)控的指令訪問的寄存器的分類。寄存器的分類取決于其中寄存器被用作所監(jiān)控的指令中的操作數(shù)或目的地的順序。
在一些實(shí)施例中,盡管微操作與指令不同,但同樣按照與監(jiān)控指令類似的方式對(duì)微操作進(jìn)行監(jiān)控。換句話說,在一些實(shí)施例中,按照微操作粒度而不是指令粒度來產(chǎn)生記分板并執(zhí)行監(jiān)控。
該分類可以例如在其首次出現(xiàn)是作為目的地的局部(l)寄存器、僅用作操作數(shù)的全局(g)寄存器以及全局-局部(gl)寄存器之間進(jìn)行區(qū)分,該gl寄存器的首次出現(xiàn)是作為操作數(shù)且隨后用作目的地。另外或可替代地,記分板可以針對(duì)至少一些寄存器指示對(duì)寄存器的最后寫入操作的所監(jiān)控的序列中的位置。該指示可以包括例如對(duì)寄存器的寫入操作次數(shù)的計(jì)數(shù)。
在一些實(shí)施例中,處理器在執(zhí)行期間繼續(xù)監(jiān)控一個(gè)或更多個(gè)段中的指令。這種繼續(xù)監(jiān)控使得處理器能夠快速且有效地對(duì)流控制軌跡中可能例如由于數(shù)據(jù)相關(guān)性條件分支指令而發(fā)生在所監(jiān)控的段中的變化作出反應(yīng)。本文描述了選擇標(biāo)準(zhǔn)的幾個(gè)示例,處理器可以使用該選擇標(biāo)準(zhǔn)來選擇用于繼續(xù)監(jiān)控的段。
在一些實(shí)施例中,處理器在某個(gè)段結(jié)束之前終止并中斷對(duì)該段的監(jiān)控。本文描述了可由處理器使用的各種終止標(biāo)準(zhǔn)。附加公開的技術(shù)保持用于多個(gè)相應(yīng)的流控制軌跡的多個(gè)同步記分板,并且適當(dāng)?shù)卦谒鼈冎g交替。
處理器架構(gòu)
圖1是根據(jù)本發(fā)明的實(shí)施例示意性地圖示處理器20的框圖。處理器20運(yùn)行預(yù)編譯的軟件代碼,同時(shí)使代碼執(zhí)行并行化。處理器在運(yùn)行時(shí)通過在程序指令從存儲(chǔ)器中被提取并被解碼的時(shí)候?qū)ζ溥M(jìn)行分析來執(zhí)行并行化決策。
在本示例中,處理器20包括執(zhí)行流水線,該執(zhí)行流水線包括一個(gè)或更多個(gè)提取單元24、一個(gè)或更多個(gè)解碼單元28、亂序(ooo)緩沖器32和執(zhí)行單元36。提取單元24從多級(jí)指令高速緩存中提取程序指令,該高速緩存存儲(chǔ)器在本示例中包括1級(jí)(l1)指令高速緩存40和2級(jí)(l2)指令高速緩存44。
分支預(yù)測(cè)單元48預(yù)測(cè)在執(zhí)行期間預(yù)期由程序遍歷的流控制軌跡(在本文中為了簡(jiǎn)短起見而被稱為“軌跡”)。預(yù)測(cè)通?;谟商崛卧?4提取的先前指令的地址或程序計(jì)數(shù)器(pc)值。基于預(yù)測(cè),分支預(yù)測(cè)單元48指示提取單元24將提取哪些新的指令。單元48的流控制預(yù)測(cè)也影響代碼執(zhí)行的并行化,如以下將解釋的。
由解碼單元28解碼的指令存儲(chǔ)在ooo緩沖器32中,以用于通過執(zhí)行單元36進(jìn)行亂序執(zhí)行,即,不按照指令被編譯和存儲(chǔ)在存儲(chǔ)器中的順序。可替代地,所緩沖的指令可以按順序執(zhí)行。隨后發(fā)出所緩沖的指令,以供各種執(zhí)行單元36執(zhí)行。在本示例中,執(zhí)行單元36包括一個(gè)或更多個(gè)乘法累加(mac)單元、一個(gè)或更多個(gè)算術(shù)邏輯單元(alu)和一個(gè)或更多個(gè)加載/存儲(chǔ)單元。另外或可替代地,執(zhí)行單元36可以包括其他合適類型的執(zhí)行單元,例如浮點(diǎn)單元(fpu)。
由執(zhí)行單元36產(chǎn)生的結(jié)果被存儲(chǔ)在寄存器文件和/或多級(jí)數(shù)據(jù)高速緩存存儲(chǔ)器中,其在本示例中包括1級(jí)(l1)數(shù)據(jù)高速緩存52和2級(jí)(l2)數(shù)據(jù)高速緩存56。在一些實(shí)施例中,l2數(shù)據(jù)高速緩存存儲(chǔ)器56和l2指令高速緩存存儲(chǔ)器44被實(shí)現(xiàn)為相同物理存儲(chǔ)器中單獨(dú)的存儲(chǔ)器區(qū)域或者在沒有固定預(yù)分配的情況下簡(jiǎn)單地共享相同的存儲(chǔ)器。
在一些實(shí)施例中,處理器20還包括負(fù)責(zé)運(yùn)行時(shí)代碼并行化的線程監(jiān)控和執(zhí)行單元60。下面詳細(xì)說明單元60的功能。
圖1中所示的處理器20的配置是示例配置,其純粹為了概念清楚起見而被選擇。在替代實(shí)施例中,可使用任何其他合適的處理器配置。例如,在圖1的配置中,使用多個(gè)提取單元24和多個(gè)解碼單元28來實(shí)現(xiàn)多線程。每個(gè)硬件線程可以包括被分配以提取用于線程的指令的提取單元以及被分配以對(duì)所提取的指令進(jìn)行解碼的解碼單元。另外或可替代地,多線程可以以許多其他方式實(shí)現(xiàn),例如使用每線程的多個(gè)ooo緩沖器、單獨(dú)的執(zhí)行單元和/或每線程的單獨(dú)的寄存器文件。在另一個(gè)實(shí)施例中,不同的線程可以包括不同的相應(yīng)處理核心。
作為又一個(gè)示例,可以在沒有高速緩存或有不同的高速緩存結(jié)構(gòu),在每線程沒有分支預(yù)測(cè)或者有單獨(dú)的分支預(yù)測(cè)的情況下實(shí)現(xiàn)處理器。處理器可以包括附加元件,例如,僅舉幾個(gè)例子,重排序緩沖器(rob)、寄存器重命名。此外,可替代地,所公開的技術(shù)可以用具有任何其它合適的微架構(gòu)的處理器執(zhí)行。
處理器20可以使用任何合適的硬件例如使用一個(gè)或更多個(gè)專用集成電路(asic)、現(xiàn)場(chǎng)可編程門陣列(fpga)或其他設(shè)備類型來實(shí)現(xiàn)。另外或可替代地,可使用軟件或使用硬件和軟件元件的組合來實(shí)現(xiàn)處理器20的某些元件。可以使用諸如隨機(jī)存取存儲(chǔ)器(ram)的任何合適類型的存儲(chǔ)器來實(shí)現(xiàn)指令高速緩存存儲(chǔ)器和數(shù)據(jù)高速緩存存儲(chǔ)器。
處理器20可以用軟件編程以執(zhí)行本文中所描述的功能。該軟件可通過網(wǎng)絡(luò)以電子形式下載到處理器,例如,或者可替代地或另外,它可以被提供和/或儲(chǔ)存在非暫時(shí)性有形介質(zhì)上,諸如,磁存儲(chǔ)器、光存儲(chǔ)器或電子存儲(chǔ)器。
運(yùn)行時(shí)代碼并行化
在一些實(shí)施例中,處理器20中的單元60識(shí)別重復(fù)的指令序列并且使其執(zhí)行并行化。重復(fù)指令序列可以包括例如,程序循環(huán)的相應(yīng)迭代、函數(shù)或過程的相應(yīng)出現(xiàn)或被多次重新訪問和執(zhí)行的任何其他合適的指令序列。在本上下文中,術(shù)語“重復(fù)指令序列”是指在過去至少一次執(zhí)行其流控制軌跡(例如,pc值序列)的指令序列。數(shù)據(jù)值(例如,寄存器值)可能因執(zhí)行而異。
在所公開的實(shí)施例中,處理器20通過使用多個(gè)硬件線程并行或半并行地調(diào)用和執(zhí)行多個(gè)代碼段來并行化重復(fù)指令序列。每個(gè)線程執(zhí)行相應(yīng)的代碼段,例如循環(huán)的相應(yīng)迭代、多個(gè)(不一定是連續(xù)的)循環(huán)迭代、循環(huán)迭代的一部分、循環(huán)的延續(xù)、其函數(shù)或一部分或延續(xù)或任何其它合適類型的段。
使用多個(gè)硬件線程來執(zhí)行處理器20中段的并行化。在圖1的示例中,盡管不是必然的,但每個(gè)線程包括已經(jīng)由單元60分配以執(zhí)行一個(gè)或更多個(gè)段的相應(yīng)提取單元24和相應(yīng)解碼單元28。
實(shí)際上,數(shù)據(jù)依賴性存在于段之間。例如,在某個(gè)循環(huán)迭代中執(zhí)行的計(jì)算可取決于在先前迭代中執(zhí)行的計(jì)算的結(jié)果。使段并行化的能力在很大程度上取決于這種數(shù)據(jù)依賴性。
圖2是根據(jù)本發(fā)明的示例實(shí)施例展示了程序循環(huán)的運(yùn)行時(shí)并行化的圖。該圖的頂部示出了示例程序循環(huán)(從specint測(cè)試套件的bzip基準(zhǔn)測(cè)試版重現(xiàn)的)和指令之間的依賴性。一些依賴性在相同循環(huán)迭代中的指令之間,而其他依賴性在給定循環(huán)迭代中的指令和先前迭代中的指令之間。
該圖的底部示出了根據(jù)本發(fā)明的實(shí)施例的單元60如何使用四個(gè)線程th1...th4來并行化該循環(huán)。該表跨越總共十一個(gè)周期,并列出了在每個(gè)周期內(nèi)執(zhí)行哪些線程的哪些指令。每個(gè)指令由其迭代數(shù)和迭代中的指令數(shù)表示。例如,“14”表示第1循環(huán)迭代的第4個(gè)指令。在該示例中,指令5和指令7被忽略,并且假設(shè)完美的分支預(yù)測(cè)。
線程執(zhí)行中的參差(staggering)是由于數(shù)據(jù)依賴性。例如,由于指令21(第二次迭代中的第一指令)依賴于指令13(第一次迭代的第三指令),因此線程th2不能執(zhí)行指令21和指令22(第二次循環(huán)迭代中的前兩個(gè)指令)直到周期1。整個(gè)表中存在類似的依賴性??偟膩碚f,這種并行化方案能夠在六個(gè)周期內(nèi)執(zhí)行兩次循環(huán)迭代,或者每三個(gè)周期執(zhí)行一次迭代。
重要的是要注意,圖2中所示的并行化僅考慮指令之間的數(shù)據(jù)依賴性,而不考慮其他約束,諸如執(zhí)行單元的可用性。因此,圖2中的周期不一定直接轉(zhuǎn)換為相應(yīng)的時(shí)鐘周期。例如,圖2中列出為在給定周期內(nèi)執(zhí)行的指令實(shí)際上可能在多于一個(gè)時(shí)鐘周期內(nèi)執(zhí)行,因?yàn)樗鼈兏?jìng)爭(zhēng)相同的執(zhí)行單元36。
基于段監(jiān)控的并行化
在一些實(shí)施例中,單元60通過監(jiān)控處理器流水線中的指令來決定如何使代碼并行化。響應(yīng)于識(shí)別重復(fù)指令序列,單元60在序列被處理器提取、解碼和執(zhí)行時(shí)開始監(jiān)控該序列。
在一些實(shí)施方式中,單元60的功能可以分布在多個(gè)硬件線程之間,使得給定的線程可以被視為在執(zhí)行期間監(jiān)控其指令。然而,為了清楚起見,下面的描述假設(shè)監(jiān)控功能由單元60執(zhí)行。
作為監(jiān)控過程的一部分,單元60生成由所監(jiān)控的指令遍歷的流控制軌跡以及在本文中被稱為記分板的監(jiān)控表。記分板包括用于出現(xiàn)在所監(jiān)控的序列中的每個(gè)寄存器的相應(yīng)條目。在實(shí)施例中,單元60將每個(gè)寄存器分類為全局(g)、局部(l)或全局–局部(gl),并且指示記分板中相應(yīng)條目中的分類。作為g、l或gl的寄存器的分類取決于其中在所監(jiān)控的序列中寄存器被用作操作數(shù)(其值被讀取)和/或用作(值被寫入的)目的地的順序。
在實(shí)施例中,局部(l)寄存器被定義為其在所監(jiān)控的序列中的第一次出現(xiàn)是作為目的地(如果有的話,隨后的出現(xiàn)可以作為操作數(shù)和/或目的地)的寄存器。全局(g)寄存器被定義為在所監(jiān)控的序列中僅用作操作數(shù)的寄存器,即,寄存器被讀取但從不被寫入。全局-局部(gl)寄存器被定義為其在所監(jiān)控的序列中的第一次出現(xiàn)是作為操作數(shù)且隨后在所監(jiān)控的序列被用作目的地的寄存器。只要“第一次”和“隨后的”之間的順序被保留,則第一次出現(xiàn)和隨后的出現(xiàn)可能發(fā)生在不同的指令或相同的指令中。
在替代實(shí)施例中,上述分類的例外涉及將寄存器用作目的地的條件指令。如果這樣的指令是寄存器在所監(jiān)控的指令中的第一次出現(xiàn),則該寄存器被分類為gl。否則,根據(jù)上述規(guī)則,寄存器被分類為局部(l)。例如,如果指令“mov_condr2,#5”是對(duì)所監(jiān)控的指令中的r2的第一次寫入,則該指令中的寄存器r2將被分類為gl,否則寄存器r2被分類為l。在替代實(shí)施例中,如果這樣的指令是寄存器在所監(jiān)控的指令中的第一次出現(xiàn),則該寄存器被分類為gl。否則,只有當(dāng)滿足指令的條件時(shí),才將寄存器分類為局部。如果沒有滿足條件,則該寄存器不被分類。
在實(shí)施例中,單元60使用超集分類,即,將以上定義的兩個(gè)或更多個(gè)分類合并在一起。在這樣的實(shí)施例中,即使給定的寄存器在給定段中僅是局部的,單元60仍將其分類為gl,以簡(jiǎn)化控制。
將寄存器的分類定義為g、l或gl的替代方法是根據(jù)其中寄存器的依賴性相對(duì)于當(dāng)前監(jiān)控的段生成和使用的位置來對(duì)寄存器進(jìn)行分類:在當(dāng)前監(jiān)控的段之外生成的操作數(shù)被分類為全局(g)或全局-局部(gl)。在當(dāng)前監(jiān)控的段內(nèi)生成的操作數(shù)被分類為局部(l)。
在一些實(shí)施例中,單元60在記分板中針對(duì)至少一些寄存器找到并指示對(duì)所監(jiān)控的序列中的寄存器的最后寫入的位置。該指示在執(zhí)行期間由單元60使用,以用于決定何時(shí)發(fā)出依賴于該最后寫入的隨后的段中的指令。該機(jī)制背后的基本原理是,只有在段y的執(zhí)行中對(duì)該寄存器的最后寫入之后,才能發(fā)出依賴于先前段y中的寄存器的值的段x中的指令。
在一個(gè)實(shí)施例中,通過對(duì)所監(jiān)控的序列中寄存器被寫入的次數(shù)進(jìn)行計(jì)數(shù)來實(shí)現(xiàn)最后寫入指示。單位60確定此計(jì)數(shù)(表示為#writes),并在記分板中的寄存器的條目中指示該#writes值。
在該實(shí)施例中,當(dāng)執(zhí)行段y時(shí),單元60將對(duì)所討論的寄存器的寫入次數(shù)進(jìn)行計(jì)數(shù)。當(dāng)計(jì)數(shù)達(dá)到記分板中指示的#writes值時(shí),單元60斷定遇到最后的寫入,并因此允許發(fā)出依賴于所討論的寄存器的段x中的執(zhí)行指令。
用于減輕數(shù)據(jù)依賴性的一個(gè)已知解決方案是重命名寄存器,即,在不同的段中為給定的寄存器分配不同的名稱。在一些實(shí)施例中,單元60避免對(duì)寄存器進(jìn)行重命名,即,在重復(fù)序列的不同迭代中保留寄存器名稱,以便促進(jìn)對(duì)#writes的計(jì)數(shù)。換句話說,單元60維持在段和線程之間的寄存器重命名映射的對(duì)準(zhǔn)。
上面描述的#writes機(jī)制僅被描繪為用于在所監(jiān)控的序列中找到并指示對(duì)寄存器的最后寫入的位置的機(jī)制的示例。在替代實(shí)施例中,單元60可以以任何其它合適的方式在記分板中找到并指示對(duì)寄存器的最后寫入的位置,例如通過在記分板中記錄對(duì)寄存器的最后寫入操作的地址。
在各種實(shí)施例中,單元60不一定需要對(duì)每個(gè)寄存器的#writes進(jìn)行計(jì)數(shù)。例如,單元60可以針對(duì)分類為gl的寄存器、針對(duì)分類為l的寄存器或兩者,對(duì)#writes進(jìn)行計(jì)數(shù)。
在一些實(shí)施例中,單元60在#writes的計(jì)數(shù)中包括條件寫入指令,而不管該條件是否被滿足。在其他實(shí)施例中,單元60僅在滿足條件并且實(shí)際執(zhí)行寫入時(shí)才在#writes的計(jì)數(shù)中包括條件寫入指令。
在一些實(shí)施例中,處理器20保持在條件指令中使用的一個(gè)或更多個(gè)標(biāo)志。標(biāo)志的示例包括零標(biāo)志(如果最近的算術(shù)運(yùn)算的結(jié)果為零,則為“真”,否則為“假”)、負(fù)標(biāo)志(如果最近的算術(shù)運(yùn)算的結(jié)果為負(fù),則為“真”,否則為“假”)、進(jìn)位標(biāo)志(如果最近的加法運(yùn)算產(chǎn)生進(jìn)位,則為“真”,否則為“假”)、溢出標(biāo)志(如果最近的加法運(yùn)算引起溢出,則為“真”,否則為“假”)或任何其他合適的標(biāo)志。通常,標(biāo)志被實(shí)現(xiàn)為專用標(biāo)志寄存器中的相應(yīng)位。標(biāo)志由各種指令或微操作更新。
在一些實(shí)施例中,單元60以與監(jiān)控寄存器類似的方式監(jiān)控標(biāo)志并將它們包含在記分板中。例如,如以上所解釋的,單元60可以將標(biāo)志分類為g、l或gl。另外或可替代地,單元60可以對(duì)所監(jiān)控的序列中的每個(gè)標(biāo)志的最后寫入的位置進(jìn)行計(jì)數(shù)和記錄(例如,通過對(duì)標(biāo)志的#writes進(jìn)行計(jì)數(shù)和記錄)。
在一些實(shí)施例中,單元60并不一定總是從頭到尾監(jiān)控整個(gè)段。在示例實(shí)施例中,單元60可以從段中的某個(gè)中點(diǎn)開始監(jiān)控(例如,對(duì)寫入進(jìn)行計(jì)數(shù)和/或?qū)拇嫫鬟M(jìn)行分類),并且更新現(xiàn)有記分板。
對(duì)多個(gè)軌跡的連續(xù)監(jiān)控
在一些實(shí)施例中,單元60在其執(zhí)行期間繼續(xù)監(jiān)控一個(gè)或更多個(gè)線程中的指令。換句話說,一旦重復(fù)指令序列被識(shí)別和監(jiān)控,監(jiān)控過程就不會(huì)結(jié)束。在執(zhí)行期間,單元60針對(duì)至少一些線程繼續(xù)進(jìn)行監(jiān)控和記分板構(gòu)造過程。如上所述,單元60的功能可以分布在線程之間,使得每個(gè)線程(或線程的至少一個(gè)子集)監(jiān)控其執(zhí)行的指令。
在執(zhí)行期間對(duì)段的連續(xù)監(jiān)控是重要的,例如,用于有效地處理其中程序執(zhí)行在運(yùn)行時(shí)從一個(gè)流控制軌跡切換到另一個(gè)流控制軌跡的場(chǎng)景。在許多實(shí)際場(chǎng)景下,該程序在具有不同軌跡的兩個(gè)或更多個(gè)重復(fù)指令序列之間交替。在一些實(shí)施例中,單元60通過并行地創(chuàng)建和保持多個(gè)不同的記分板、用于每個(gè)軌跡的相應(yīng)記分板來處理這樣的場(chǎng)景。
圖3是根據(jù)本發(fā)明的實(shí)施例示意性地圖示了具有多個(gè)軌跡和相應(yīng)記分板的程序循環(huán)的圖。該圖的左側(cè)圖示了具有九個(gè)指令的一段代碼。程序循環(huán)從指令2開始并在指令9處循環(huán)回去。
在該示例中,指令4是跳轉(zhuǎn)到指令6并跳過指令5的條件分支指令。因此,根據(jù)條件分支指令的結(jié)果,一些段將跟隨被表示為70a的軌跡(未采用分支),而其他線程將跟隨被表示為70b的軌跡(采用分支)。
在一些實(shí)施例中,單元60在其執(zhí)行期間監(jiān)控至少一些段。當(dāng)檢測(cè)到被監(jiān)控的段開始跟隨先前未知的軌跡時(shí),單元60為新軌跡創(chuàng)建單獨(dú)的記分板,并且記錄寄存器分類和#writes,如以上所解釋的。在本示例中,單元60創(chuàng)建并保持用于軌跡70a的記分板74a和用于軌跡70b的記分板74b。
通過保持多個(gè)記分板,單元60能夠快速地對(duì)軌跡變化做出反應(yīng)。只要段跟隨先前監(jiān)控的軌跡,單元60就已經(jīng)具有用于該軌跡的有效的記分板。因此,單元60能夠使用可用的記分板來立即調(diào)用新的段。在沒有這種機(jī)制的情況下,對(duì)新的段的調(diào)用將被延遲,直到用于新的軌跡的記分板被構(gòu)造(意味著效率降低,并且處理器可能錯(cuò)誤地假定其監(jiān)控的軌跡是新的)。
圖3的多軌跡場(chǎng)景是為了展示連續(xù)監(jiān)控和多個(gè)記分板的機(jī)制而描繪的簡(jiǎn)單的示例場(chǎng)景。所公開的技術(shù)可以用于其中執(zhí)行在多個(gè)流控制軌跡之間交替的任何其他合適類型的場(chǎng)景中。
圖4是根據(jù)本發(fā)明的實(shí)施例示意性地圖示用于連續(xù)監(jiān)控重復(fù)指令序列的方法的流程圖。該圖說明了給定線程中的組合執(zhí)行和監(jiān)控。單元60通常針對(duì)被選擇用于監(jiān)控的任何序列執(zhí)行該過程,而不一定是對(duì)于每個(gè)被執(zhí)行的段。
在啟動(dòng)步驟80,該方法始于單元60向給定硬件線程提供給定的軌跡和對(duì)應(yīng)的記分板。在執(zhí)行&監(jiān)控步驟84,所討論的線程執(zhí)行段并且并行地執(zhí)行監(jiān)控。作為監(jiān)控過程的一部分,線程生成用于其跟隨的軌跡的記分板。
在完成段的執(zhí)行之后,在檢查步驟88,單元60檢查軌跡是否是新的。換句話說,單元60檢查用于該軌跡的記分板是否已經(jīng)存在。如果軌跡是新的,則單元60在記錄步驟92記錄為該軌跡構(gòu)造的記分板。該記分板將被提供給跟隨相同軌跡的隨后的線程。否則,即如果記分板已經(jīng)存在,則該方法在結(jié)束步驟96處結(jié)束。
在一些實(shí)施例中,記分板與單個(gè)流控制軌跡唯一地相關(guān)聯(lián)。在其他實(shí)施例中,給定的記分板可以與兩個(gè)或更多個(gè)軌跡相關(guān)聯(lián)。
在一些實(shí)施例中,單元60在執(zhí)行期間例如使用圖4的方法來監(jiān)控每個(gè)段。在替代實(shí)施例中,單元60可以選擇僅監(jiān)控段的子集。通過控制被選擇用于監(jiān)控的段的數(shù)量和標(biāo)識(shí),在計(jì)算開銷和并行化性能之間設(shè)置不同的權(quán)衡是可能的。
單元60可以使用各種標(biāo)準(zhǔn)或邏輯來選擇監(jiān)控哪些段。例如,單元60可以周期性地選擇用于監(jiān)控的段,例如,(對(duì)于某個(gè)選定的常數(shù)n)被調(diào)用的每第n個(gè)段。在另一個(gè)實(shí)施例中,單元60可以根據(jù)預(yù)定義的確定性模式(例如,段2、3、5、12、13、15、22、23、25...)來選擇監(jiān)控段。作為另一示例,單元60可以隨機(jī)選擇用于監(jiān)控的段,例如,跳過隨機(jī)數(shù)量的段,選擇用于監(jiān)控的段,跳過另一個(gè)隨機(jī)數(shù)量的段,選擇用于監(jiān)控的段等等。
作為又一個(gè)示例,單元60可以響應(yīng)于在段的執(zhí)行期間發(fā)生的一些預(yù)定義的事件來選擇用于監(jiān)控的段。由于不同的線程可能跟隨不同的流控制軌跡,所以單元60可以選擇監(jiān)控跟隨感興趣的特定軌跡的段。此外,可替代地,單元60可以在執(zhí)行期間使用任何其它合適的標(biāo)準(zhǔn)來選擇用于監(jiān)控的段。
在實(shí)施例中,通過單元60進(jìn)行的監(jiān)控在解碼模塊28的輸出端處的指令上執(zhí)行。在流水線中的這一點(diǎn)處,在一些被解碼的指令將被清除且不被提交的意義上,指令仍然是推測(cè)性的。例如,由于分支誤預(yù)測(cè),清除可能發(fā)生。然而,優(yōu)選的是在這個(gè)早期階段監(jiān)控指令,因?yàn)橹噶钊匀话错樞虮唤M織。此外,在流水線的早期監(jiān)控指令使得單元60能夠以更低的延遲利用記分板(即,利用記分板調(diào)用并行段)。
監(jiān)控終止標(biāo)準(zhǔn)
在一些實(shí)施例中,單元60在給定段結(jié)束之前終止對(duì)該段的監(jiān)控。為此,可以通過單元60評(píng)估和使用各種終止標(biāo)準(zhǔn)。終止標(biāo)準(zhǔn)的幾個(gè)非限制性示例可包括:
■對(duì)寄存器的寫入次數(shù)超過閾值。
■被寫入的寄存器的數(shù)目超過閾值。
■指令或微操作的計(jì)數(shù)超過閾值。
■執(zhí)行周期的計(jì)數(shù)超過閾值。
■分支指令的數(shù)目超過閾值。
■監(jiān)控到達(dá)先前被監(jiān)控的程序代碼中的位置。
■監(jiān)控到達(dá)被標(biāo)識(shí)為重復(fù)的程序代碼(例如,反向分支或分支鏈路-bl)中的位置。
■分支誤預(yù)測(cè)發(fā)生在監(jiān)控中的指令之一或監(jiān)控之前的指令中。
■標(biāo)志是gl或全局。
此外,可替代地,可使用任何其他合適的終止標(biāo)準(zhǔn)。
雖然本文中所描述的實(shí)施例主要論述了通用處理器,但本文中所描述的方法和系統(tǒng)也可用在其他應(yīng)用中,諸如用在圖形處理單元(gpu)或其他專用處理器中。
因此,將認(rèn)識(shí)到,以上描述的實(shí)施例是通過示例的方式引用的,并且本發(fā)明并不限于上文中已特別示出和描述的內(nèi)容。相反,本發(fā)明的范圍包括上文所描述的各種特征的組合和子組合以及本發(fā)明的變型和修改,所述變型和修改將在本領(lǐng)域的技術(shù)人員閱讀前面描述之后想到的且在現(xiàn)有技術(shù)中未被公開。通過引用并入本專利申請(qǐng)的文件被視為本申請(qǐng)的組成部分,除了任何術(shù)語在這些所并入的文件中在某種程度上以與本說明書中明確地或隱含地作出的定義沖突的方式被定義之外,應(yīng)僅考慮本說明書中的定義。