專利名稱:支持單線程應(yīng)用程序的時分多路復(fù)用推理性多線程的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及提高計算機系統(tǒng)性能的技術(shù)。更具體地,本發(fā)明涉及支持單處理器流水線內(nèi)的一個非推理性線程和相關(guān)推理性線程的交替執(zhí)行的方法和設(shè)備。
背景技術(shù):
隨著微處理器的時鐘速度繼續(xù)以指數(shù)速度增長,要設(shè)計能跟上這些更快的時鐘速度的處理器流水線正變得越來越難,因為在每個流水線階段,可用來執(zhí)行所需計算操作的時間更少。為了處理這個問題,有些設(shè)計人員已經(jīng)開始研究在單處理器流水線內(nèi)以循環(huán)方式靜態(tài)地交替執(zhí)行無關(guān)的處理器線程的可能性。在這種方法中,如果N個無關(guān)的線程交替,那么對于每N個連續(xù)的流水線階段,給定線程的指令只出現(xiàn)一次。因此,N個線程中的每一個都在處理器本地時鐘頻率的第1/N處運行。例如,4個線程,每個都在3GHz運行,可以共同在12GHz處理器上運行。
這種交替技術(shù)放寬了等待時間的需求,這使得設(shè)計高速處理器流水線容易得多。例如,如果4個無關(guān)的線程交替,那么數(shù)據(jù)緩存訪問(或者加法操作)可以占用4個流水線階段而不會對給定線程的性能帶來負(fù)面影響。
單流水線內(nèi)多線程的交替執(zhí)行有許多的優(yōu)點。與在獨立的流水線中執(zhí)行線程相比,它節(jié)省電力和面積。它還為單流水線提供大的總處理能力。
但是,不能多線程執(zhí)行的應(yīng)用程序或基準(zhǔn)程序則不能從這種交替技術(shù)中獲益。這是個問題,因為單線程性能對于購買計算機系統(tǒng)的眾多顧客來說是重要的。因此,顧客用來比較計算機系統(tǒng)性能的基準(zhǔn)程序通常測量單線程性能。
因此,所需要的是為單線程應(yīng)用程序提供多線程的靜態(tài)時分多路執(zhí)行優(yōu)勢的方法和設(shè)備。
發(fā)明內(nèi)容
本發(fā)明的一個實施例提供一個使單處理器流水線內(nèi)的頭線程和推理性線程的交替執(zhí)行更容易的系統(tǒng)。該系統(tǒng)的運行是通過使用頭線程來執(zhí)行程序指令,并通過使用推理性線程在頭線程之前推理性地執(zhí)行程序指令,其中頭線程和推理性線程通過單處理器流水線內(nèi)的時分多路復(fù)用交替來并發(fā)執(zhí)行。
在該實施例的一個變化中,推理性線程包括一個或多個推理性線程。
在該實施例的一個變化中,當(dāng)頭線程到達(dá)推理性線程開始執(zhí)行的程序點時,系統(tǒng)就在頭線程和推理性線程之間執(zhí)行連接操作。
在進(jìn)一步的變化中,頭線程在存儲單元的主版本上運行,推理性線程在存儲單元的時空維版本上運行(由相同發(fā)明人在美國專利號6,353,881中作為緊急申請完成,標(biāo)題為“Supporting Space-TimeDimensional Program Execution by Selectively Versioning MemoryUpdates”)。在這個變化中,執(zhí)行連接操作包括把存儲單元的時空維版本并入存儲單元的主版本中,以使對存儲單元的時空維版本的更新被合并到相應(yīng)的存儲單元的主版本中。
在進(jìn)一步的變化中,如果推理性線程對存儲單元執(zhí)行讀操作,那么該系統(tǒng)要確定該存儲單元的時空維版本是否存在。如果存在,該系統(tǒng)就讀取該存儲單元的時空維版本。如果不存在,該系統(tǒng)就讀取該存儲單元的主版本。該系統(tǒng)還更新與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以指出該存儲單元已經(jīng)被推理性線程讀取。
在進(jìn)一步的變化中,如果推理性線程對存儲單元執(zhí)行寫操作,那么該系統(tǒng)要確定該存儲單元的時空維版本是否存在。如果不存在,該系統(tǒng)就創(chuàng)建該存儲單元的時空維版本,并對該存儲單元的時空維版本執(zhí)行寫操作。
在進(jìn)一步的變化中,如果頭線程對存儲單元執(zhí)行讀操作,那么該系統(tǒng)對該存儲單元的主版本執(zhí)行讀操作。
在進(jìn)一步的變化中,如果頭線程對存儲單元執(zhí)行寫操作,那么該系統(tǒng)對該存儲單元的主版本執(zhí)行寫操作。該系統(tǒng)還檢查與該存儲單元相關(guān)的狀態(tài)信息,以確定該存儲單元是否已經(jīng)被推理性線程讀取。如果已讀取,該系統(tǒng)就使推理性線程回滾,以使推理性線程可以讀取寫操作的結(jié)果。如果未讀取,該系統(tǒng)就對該存儲單元的時空維版本執(zhí)行寫操作,如果該時空維版本存在的話。
在進(jìn)一步的變化中,存儲單元包括在面向?qū)ο缶幊滔到y(tǒng)中定義的對象。
在該實施例的一個變化中,頭線程與推理性線程訪問獨立的硬件寄存器文件。
圖1說明了根據(jù)本發(fā)明實施例的計算機系統(tǒng)。
圖2A說明了通過單線程進(jìn)行方法的順序執(zhí)行。
圖2B根據(jù)本發(fā)明實施例說明了方法的空間和時間維執(zhí)行。
圖3根據(jù)本發(fā)明實施例說明了在方法的空間和時間維執(zhí)行過程中的系統(tǒng)棧的狀態(tài)。
圖4根據(jù)本發(fā)明實施例說明了存儲器如何在棧和堆之間分區(qū)。
圖5根據(jù)本發(fā)明實施例說明了對象的時空維版本和主版本的結(jié)構(gòu)。
圖6根據(jù)本發(fā)明實施例說明對象的狀態(tài)字的結(jié)構(gòu)。
圖7表示一個流程圖,根據(jù)本發(fā)明實施例說明了與頭線程對存儲單元執(zhí)行寫入有關(guān)的操作。
圖8表示一個流程圖,根據(jù)本發(fā)明實施例說明了與推理性線程從存儲單元讀取有關(guān)的操作。
圖9表示一個流程圖,根據(jù)本發(fā)明實施例說明了與推理性線程對存儲單元執(zhí)行寫入有關(guān)的操作。
圖10表示一個流程圖,根據(jù)本發(fā)明實施例說明了與推理性線程和頭線程之間執(zhí)行連接有關(guān)的操作。
圖11表示一個流程圖,根據(jù)本發(fā)明另一個實施例說明了與推理性線程和頭線程之間執(zhí)行連接有關(guān)的操作。
圖12表示一個流程圖,根據(jù)本發(fā)明實施例說明了一個頭線程和相關(guān)推理性線程的交替執(zhí)行。
具體實施例方式
以下給出的描述可以使本領(lǐng)域的任何技術(shù)人員制作和使用本發(fā)明,而且是在特定應(yīng)用及其需求的背景下給出的。對本領(lǐng)域的技術(shù)人員來說,對所公開的實施例進(jìn)行各種修改是顯而易見的,而且此處定義的通用原則在不脫離本發(fā)明的精神和范圍的情況下可以應(yīng)用于其他的實施例和應(yīng)用。因此,并無意將本發(fā)明局限于所示實施例,而是要將符合此處所公開的原則和特征的最廣泛的范圍給予本發(fā)明。
此詳細(xì)描述中所介紹的數(shù)據(jù)結(jié)構(gòu)和代碼通常儲存在計算機可讀存儲介質(zhì)上,其可以是任何供計算機系統(tǒng)使用的存儲代碼和/或數(shù)據(jù)的設(shè)備或介質(zhì)。這包括,但不局限于,磁存儲設(shè)備和光存儲設(shè)備例如磁盤驅(qū)動器、磁帶、CD(壓縮光盤)、DVD(數(shù)字多用途光盤或數(shù)字視頻光盤),以及嵌于傳輸介質(zhì)(具有或者不具有信號在其上調(diào)制的載波)中的計算機指令信號。例如,傳輸介質(zhì)可能包括通信網(wǎng)絡(luò),例如因特網(wǎng)。
計算機系統(tǒng)圖1說明了根據(jù)本發(fā)明實施例的計算機系統(tǒng)。在圖1所示的實施例中,硅片100包括至少一個中央處理單元(CPU)102。CPU 102通常可以包括任何允許多線程并發(fā)執(zhí)行的計算設(shè)備。
CPU 102包括指令高速緩存112和數(shù)據(jù)高速緩存106,其中指令高速緩存112包括由CPU 102執(zhí)行的指令,數(shù)據(jù)高速緩存106包括由CPU102操作的數(shù)據(jù)。在本發(fā)明的一個實施例中,數(shù)據(jù)高速緩存106是具有64字節(jié)高速緩存線的64KB 4路組關(guān)聯(lián)數(shù)據(jù)高速緩存。
數(shù)據(jù)高速緩存106和指令高速緩存112與二級高速緩存(L2)連接,而L2又與存儲控制器111連接。存儲控制器111與位于芯片之外的動態(tài)隨機存儲器(DRAM)108連接。
指令高速緩存112將指令輸送到與4個獨立的執(zhí)行線程相關(guān)聯(lián)的4個獨立的指令隊列114~117中。來自指令隊列114~117的指令通過多路復(fù)用器109輸送,而在來自指令隊列114~117的指令輸送給執(zhí)行流水線107之前,多路復(fù)用器109以循環(huán)的方式交替這些指令。如圖1所示,來自給定指令隊列的指令在執(zhí)行流水線107中占用1/4的指令時間片。注意,處理器102的其他實現(xiàn)可能能夠交替來自多于4個隊列的指令,或者是少于4個隊列的指令。
由于流水線時間片在不同的線程之間輪換,因而可以放寬等待時間。例如,從數(shù)據(jù)高速緩存106載入可以占用多至4個流水線階段,或者算術(shù)操作可以占用多至4個流水線階段而不會造成流水線停止。在本發(fā)明的一個實施例中,這種交替是“靜態(tài)”的,這意味著每個指令隊列與執(zhí)行流水線107中的每1/4指令時間片相關(guān)聯(lián),而且這種關(guān)聯(lián)并不隨時間動態(tài)地變化。
指令隊列114~117分別與相應(yīng)的寄存器文件118~121相關(guān)聯(lián),而寄存器文件118~121包括由來自指令隊列114~117的指令處理的操作數(shù)。注意,執(zhí)行流水線107中的指令可以使數(shù)據(jù)在數(shù)據(jù)高速緩存106和寄存器文件118~119之間轉(zhuǎn)移。(在本發(fā)明的另一個實施例中,寄存器文件118~121被合并成一個單獨的大型多端口寄存器文件,該文件在與指令隊列114~117相關(guān)聯(lián)的獨立線程之間分割。)注意,本發(fā)明一般應(yīng)用于任何支持在單流水線中多線程的并發(fā)交替執(zhí)行的計算機系統(tǒng),而且并不限于所說明的計算機系統(tǒng)。例如,本發(fā)明并不局限于以上所述的固定交替循環(huán)調(diào)度方案,而是可以一般地應(yīng)用于交替來自指令隊列的指令的任何時分多路復(fù)用調(diào)度方案。
方法的時空維執(zhí)行圖2A說明了通過單個頭線程202在常規(guī)的計算機系統(tǒng)中進(jìn)行方法的順序執(zhí)行。在執(zhí)行程序的過程中,頭線程202順序執(zhí)行許多方法,包括方法A 204、方法B 206和方法C 208。
與之相反,圖2B根據(jù)本發(fā)明實施例說明了方法的空間和時間維的執(zhí)行。在圖2B中,頭線程202首先執(zhí)行方法A 204,然后執(zhí)行方法B 206。(對于本例,假設(shè)方法B 206不返回值或者返回的某些其他不為方法C208所用的值?;蛘撸绻椒– 208使用由方法B 206返回的值,那么假設(shè)方法C 208使用方法B 206的預(yù)計返回值。)當(dāng)頭線程202執(zhí)行方法B 206時,推理性線程203在堆的獨立時空維中執(zhí)行方法C 208。如果頭線程202成功地執(zhí)行了方法B 206,推理性線程203就被連接到頭線程202。該連接操作包括使與推理性線程203關(guān)聯(lián)的狀態(tài)和與頭線程202關(guān)聯(lián)的狀態(tài)合并,以及堆的時空維的崩潰。
如果由于某種原因,推理性線程203在執(zhí)行方法C 208中遇到問題,那么推理性線程203進(jìn)行回滾操作。該回滾操作允許推理性線程203再次嘗試執(zhí)行方法C 208。或者,頭線程202可以非推理性地執(zhí)行方法C 208,推理性線程203可以執(zhí)行后續(xù)的方法。
有許多原因使推理性線程203在執(zhí)行方法C 208的過程中遇到問題。在推理性線程203讀取存儲單元之后,執(zhí)行方法B 206的頭線程202向同一個存儲單元(對象)寫入值時就會發(fā)生一個問題。在讀取時,當(dāng)堆的兩個時空維在該存儲單元中崩潰時,推理性線程203可以讀取同一個存儲單元。在這種情況下,推理性線程203應(yīng)該讀取由頭線程202寫入的值,但它讀取的是先前的值。在這種情況下,系統(tǒng)使推理性線程203回滾,以致推理性線程203可以讀取由頭線程202寫入的值。
注意,術(shù)語“存儲單元”通常指的是可以被計算機程序存取的任何存儲器單元。例如,術(shù)語“存儲單元”可以指位、字節(jié)或字存儲器,以及在面向?qū)ο蟮木幊滔到y(tǒng)中定義的數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟆?br>
圖3根據(jù)本發(fā)明實施例說明了在方法的空間和時間維執(zhí)行過程中的系統(tǒng)棧的狀態(tài)。注意,由于編程語言如Java編程語言不允許一個方法修改另一個方法的棧楨,所以系統(tǒng)棧在執(zhí)行方法B 206之前和在執(zhí)行方法C 208之前通常是相同的。(如果方法B 206通過系統(tǒng)棧返回參數(shù),那么這種情況就不成立了。但是正如下面要描述的,返回參數(shù)可以被顯式處理。)參見圖3,在方法A 204執(zhí)行時,棧300包括方法A楨302。當(dāng)方法A 204返回時,方法B 206開始執(zhí)行,且方法A楨302由方法B楨304取代。最后,當(dāng)方法B 206返回時,方法C 208開始執(zhí)行,且方法B楨304由方法C楨306取代。注意,由于棧300在方法B 206執(zhí)行之前與在方法C 208執(zhí)行之前是相同的,所以就有可能不首先執(zhí)行方法B 206,就用棧300的拷貝執(zhí)行方法C 208。
為了撤消推理性執(zhí)行操作的結(jié)果,需要對存儲器的更新進(jìn)行版本控制。由于增加的存儲需求、下降的高速緩存性能和進(jìn)行版本控制所需的額外硬件,與存儲器的所有更新的版本控制有關(guān)的開銷會相當(dāng)大。
慶幸的是,并非對存儲器的所有更新都需要進(jìn)行版本控制。例如,在系統(tǒng)棧上對局部變量的更新——比如循環(huán)計數(shù)器——一般只與正在更新該局部變量的線程有關(guān)。因此,甚至對于推理性線程來說,也沒有必要對這些局部變量的更新進(jìn)行版本控制。
當(dāng)執(zhí)行用諸如C語言之類的傳統(tǒng)編程語言編寫的程序時,一般不可能確定哪些更新與堆有關(guān),哪些更新與系統(tǒng)棧有關(guān)。這些程序通常是從高級語言表示形式編譯成特定計算機架構(gòu)的可執(zhí)行代碼。這種編譯過程一般將堆更新和系統(tǒng)棧更新之間的區(qū)別清除掉。
而對于新的與平臺無關(guān)的計算機語言,例如由加尼福利亞州帕洛阿爾托的太陽微系統(tǒng)公司發(fā)布的Java編程語言,就不是這種情況(Sun、Sun標(biāo)志、Sun Microsystems和Java是太陽微系統(tǒng)公司在美國和其他國家的注冊商標(biāo)或商標(biāo))。用Java編程語言編寫的程序通常被編譯成包括Java字節(jié)碼的類文件。這種類文件可以通過計算機網(wǎng)絡(luò)傳輸給遠(yuǎn)程計算機系統(tǒng),并在遠(yuǎn)程計算機系統(tǒng)上執(zhí)行。Java字節(jié)碼據(jù)稱是“平臺無關(guān)的”,因為它們可以在范圍廣泛的計算平臺上執(zhí)行,只要該計算機平臺提供Java虛擬機。
通過使用解釋器或即時(JIT)編譯器,把Java字節(jié)碼翻譯成特定計算平臺的機器碼,Java字節(jié)碼就可以在特定計算平臺上執(zhí)行。另外,Java字節(jié)碼也可以在運行在特定計算平臺上的Java字節(jié)碼引擎上執(zhí)行。
所幸的是,Java字節(jié)碼比傳統(tǒng)的機器碼包括更多的語法信息。尤其是,Java字節(jié)碼區(qū)分對系統(tǒng)棧中的局部變量的存取和對系統(tǒng)堆的存取。此外,用Java編程語言編寫的程序不允許基本類型和引用類型之間的轉(zhuǎn)換。這種轉(zhuǎn)換使得在編譯時很難區(qū)分對系統(tǒng)棧的存取和對系統(tǒng)堆的存取。
支持時空維執(zhí)行的數(shù)據(jù)結(jié)構(gòu)圖4根據(jù)本發(fā)明實施例說明了存儲器如何在棧和堆之間分區(qū)。在圖4中,存儲器400被分成許多區(qū)域,包括堆402、線程棧404和推理性堆406。堆402包括一個從中分配對象的存儲區(qū)域。堆402被進(jìn)一步分成年輕代區(qū)域408和年老代區(qū)域410,用于垃圾回收的目的。由于性能原因,垃圾回收器通常以不同的方式處理年輕代對象和年老代對象。線程棧404包括一個從中分配各種線程的棧的存儲區(qū)域。推理性堆406包括堆的兩個時空維沒有崩潰的所有的存儲單元的時空維值。這包括對象的時空維版本,例如圖5所示的對象500的版本510,以及由推理性線程203創(chuàng)建的對象。為了垃圾回收,這些由推理性線程203創(chuàng)建的對象可以被視為屬于比年輕代區(qū)域408中的對象更年輕的一代。
圖5根據(jù)本發(fā)明實施例說明了對象的主版本500和對象的時空維版本510的結(jié)構(gòu)。
對象的主版本500通過對象引用指針501引用。與面向?qū)ο蟮木幊滔到y(tǒng)中所定義的對象一樣,對象的主版本500包括數(shù)據(jù)區(qū)508,它包括一個或多個字段,這些字段包括與對象的主版本500相關(guān)聯(lián)的數(shù)據(jù)。對象的主版本500還包括方法向量表指針506。方法向量表指針506指向含有向量的表,這些向量指向可以由對象的主版本500調(diào)用的方法。
對象的主版本500也包括時空維版本指針502,其指向?qū)ο蟮臅r空維版本510,如果該對象上的兩個時空維沒有崩潰的話。注意,在圖示的本發(fā)明實施例中,時空維版本510總是通過時空維版本指針502被間接引用。另外,對象的主版本500還包括含有狀態(tài)信息的狀態(tài)字504,該狀態(tài)信息表示數(shù)據(jù)區(qū)508的哪些字段已經(jīng)被推理性線程203寫入或讀取。對象的時空維版本510只包括數(shù)據(jù)區(qū)518。
圖6根據(jù)本發(fā)明實施例說明了狀態(tài)字504的結(jié)構(gòu)。在該實施例中,狀態(tài)字504包括檢測點編號602和推理性位603。推理性位603包括讀取位604和寫入位606。當(dāng)由于推理性線程203的讀寫需要更新狀態(tài)字504時,就用系統(tǒng)的當(dāng)前時間更新檢測點編號602。系統(tǒng)時間維中的當(dāng)前時間在連接點或回滾點不連續(xù)前進(jìn)。這使得可以把檢測點編號602當(dāng)成推理性位603的限定器使用。如果檢測點編號602小于當(dāng)前時間,那么推理性位603可被解釋為復(fù)位。
讀取位604記錄自從上次連接或回滾以來數(shù)據(jù)區(qū)508中的哪些字段已經(jīng)被讀取。相應(yīng)地,寫入位606記錄自從上次連接或回滾以來數(shù)據(jù)區(qū)508中的哪些字段已經(jīng)被寫入。在本發(fā)明的一個實施例中,讀取位604包括數(shù)據(jù)區(qū)508中的每個字段的一個位。在另一個實施例中,讀取位包括的位數(shù)比數(shù)據(jù)區(qū)508中的字段數(shù)少。在本實施例中,讀取位604中的每個位對應(yīng)于數(shù)據(jù)區(qū)508中的多個字段。例如,如果有8個讀取位,每個位對應(yīng)于每個第8個字段。類似地,寫入位606可以對應(yīng)于數(shù)據(jù)區(qū)508中的一個或多個字段。
時空維的更新過程時空分維發(fā)生在所選擇的存儲器的更新過程中。對于局部變量和對系統(tǒng)棧的操作數(shù)存取,不存在時空維版本,也沒有什么特殊的事發(fā)生。在頭線程202讀取堆402中的對象的過程中,同樣也沒有什么特別的。
特殊的操作包括在頭線程202執(zhí)行的寫操作中,以及推理性線程203執(zhí)行的讀寫操作中。下面參考圖7、圖8和圖9,將更詳細(xì)地描述這些特殊操作。
圖7表示一個流程圖,根據(jù)本發(fā)明實施例說明了與頭線程202對對象的寫操作有關(guān)的操作。系統(tǒng)向?qū)ο蟮闹靼姹?00和對象的時空維版本510寫入,如果兩個時空維在這點沒有崩潰的話(步驟702)。然后,系統(tǒng)檢查對象的主版本500內(nèi)的狀態(tài)字,以確定是否需要回滾(步驟704)。如果推理性線程203以前讀取了數(shù)據(jù)元素,那么需要回滾。當(dāng)堆的兩個時空維在被推理性線程203讀取時在該存儲單元中崩潰,推理性線程203可以讀取同一個存儲單元。如果推理性線程203以前對該對象寫過并因此確保該對象的兩個維在該存儲單元未崩潰,而且如果當(dāng)前的寫操作既要更新對象的主版本500又要更新對象的時空維版本510,那么也需要回滾。
如果需要回滾,那么系統(tǒng)使推理性線程203執(zhí)行回滾操作(步驟706)。該回滾操作允許推理性線程203在頭線程202向該對象寫入以后,讀取(或?qū)懭?該對象。
注意在圖7所示的本發(fā)明的實施例中,該系統(tǒng)向主版本500和時空維版本510都執(zhí)行寫操作。在另一個替換實施例中,該系統(tǒng)首先檢查以確定推理性線程203以前是否向時空維版本510寫入過。如果沒有,該系統(tǒng)就對主版本500和時空維版本510都執(zhí)行寫操作。如果已寫入過,該系統(tǒng)就只對主版本500執(zhí)行寫操作。
圖8表示一個流程圖,根據(jù)本發(fā)明實施例說明了與推理性線程203對對象的讀操作有關(guān)的操作。在這個讀操作過程中,該系統(tǒng)設(shè)置對象的主版本500內(nèi)的狀態(tài)字504的狀態(tài)位,以指示主版本500已經(jīng)被讀取(步驟802)。然后,如果時空維版本510存在的話,推理性線程203就讀取時空維版本510。否則,推理性線程203讀取主版本500。
圖9表示一個流程圖,根據(jù)本發(fā)明實施例說明了與推理性線程203對存儲單元的寫入操作有關(guān)的操作。如果時空維版本510不存在,那么該系統(tǒng)在推理性堆406中創(chuàng)建時空維版本510(步驟902)。如果狀態(tài)字504的更新是必須的,該系統(tǒng)也會更新狀態(tài)字504以表示推理性線程203已經(jīng)向該對象寫入(步驟903)。然后該系統(tǒng)向時空維版本510寫入(步驟904)。如果隨后頭線程202必須選擇是向主版本500和時空維版本510都寫入還是只向主版本500寫入的話,那么狀態(tài)字504的更新就是必須的。
圖10表示一個流程圖,根據(jù)本發(fā)明實施例說明了與頭線程202和推理性線程203間的連接有關(guān)的操作。例如,當(dāng)頭線程202到達(dá)程序中推理性線程203開始執(zhí)行的點時,就會發(fā)生連接操作。連接操作使與推理性線程203相關(guān)聯(lián)的狀態(tài)和與頭線程202相關(guān)聯(lián)的狀態(tài)合并。該合并包括把推理性線程203的棧復(fù)制和/或合并到頭線程202的棧中(步驟1002)。該合并還包括合并對象的主版本和時空維版本(步驟1004)以及有可能垃圾回收的推理性堆406(步驟1006)。在本發(fā)明的一個實施例中,線程202或203中的一個執(zhí)行步驟1002和1006,而其他線程執(zhí)行步驟1004。
圖11表示一個流程圖,根據(jù)本發(fā)明的另一個實施例說明了與頭線程202和推理性線程203間的連接有關(guān)的操作。在該實施例中,推理性線程203作為偽頭線程執(zhí)行。作為偽頭線程,推理性線程203使用間接尋址來引用對象的時空維版本,但不標(biāo)記對象或創(chuàng)建版本。當(dāng)推理性線程203充當(dāng)偽頭線程的時候,頭線程202更新對象的主版本。
附加推理性線程的擴展雖然為單一推理性線程的情形已經(jīng)描述了本發(fā)明,但是本發(fā)明可被擴展以提供在數(shù)據(jù)對象的多個時空維版本上并行運行的多個推理性線程。
交替執(zhí)行圖12表示一個流程圖,根據(jù)本發(fā)明實施例說明了一個頭線程和相關(guān)推理性線程的交替執(zhí)行。參考圖1,頭線程202、推理性線程203(以及頭線程202的可能的其他推理性線程)在處理器102上面并發(fā)執(zhí)行。
注意,這些線程的指令以循環(huán)的方式被時分多路復(fù)用,以在同一個指令流水線107中執(zhí)行。這有效地提高了CPU 102上的單線程執(zhí)行速度,因為頭線程202、推理性線程203以及可能的其他推理性線程正在CPU 102上并發(fā)執(zhí)行,并正在為執(zhí)行的同一個線程完成工作。
還要注意的是,本發(fā)明并不局限于本說明書所描述的推理性執(zhí)行的確定形式。一般地,本發(fā)明可應(yīng)用于利用多線程的任何類型的推理性執(zhí)行。
給出本發(fā)明實施例的上述介紹僅為說明和描述的目的。并無意使其窮盡或使本發(fā)明局限于所公開的形式。據(jù)此,許多修改和變化對本領(lǐng)域的技術(shù)人員是顯而易見的。此外,以上公開并不無意限制本發(fā)明。本發(fā)明的范圍由所附的權(quán)利要求書限定。
權(quán)利要求
1.一種單處理器流水線內(nèi)的頭線程和推理性線程的交替執(zhí)行的方法,該方法包括使用頭線程執(zhí)行程序指令;以及使用推理性線程在頭線程之前推理性地執(zhí)行程序指令;其中頭線程和推理性線程通過單處理器流水線內(nèi)的時分多路復(fù)用交替來并發(fā)執(zhí)行。
2.根據(jù)權(quán)利要求1所述的方法,其中推理性線程包括一個或多個推理性線程。
3.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括當(dāng)頭線程到達(dá)推理性線程開始執(zhí)行的程序點時,在頭線程和推理性線程之間執(zhí)行連接操作。
4.根據(jù)權(quán)利要求3所述的方法,其中頭線程在存儲單元的主版本上運行;其中推理性線程在存儲單元的時空維版本上運行;以及其中執(zhí)行連接操作包括把存儲單元的時空維版本并入存儲單元的主版本中,以使對存儲單元的時空維版本的更新被合并到相應(yīng)的存儲單元的主版本中。
5.根據(jù)權(quán)利要求4所述的方法,其中如果推理性線程對存儲單元執(zhí)行讀操作,那么該方法進(jìn)一步包括確定該存儲單元的時空維版本是否存在;如果該存儲單元的時空維版本存在,那么就讀取該存儲單元的時空維版本;如果該存儲單元的時空維版本不存在,那么就讀取該存儲單元的主版本;并且更新與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以指示該存儲單元已經(jīng)被該推理性線程讀取。
6.根據(jù)權(quán)利要求4所述的方法,其中如果推理性線程對存儲單元執(zhí)行寫操作,那么該方法進(jìn)一步包括確定該存儲單元的時空維版本是否存在;如果該存儲單元的時空維版本不存在,那么就創(chuàng)建該存儲單元的時空維版本;并且對該存儲單元的時空維版本執(zhí)行寫操作。
7.根據(jù)權(quán)利要求4所述的方法,其中如果頭線程對存儲單元執(zhí)行讀操作,那么該方法進(jìn)一步包括對該存儲單元的主版本執(zhí)行讀操作。
8.根據(jù)權(quán)利要求4所述的方法,其中如果頭線程對存儲單元執(zhí)行寫操作,那么該方法進(jìn)一步包括對該存儲單元的主版本執(zhí)行寫操作;檢查與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以確定該存儲單元是否已經(jīng)被推理性線程讀取;如果該存儲單元已經(jīng)被推理性線程讀取,那么使該推理性線程回滾以使該推理性線程可以讀取該寫操作的結(jié)果;以及如果該存儲單元尚未被推理性線程讀取,那么對該存儲單元的時空維版本執(zhí)行寫操作,如果該時空維版本存在的話。
9.根據(jù)權(quán)利要求4所述的方法,其中存儲單元包括面向?qū)ο缶幊滔到y(tǒng)中所定義的對象。
10.根據(jù)權(quán)利要求1所述的方法,其中頭線程和推理性線程存取獨立的硬件寄存器文件。
11.一種存儲指令的計算機可讀存儲介質(zhì),當(dāng)所存指令被計算機執(zhí)行時,會使該計算機執(zhí)行用于單處理器流水線內(nèi)的頭線程和推理性線程的交替執(zhí)行的方法,該方法包括使用頭線程執(zhí)行程序指令;以及使用推理性線程在頭線程之前推理性地執(zhí)行程序指令;其中頭線程和推理性線程通過單處理器流水線內(nèi)的時分多路復(fù)用交替來并發(fā)執(zhí)行。
12.根據(jù)權(quán)利要求11所述的計算機可讀存儲介質(zhì),其中推理性線程包括一個或多個推理性線程。
13.根據(jù)權(quán)利要求11所述的計算機可讀存儲介質(zhì),其中當(dāng)頭線程到達(dá)推理性線程開始執(zhí)行的程序點時,在頭線程和推理性線程之間執(zhí)行連接操作。
14.根據(jù)權(quán)利要求13所述的計算機可讀存儲介質(zhì),其中頭線程在存儲單元的主版本上運行;其中推理性線程在存儲單元的時空維版本上運行;以及其中執(zhí)行連接操作包括把存儲單元的時空維版本并入存儲單元的主版本中,以使對存儲單元的時空維版本的更新被合并到相應(yīng)的存儲單元的主版本中。
15.根據(jù)權(quán)利要求14所述的計算機可讀存儲介質(zhì),其中如果推理性線程對存儲單元執(zhí)行讀操作,那么該方法進(jìn)一步包括確定該存儲單元的時空維版本是否存在;如果該存儲單元的時空維版本存在,那么就讀取該存儲單元的時空維版本;如果該存儲單元的時空維版本不存在,那么就讀取該存儲單元的主版本;并且更新與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以指示該存儲單元已經(jīng)被該推理性線程讀取。
16.根據(jù)權(quán)利要求14所述的計算機可讀存儲介質(zhì),其中如果推理性線程對存儲單元執(zhí)行寫操作,那么該方法進(jìn)一步包括確定該存儲單元的時空維版本是否存在;如果該存儲單元的時空維版本不存在,那么就創(chuàng)建該存儲單元的時空維版本;并且對該存儲單元的時空維版本執(zhí)行寫操作。
17.根據(jù)權(quán)利要求14所述的計算機可讀存儲介質(zhì),其中如果頭線程對存儲單元執(zhí)行讀操作,那么該方法進(jìn)一步包括對該存儲單元的主版本執(zhí)行讀操作。
18.根據(jù)權(quán)利要求14所述的計算機可讀存儲介質(zhì),其中如果頭線程對存儲單元執(zhí)行寫操作,那么該方法進(jìn)一步包括對該存儲單元的主版本執(zhí)行寫操作;檢查與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以確定該存儲單元是否已經(jīng)被推理性線程讀?。蝗绻摯鎯卧呀?jīng)被推理性線程讀取,那么使該推理性線程回滾以使該推理性線程可以讀取該寫操作的結(jié)果;以及如果該存儲單元尚未被推理性線程讀取,那么對該存儲單元的時空維版本執(zhí)行寫操作,如果該時空維版本存在的話。
19.根據(jù)權(quán)利要求14所述的計算機可讀存儲介質(zhì),其中存儲單元包括面向?qū)ο缶幊滔到y(tǒng)中所定義的對象。
20.根據(jù)權(quán)利要求11所述的計算機可讀存儲介質(zhì),其中頭線程和推理性線程存取獨立的硬件寄存器文件。
21.一種支持單處理器流水線內(nèi)的頭線程和推理性線程的交替執(zhí)行的設(shè)備,該設(shè)備包括處理器;該處理器內(nèi)的處理器流水線;該處理器內(nèi)的執(zhí)行機制,該處理器被配置成,使用頭線程執(zhí)行程序指令,并使用推理性線程在頭線程之前推理性地執(zhí)行程序指令;其中該執(zhí)行機制被配置成通過在該處理器流水線內(nèi)的時分多路復(fù)用交替并發(fā)地執(zhí)行頭線程和推理性線程。
22.根據(jù)權(quán)利要求21所述的設(shè)備,其中推理性線程包括一個或多個推理性線程。
23.根據(jù)權(quán)利要求21所述的設(shè)備,進(jìn)一步包括一種連接機制,它被配置成當(dāng)頭線程到達(dá)推理性線程開始執(zhí)行的程序點時,在頭線程和推理性線程之間執(zhí)行連接操作。
24.根據(jù)權(quán)利要求23所述的設(shè)備,其中頭線程在存儲單元的主版本上運行;其中推理性線程在存儲單元的時空維版本上運行;以及其中執(zhí)行連接操作包括把存儲單元的時空維版本并入存儲單元的主版本中,以使對存儲單元的時空維版本的更新被合并到相應(yīng)的存儲單元的主版本中。
25.根據(jù)權(quán)利要求24所述的設(shè)備,其中如果推理性線程對存儲單元執(zhí)行讀操作,那么執(zhí)行機制被配置成確定該存儲單元的時空維版本是否存在;如果該存儲單元的時空維版本存在,那么就讀取該存儲單元的時空維版本;如果該存儲單元的時空維版本不存在,那么就讀取該存儲單元的主版本;并且更新與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以指使示該存儲單元已經(jīng)被該推理性線程讀取。
26.根據(jù)權(quán)利要求24所述的設(shè)備,其中如果推理性線程對存儲單元執(zhí)行寫操作,那么執(zhí)行機制被配置成確定該存儲單元的時空維版本是否存在;如果該存儲單元的時空維版本不存在,那么就創(chuàng)建該存儲單元的時空維版本;并且對該存儲單元的時空維版本執(zhí)行寫操作。
27.根據(jù)權(quán)利要求24所述的設(shè)備,其中如果頭線程對存儲單元執(zhí)行讀操作,那么該執(zhí)行機制被配置成對該存儲單元的主版本執(zhí)行讀操作。
28.根據(jù)權(quán)利要求24所述的設(shè)備,其中如果頭線程對存儲單元執(zhí)行寫操作,那么執(zhí)行機制被配置成對該存儲單元的主版本執(zhí)行寫操作;檢查與該存儲單元相關(guān)聯(lián)的狀態(tài)信息,以確定該存儲單元是否已經(jīng)被推理性線程讀取過;如果該存儲單元已經(jīng)被推理性線程讀取,那么使該推理性線程回滾以使該推理性線程可以讀取該寫操作的結(jié)果;以及如果該存儲單元尚未被推理性線程讀取,那么對該存儲單元的時空維版本執(zhí)行寫操作,如果該時空維版本存在的話。
29.根據(jù)權(quán)利要求24所述的設(shè)備,其中存儲單元包括面向?qū)ο缶幊滔到y(tǒng)中所定義的對象。
30.根據(jù)權(quán)利要求21所述的設(shè)備,其中頭線程和推理性線程存取獨立的硬件寄存器文件。
全文摘要
本發(fā)明的一個實施例提供了一種簡化單處理器流水線內(nèi)的頭線程和推理性線程的交替執(zhí)行的系統(tǒng)。該系統(tǒng)的運行是通過使用頭線程執(zhí)行程序指令,并通過使用推理性線程在頭線程之前推理性地執(zhí)行程序指令來運行的,其中通過單處理器流水線內(nèi)的時分多路復(fù)用交替,頭線程和推理性線程并發(fā)執(zhí)行。
文檔編號G06F9/45GK1650266SQ03804145
公開日2005年8月3日 申請日期2003年3月3日 優(yōu)先權(quán)日2002年3月29日
發(fā)明者M·特倫布萊, S·喬杜里 申請人:太陽微系統(tǒng)公司