專利名稱:一種動(dòng)態(tài)多線程劃分方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)技術(shù)領(lǐng)域,涉及一種推測多線程計(jì)算技術(shù),尤其是一種在程序 運(yùn)行時(shí)動(dòng)態(tài)地將程序劃分為多個(gè)推測線程的方法。
背景技術(shù):
為了將程序并行化以便利用不斷增長的多核資源,編譯器需要對程序的源代碼進(jìn) 行復(fù)雜的分析。在進(jìn)行了一系列控制流分析和數(shù)據(jù)流分析之后,編譯器根據(jù)代碼間的依賴 關(guān)系將程序劃分為若干線程并產(chǎn)生出必要的同步操作來協(xié)調(diào)這些線程。盡管對那些使用數(shù)組、稠密矩陣進(jìn)行數(shù)值計(jì)算的規(guī)則程序取得了很好的效果,但 自動(dòng)并行編譯器對于涉及樹、圖等的非規(guī)則程序的并行化效果并不是很理想。這是因?yàn)樵?非規(guī)則程序中存在復(fù)雜的依賴,傳統(tǒng)的自動(dòng)并行編譯器只能進(jìn)行最保守的劃分來保證劃分 后代碼的正確性。為了解決這個(gè)問題,推測多線程技術(shù)作為一種很有希望的方法產(chǎn)生了。在這類方 法中,并不要求劃分出來的線程之間絕對不存在依賴,只要兩個(gè)線程的執(zhí)行可能不發(fā)生沖 突,就可以讓它們并行。為了保證程序的正確性,運(yùn)行時(shí)一旦發(fā)生依賴違規(guī),違反依賴的線 程以及它所造成的影響將被撤銷。如果運(yùn)行時(shí)并未發(fā)生依賴違規(guī),推測線程最終將提交它 的執(zhí)行成果。通過這種推測執(zhí)行和違規(guī)檢測相結(jié)合的方式,程序潛在的并行性得到了開發(fā)。 引入推測多線程之后,自動(dòng)并行編譯器的壓力大大減輕。雖然推測多線程放寬了線程劃分的限制,使得那些原本僅僅是有可能的并行性也 能得以利用,但是對于推測多線程技術(shù)來說,劃分依然非常重要。一個(gè)不合理的劃分只會導(dǎo) 致推測線程大量撤銷,不但浪費(fèi)系統(tǒng)資源,甚至還會導(dǎo)致開銷劇增,從而抵消并行所獲得的 好處。所以如何劃分線程對于推測多線程系統(tǒng)仍然至關(guān)重要。在傳統(tǒng)的劃分方法中,由編譯器對程序進(jìn)行靜態(tài)的劃分。為了將程序劃分為多個(gè) 線程,編譯器需要了解程序在運(yùn)行時(shí)的行為特征,而此信息只有通過實(shí)際運(yùn)行才能獲得。程 序在運(yùn)行時(shí)的行為特征與程序在運(yùn)行過程中得到的輸入有著密切的關(guān)系,所以,為了獲取 關(guān)于程序在運(yùn)行時(shí)行為特征的信息,傳統(tǒng)方法使用樣本數(shù)據(jù)作為輸入來運(yùn)行程序,從而搜 集得到關(guān)于程序運(yùn)行時(shí)行為特征的信息以輔助編譯器決定如何把程序劃分為多個(gè)線程。傳 統(tǒng)做法的缺點(diǎn)在于,一旦運(yùn)行時(shí)的真實(shí)輸入與樣本輸入產(chǎn)生較大的偏差,按照樣本輸入收 集的信息做出的劃分就很難達(dá)到最佳效果。另一方面,傳統(tǒng)方法在劃分的時(shí)候主要依據(jù)程序的控制結(jié)構(gòu),但對于非規(guī)則程序 來說,并行性在控制結(jié)構(gòu)中暴露不足,因而可供開發(fā)利用的并行機(jī)會較少,限制了系統(tǒng)的并 行度。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)的缺點(diǎn),提供一種不依賴樣本輸入,能夠在 程序運(yùn)行的過程中,動(dòng)態(tài)地將程序劃分為多個(gè)線程的方法,該方法不依賴樣本輸入,能夠根據(jù)程序的運(yùn)行情況來實(shí)時(shí)地決定劃分方案,對不同輸入具有更好的適應(yīng)性。另外,本發(fā)明從 數(shù)據(jù)結(jié)構(gòu)而非控制結(jié)構(gòu)的角度出發(fā)來發(fā)掘程序中的并行性,能夠更好地利用非規(guī)則程序中 的并行性。本發(fā)明的目的是通過以下技術(shù)方案來解決的這種動(dòng)態(tài)多線程劃分方法如下使虛擬機(jī)加載用戶程序,并生成線程單元;由線程單元執(zhí)行用戶程序中的指令, 在執(zhí)行用戶程序過程中(1)當(dāng)遇到用戶程序要求產(chǎn)生新對象時(shí),給新對象分配線程單元; (2)當(dāng)遇到用戶程序中的方法調(diào)用時(shí),根據(jù)方法調(diào)用的目標(biāo)對象,將方法調(diào)用分派至目標(biāo)對 象所在的線程單元;(3)當(dāng)遇到用戶程序要求內(nèi)存訪問時(shí),根據(jù)線程單元當(dāng)時(shí)所處的模式 決定內(nèi)存訪問方式;以上分配的各個(gè)線程單元并行執(zhí)行分派給自己的方法調(diào)用,并且線程單元在獲得 非推測控制后對之前的推測執(zhí)行進(jìn)行驗(yàn)證,如果正確,就提交推測執(zhí)行的成果;否則,就丟 棄推測執(zhí)行的成果;所述的線程單元是具有獨(dú)立計(jì)算能力的執(zhí)行單元,線程單元有三種不同的工作模 式非推測模式、推測模式、返回值預(yù)測模式;虛擬機(jī)有一個(gè)或多個(gè)線程單元,但任何時(shí)刻 只有一個(gè)線程單元處在非推測模式。以上方法中,如果用戶程序產(chǎn)生新對象時(shí),該對象所屬的類被用戶標(biāo)記為并行對 象,則虛擬機(jī)生成一個(gè)新的線程單元并分配給它;否則,把當(dāng)前線程單元分配給它。以上當(dāng)線程單元在推測模式下遇到方法調(diào)用時(shí),如果目標(biāo)對象就在本線程單元之 上,那么由本線程單元立即執(zhí)行該方法調(diào)用;如果方法調(diào)用的目標(biāo)對象位于其他線程單元, 則不執(zhí)行該方法調(diào)用,而是執(zhí)行與被調(diào)用方法對應(yīng)的返回值預(yù)測方法來獲得對方法調(diào)用返 回值的預(yù)測值,并將方法調(diào)用信息發(fā)送給目標(biāo)對象所在的線程單元。以上當(dāng)遇到用戶程序要求內(nèi)存訪問時(shí),處在非推測模式下的線程單元的讀寫操作 將直接進(jìn)行讀寫;處在推測模式下的線程單元的讀寫操作被導(dǎo)向至多版本高速緩存;處在 返回值預(yù)測模式下的線程單元的讀寫操作被導(dǎo)向至返回值預(yù)測緩存。上述發(fā)送給一個(gè)線程單元的方法調(diào)用信息組織在一個(gè)隊(duì)列中,線程單元按照隊(duì)列 中的順序依次執(zhí)行其中的方法調(diào)用;所述方法調(diào)用信息包括方法名稱和方法參數(shù)。上述推測執(zhí)行的成果是指線程單元產(chǎn)生的狀態(tài)快照,或者當(dāng)前狀態(tài);當(dāng)線程單元 使用返回值的預(yù)測值之前,或者執(zhí)行分派給自己的方法調(diào)用之前,會對線程單元的當(dāng)前狀 態(tài)進(jìn)行快照,這些狀態(tài)快照按照產(chǎn)生的先后順序被組織在一個(gè)隊(duì)列中;快照與導(dǎo)致快照狀 態(tài)形成的方法調(diào)用或返回值預(yù)測值一一對應(yīng),如果將來返回值的預(yù)測值被驗(yàn)證是正確的, 或者方法調(diào)用信息被驗(yàn)證是正確的,這些狀態(tài)快照將按照順序一一提交,成為可見的系統(tǒng) 狀態(tài)。上述線程單元獲得非推測控制是指按照程序的順序語義線程單元得到控制。上述用戶程序?yàn)镴ava語言編寫的程序。本發(fā)明具有以下有益效果1)通過使用本發(fā)明,能夠避免非規(guī)則程序的并行性在控制結(jié)構(gòu)中暴露不足從而難 以劃分線程的困難,通過以數(shù)據(jù)結(jié)構(gòu)之間的聯(lián)系緊密程度為依據(jù),在運(yùn)行時(shí)動(dòng)態(tài)地劃分線 程,能更好地發(fā)掘利用非規(guī)則程序中的并行性。
2)因?yàn)槭窃谶\(yùn)行時(shí)動(dòng)態(tài)地進(jìn)行線程劃分,而不依賴于事先設(shè)定的樣本輸入,所以 對于不同的輸入有較好的適應(yīng)性。3)因?yàn)楸痉ǖ膶?shí)現(xiàn)不要求特殊的硬件支持,所以能夠利用市場現(xiàn)有的多核系統(tǒng)。
圖1為給新產(chǎn)生的對象分配線程單元的流程圖;圖2為將方法調(diào)用分派至目標(biāo)對象所在線程單元的示意圖;圖3為根據(jù)線程單元當(dāng)時(shí)所處的模式?jīng)Q定內(nèi)存訪問方式的示意圖;圖4為線程單元模式的狀態(tài)轉(zhuǎn)換圖;圖5為支持動(dòng)態(tài)多線程劃分的虛擬機(jī)的系統(tǒng)結(jié)構(gòu)示意圖;圖6為一個(gè)具體例子,展示將方法調(diào)用分派至目標(biāo)對象所在的線程單元,利用返 回值預(yù)測方法預(yù)測返回值以及驗(yàn)證提交的過程。
具體實(shí)施例方式下面結(jié)合附圖對本發(fā)明做進(jìn)一步詳細(xì)描述。所述是對本發(fā)明的解釋而不是限定。當(dāng)用戶需要運(yùn)行用戶程序時(shí),先使虛擬機(jī)加載用戶程序,并生成線程單元;由線程 單元執(zhí)行用戶程序中的指令。本發(fā)明提到的用戶程序均為Java語言編寫的程序,在執(zhí)行用 戶程序過程中(1)當(dāng)遇到用戶程序要求產(chǎn)生新對象時(shí),給新對象分配線程單元。如果用戶程序產(chǎn) 生新對象時(shí),該對象所屬的類被用戶標(biāo)記為并行對象,則虛擬機(jī)生成一個(gè)新的線程單元并 分配給它;否則,把當(dāng)前線程單元分配給它。具體參見圖1,給用戶程序中產(chǎn)生的新對象分 配線程單元的過程。new指令的執(zhí)行導(dǎo)致新對象產(chǎn)生,對象產(chǎn)生之后系統(tǒng)檢查該對象是否被 標(biāo)記為并行對象,這是通過檢查該對象所屬的類是否帶有Java運(yùn)行時(shí)可見注釋OParallel 來判斷的。如果帶有OParallel注釋,表示該對象為并行對象。如果對象被標(biāo)記為并行對象,那么將會為該對象分配新的線程單元,對象的元信 息中設(shè)有一字段用來記錄其所在的線程單元。如果新產(chǎn)生的對象并沒有被標(biāo)記為并行對象,那么執(zhí)行new指令的線程單元(即 當(dāng)前線程單元)將被分配給該對象,負(fù)責(zé)所有以后對該對象方法調(diào)用的執(zhí)行。該對象與線 程單元上的其他對象共享該線程單元,它們被視為一個(gè)整體,稱作一個(gè)對象組。通過這種方式,程序運(yùn)行過程中產(chǎn)生的所有對象以用戶確定的并行對象為核心聚 集到若干不相交的集合中,完成了對對推測線程數(shù)據(jù)部分的劃分工作。(2)當(dāng)遇到用戶程序中的方法調(diào)用時(shí),根據(jù)方法調(diào)用的目標(biāo)對象,將方法調(diào)用分派 至目標(biāo)對象所在的線程單元。當(dāng)線程單元在推測模式下遇到方法調(diào)用時(shí),如果目標(biāo)對象就 在本線程單元之上,那么由本線程單元立即執(zhí)行該方法調(diào)用;如果方法調(diào)用的目標(biāo)對象位 于其他線程單元,則不執(zhí)行該方法調(diào)用,而是執(zhí)行與被調(diào)用方法對應(yīng)的返回值預(yù)測方法來 獲得對方法調(diào)用返回值的預(yù)測值,并將方法調(diào)用信息發(fā)送給目標(biāo)對象所在的線程單元。如圖2,如果目標(biāo)對象就在本線程單元之上,那么由本線程單元立即執(zhí)行方法調(diào) 用;如果方法調(diào)用的目標(biāo)對象位于其他線程單元,則不執(zhí)行該方法調(diào)用,而是執(zhí)行與被調(diào)用 方法對應(yīng)的返回值預(yù)測方法來獲得對方法調(diào)用返回值的預(yù)測值,并將方法調(diào)用信息發(fā)送給目標(biāo)對象所在的線程單元,方法調(diào)用信息包括方法名稱和方法參數(shù)。(3)當(dāng)遇到用戶程序要求內(nèi)存訪問時(shí),根據(jù)線程單元當(dāng)時(shí)所處的模式?jīng)Q定內(nèi)存訪 問方式。具體參見圖3,當(dāng)遇到用戶程序要求內(nèi)存訪問時(shí),處在非推測模式下的線程單元 的讀寫操作將直接進(jìn)行讀寫;處在推測模式下的線程單元的讀寫操作被導(dǎo)向多版本高速緩 存;處在返回值預(yù)測模式下的線程單元的讀寫操作被導(dǎo)向返回值預(yù)測緩存。以上分配的各個(gè)線程單元并行執(zhí)行分派給自己的方法調(diào)用,并且線程單元獲得非 推測控制后對之前的推測執(zhí)行進(jìn)行驗(yàn)證,如果正確,就提交推測執(zhí)行的成果;否則,就丟棄 推測執(zhí)行的成果;推測執(zhí)行的成果是指線程單元產(chǎn)生的狀態(tài)快照,或者當(dāng)前狀態(tài);當(dāng)線程 單元使用返回值的預(yù)測值之前,或者執(zhí)行分派給自己的方法調(diào)用之前,會對線程單元的當(dāng) 前狀態(tài)進(jìn)行快照,這些狀態(tài)快照按照產(chǎn)生的先后順序被組織在一個(gè)隊(duì)列中;快照與導(dǎo)致快 照狀態(tài)形成的方法調(diào)用或返回值預(yù)測值一一對應(yīng),如果將來返回值的預(yù)測值被驗(yàn)證是正確 的,或者方法調(diào)用信息被驗(yàn)證是正確的,這些狀態(tài)快照將按照順序一一提交,成為可見的系 統(tǒng)狀態(tài)。以上線程單元獲得非推測控制是指按照程序的順序語義線程單元得到控制。線程單元是具有獨(dú)立計(jì)算能力的執(zhí)行單元,線程單元有三種不同的工作模式非 推測模式、推測模式、返回值預(yù)測模式;虛擬機(jī)有一個(gè)或多個(gè)線程單元,但任何時(shí)刻只有一 個(gè)線程單元處在非推測模式。線程單元獲得非推測控制是指按照程序的順序語義線程單元得到控制;推測執(zhí)行 的成果是指線程單元產(chǎn)生的狀態(tài)快照,或者當(dāng)前狀態(tài)。參見圖4,反映線程單元模式變化的狀態(tài)轉(zhuǎn)換圖。在線程的生命期中,線程單元始 終在推測模式、非推測模式兩種模式間交替變化。時(shí)而處于推測模式,時(shí)而處于非推測模 式。在這個(gè)過程中線程會驗(yàn)證、提交多次。當(dāng)線程單元得到非推測控制,進(jìn)入非推測模式后,驗(yàn)證過程開始,檢查之前是否在 一個(gè)正確的消息基礎(chǔ)上執(zhí)行。如果推測消息被驗(yàn)證是正確的,線程單元就提交處理該推測 消息所產(chǎn)生的狀態(tài)快照,然后在非推測狀態(tài)下繼續(xù)執(zhí)行。如果推測消息被驗(yàn)證是錯(cuò)誤的,該 消息后推測執(zhí)行所產(chǎn)生的尚未提交的狀態(tài)快照就都被丟棄,然后從收到非推測消息處繼續(xù) 非推測執(zhí)行。驗(yàn)證錯(cuò)誤不會導(dǎo)致線程被撤銷,只導(dǎo)致所有尚未提交的狀態(tài)快照被丟棄。具體地說,當(dāng)碰到invoke指令,即方法調(diào)用指令時(shí),如果當(dāng)前線程單元處在非推 測模式,就把非推測控制交給目標(biāo)對象所在的線程單元,然后當(dāng)前線程單元轉(zhuǎn)入推測模式, 執(zhí)行方法對應(yīng)的返回值預(yù)測方法得到預(yù)測的返回值,然后繼續(xù)推測執(zhí)行。當(dāng)碰到invoke指 令時(shí),如果當(dāng)前線程處在推測狀態(tài),則執(zhí)行方法對應(yīng)的返回值預(yù)測方法,同時(shí)給目標(biāo)對象所 在的線程單元中添加一條代表invoke的推測消息。當(dāng)碰到return指令時(shí),如果當(dāng)前線程 單元處在非推測模式,就把非推測控制交給目標(biāo)對象所在的線程單元,然后轉(zhuǎn)入推測模式, 從推測消息隊(duì)列中取得下一條推測消息進(jìn)行處理。當(dāng)碰到return指令時(shí),如果當(dāng)前線程單 元處在推測模式,就從推測消息隊(duì)列中取得下一條推測消息進(jìn)行處理。如果沒有消息可以 處理時(shí),線程單元進(jìn)入等待狀態(tài)。圖5是支持動(dòng)態(tài)多線程劃分的虛擬機(jī)的系統(tǒng)結(jié)構(gòu)示意圖。虛擬機(jī)有一個(gè)或多個(gè)線程單元,線程單元是具有獨(dú)立計(jì)算能力的執(zhí)行單元。虛擬 機(jī)在運(yùn)行過程中動(dòng)態(tài)地把對象映射到相應(yīng)的線程單元上,此后該對象的所有操作就由該線 程單元負(fù)責(zé)執(zhí)行。
發(fā)送給一個(gè)線程單元的方法調(diào)用信息被組織在一個(gè)隊(duì)列中,線程單元按照隊(duì)列中 的順序依次執(zhí)行其中的方法調(diào)用,所述方法調(diào)用信息包括方法名稱和方法參數(shù)。當(dāng)線程單 元使用返回值的預(yù)測值之前,或者執(zhí)行分派給自己的方法調(diào)用之前,會對線程單元的當(dāng)前 狀態(tài)進(jìn)行快照,這些狀態(tài)快照按照產(chǎn)生的先后順序被組織在一個(gè)隊(duì)列中;快照與導(dǎo)致快照 狀態(tài)形成的方法調(diào)用或返回值預(yù)測值一一對應(yīng),如果將來返回值的預(yù)測值被驗(yàn)證是正確 的,或者方法調(diào)用信息被驗(yàn)證是正確的,這些狀態(tài)快照將按照順序一一提交,成為可見的系 統(tǒng)狀態(tài)。為了支持推測狀態(tài)的保存、返回值的預(yù)測,以及維護(hù)分派至本線程單元的方法調(diào) 用、產(chǎn)生的狀態(tài)快照、與狀態(tài)快照對應(yīng)的需要驗(yàn)證的方法調(diào)用信息和返回值預(yù)測值之間的 關(guān)系,如圖5所示,每個(gè)線程單元都設(shè)置有一個(gè)多版本高速緩存和一個(gè)返回值預(yù)測緩存以 及三個(gè)隊(duì)列推測消息隊(duì)列、待驗(yàn)證消息隊(duì)列、待提交狀態(tài)隊(duì)列。推測消息隊(duì)列用來接收其他線程單元在推測模式下發(fā)送給本線程的推測性的異 步消息(即方法調(diào)用信息和返回值預(yù)測值)。待驗(yàn)證消息隊(duì)列記錄本線程已經(jīng)處理過的來 自其它線程的推測性的異步消息。待提交狀態(tài)隊(duì)列和多版本高速緩存配合,用來保存本線 程在處理來自其他線程的推測性的異步消息之后形成的狀態(tài)版本,即狀態(tài)快照。在推測模式下,線程單元從推測消息隊(duì)列中取出推測消息進(jìn)行處理,處理消息所 形成的狀態(tài)會進(jìn)入待提交狀態(tài)隊(duì)列,同時(shí)推測消息被放入待驗(yàn)證消息隊(duì)列等待將來驗(yàn)證。 將來當(dāng)待驗(yàn)證消息隊(duì)列中的待驗(yàn)證消息被驗(yàn)證是正確后,線程單元就會提交待提交狀態(tài)隊(duì) 列中對應(yīng)于該消息的狀態(tài)快照。返回值預(yù)測緩存用來在返回值預(yù)測方法的執(zhí)行過程中暫存中間計(jì)算結(jié)果。返回值 預(yù)測方法的目的僅僅是盡快得出對返回值的預(yù)測值,在此過程中產(chǎn)生的其他副作用不需要 保存,所以返回值預(yù)測緩存中的內(nèi)容在返回值預(yù)測方法執(zhí)行結(jié)束后即被丟棄。在順序語義下,對象間的消息傳遞是同步的。這意味在各個(gè)對象的計(jì)算之間存在 著先后次序即某種依賴關(guān)系。對象之間這種因?yàn)橄⑼ㄐ哦a(chǎn)生的依賴關(guān)系我們稱之為消 息依賴。在本方法中,一般意義上線程間的數(shù)據(jù)依賴和控制依賴都可歸納為消息依賴。如 果兩個(gè)線程之間不存在消息依賴,它們就可以并行執(zhí)行。否則,就需要同步。在存在消息依賴的情況下,通過對導(dǎo)致依賴的消息進(jìn)行推測,可以做到推測并行。 通過對消息進(jìn)行推測,線程間的同步通信變成了推測性的異步通信。異步通信的好處是消 息發(fā)送方和接收方的計(jì)算可以重疊,而無須等待對方。最后,通過用非推測性的同步消息對 推測性的異步消息進(jìn)行驗(yàn)證,可以保證推測執(zhí)行的正確性和并行執(zhí)行的確定性。線程間存在消息依賴會導(dǎo)致線程無法并行執(zhí)行。為了在存在消息依賴的情況下并 行執(zhí)行,需要對導(dǎo)致依賴的消息進(jìn)行推測。對象收到的消息按照可以分為兩類1)主動(dòng)得到的消息retUrn ;2)被動(dòng)得到的 消息invoke ο不同類型的消息通過不同的方式來推測。返回值預(yù)測方法用來對return消息的返回值進(jìn)行推測。在非推測和推測模式下, 當(dāng)線程單元遇到invoke指令時(shí),如果目標(biāo)對象位于其他線程單元中,將調(diào)用對應(yīng)的返回值 預(yù)測方法來推測被調(diào)方法的返回值。這個(gè)返回值連同使用該返回值的線程單元的當(dāng)前執(zhí)行 狀態(tài)一起構(gòu)成return消息的推測值。在推測模式下,當(dāng)線程單元遇到invoke指令,對應(yīng)的消息會被作為一條推測消息添加到目標(biāo)對象所在線程單元的推測消息隊(duì)列中。相應(yīng)地,在推測模式下,線程單元在遇到 return指令后會從推測消息隊(duì)列中取得下一個(gè)推測消息來處理。從推測消息隊(duì)列中取出的 推測消息就是對線程單元未來會收到的消息的推測。推測消息在推測消息隊(duì)列中的順序即 對未來可能收到消息的順序的推測。對消息的推測是線程單元收到消息后所進(jìn)行的推測性計(jì)算的基礎(chǔ)。如果消息推測 是正確的,那么線程單元在推測狀態(tài)下執(zhí)行產(chǎn)生的成果就是有效的,可以被提交。如果消息 推測是錯(cuò)誤的,那么在推測狀態(tài)下的執(zhí)行就是基于錯(cuò)誤的假設(shè),執(zhí)行成果必須被丟棄。當(dāng)線程單元得到非推測控制后,它對自己之前的推測執(zhí)行所依賴的消息進(jìn)行驗(yàn) 證。線程單元從待驗(yàn)證消息隊(duì)列中取出一條待驗(yàn)證消息(這是一條推測性的異步消息),將 其與收到的非推測的同步消息對比。如果相同,說明推測正確,線程單元就提交推測執(zhí)行的 成果,然后線程單元從提交之后的執(zhí)行狀態(tài)繼續(xù)非推測執(zhí)行。如果不同,說明推測錯(cuò)誤,就 丟棄所有未提交的成果,然后根據(jù)非推測性的同步消息重新執(zhí)行。按照次序驗(yàn)證待驗(yàn)證消 息隊(duì)列中的消息保證了消息順序的正確性也是正確的。每個(gè)線程單元都有自己的多版本高速緩存。多版本高速緩存中維護(hù)著對象的當(dāng)前 版本號。每收到一個(gè)推測消息,在處理之前,該版本號都會加一。因?yàn)橥茰y線程不能影響系 統(tǒng)的可見狀態(tài),所以推測線程的讀寫都發(fā)生在多版本高速緩存中。推測線程總是讀寫多版 本高速緩存中最新版本的狀態(tài)。為了節(jié)省空間提高效率,多版高速緩存用增量的方式保存同一地址處不同版本的 數(shù)據(jù)。其方式類似軟件開發(fā)中用的版本控制系統(tǒng)。多版本高速緩存還提供提交推測版本到 非推測狀態(tài)的能力。版本的提交是按次序進(jìn)行的。即先提交版本i,然后提交版本i+Ι。不 會出現(xiàn)提交i之后越過i+Ι而提交i+2的情況。圖6的例子顯示了將方法調(diào)用分派到目標(biāo)對象所處的線程單元的過程,利用返回 值預(yù)測方法對方法調(diào)用的返回值進(jìn)行預(yù)測,以及進(jìn)行驗(yàn)證的過程。左圖為用戶程序串行執(zhí) 行的序列圖,右圖為使用本方法在運(yùn)行時(shí)將同一程序劃分若干線程并行執(zhí)行的序列圖。在 圖6所示的例子中,線程單元TO因?yàn)檎{(diào)用B方法把非推測控制交給線程單元Tl。TO轉(zhuǎn)入 推測模式,執(zhí)行返回值預(yù)測方法得到對方法B返回值的預(yù)測值,然后繼續(xù)執(zhí)行下面的部分
C。B部分和C部分并行執(zhí)行。當(dāng)TO碰到對D方法的調(diào)用時(shí),執(zhí)行方法D對應(yīng)的返回值預(yù)測 方法來預(yù)測D方法的返回值,同時(shí)給Tl的推測消息隊(duì)列中添加代表方法D調(diào)用的推測消息
D。Tl執(zhí)行完B之后,因?yàn)榉椒ǚ祷兀逊峭茰y控制還給TO。TO進(jìn)入非推測狀態(tài),驗(yàn)證之前 返回值預(yù)測方法計(jì)算的返回值,如果正確就提交C部分執(zhí)行的結(jié)果,如果錯(cuò)誤就丟棄推測 執(zhí)行的成果然后從出錯(cuò)處用正確的返回值繼續(xù)執(zhí)行。與此同時(shí),Tl進(jìn)入推測模式,從推測 消息隊(duì)列中取出推測消息D進(jìn)行處理,繼續(xù)執(zhí)行下邊的D。TO遇到對D的調(diào)用,再次把非推 測控制交給Tl,Tl驗(yàn)證之前從推測消息隊(duì)列中取出的消息D,如果正確就提交D部分執(zhí)行 的結(jié)果,如果錯(cuò)誤就丟棄推測執(zhí)行的成果,然后從出錯(cuò)處開始,重新處理消息D。從這個(gè)例子可以看到,A,C,E與B,D并行,而A,C,E之間串行,B, D之間串行。
權(quán)利要求
一種動(dòng)態(tài)多線程劃分方法,其特征在于使虛擬機(jī)加載用戶程序,并生成線程單元;由線程單元執(zhí)行用戶程序中的指令,在執(zhí)行用戶程序過程中(1)當(dāng)遇到用戶程序要求產(chǎn)生新對象時(shí),給新對象分配線程單元;(2)當(dāng)遇到用戶程序中的方法調(diào)用時(shí),根據(jù)方法調(diào)用的目標(biāo)對象,將方法調(diào)用分派至目標(biāo)對象所在的線程單元;(3)當(dāng)遇到用戶程序要求內(nèi)存訪問時(shí),根據(jù)線程單元當(dāng)時(shí)所處的模式?jīng)Q定內(nèi)存訪問方式;以上分配的各個(gè)線程單元并行執(zhí)行分派給自己的方法調(diào)用,并且線程單元在獲得非推測控制后對之前的推測執(zhí)行進(jìn)行驗(yàn)證,如果正確,就提交推測執(zhí)行的成果;否則,就丟棄推測執(zhí)行的成果;所述的線程單元是具有獨(dú)立計(jì)算能力的執(zhí)行單元,線程單元有三種不同的工作模式非推測模式、推測模式、返回值預(yù)測模式;虛擬機(jī)有一個(gè)或多個(gè)線程單元,但任何時(shí)刻只有一個(gè)線程單元處在非推測模式。
2.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)多線程劃分方法,其特征在于,如果用戶程序產(chǎn)生新對 象時(shí),該對象所屬的類被用戶標(biāo)記為并行對象,則虛擬機(jī)生成一個(gè)新的線程單元并分配給 它;否則,把當(dāng)前線程單元分配給它。
3.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)多線程劃分方法,其特征在于,當(dāng)線程單元在推測模式 下遇到方法調(diào)用時(shí),如果目標(biāo)對象就在本線程單元之上,那么由本線程單元立即執(zhí)行該方 法調(diào)用;如果方法調(diào)用的目標(biāo)對象位于其他線程單元,則不執(zhí)行該方法調(diào)用,而是執(zhí)行與被 調(diào)用方法對應(yīng)的返回值預(yù)測方法來獲得對方法調(diào)用返回值的預(yù)測值,并將方法調(diào)用信息發(fā) 送給目標(biāo)對象所在的線程單元。
4.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)多線程劃分方法,其特征在于,當(dāng)遇到用戶程序要求內(nèi) 存訪問時(shí),處在非推測模式下的線程單元的讀寫操作將直接進(jìn)行讀寫;處在推測模式下的 線程單元的讀寫操作被導(dǎo)向至多版本高速緩存;處在返回值預(yù)測模式下的線程單元的讀寫 操作被導(dǎo)向至返回值預(yù)測緩存。
5.根據(jù)權(quán)利要求1或3所述的動(dòng)態(tài)多線程劃分方法,其特征在于,發(fā)送給一個(gè)線程單 元的方法調(diào)用信息組織在一個(gè)隊(duì)列中,線程單元按照隊(duì)列中的順序依次執(zhí)行其中的方法調(diào) 用;所述方法調(diào)用信息包括方法名稱和方法參數(shù)。
6.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)多線程劃分方法,其特征在于,推測執(zhí)行的成果是指線 程單元產(chǎn)生的狀態(tài)快照,或者當(dāng)前狀態(tài);當(dāng)線程單元使用返回值的預(yù)測值之前,或者執(zhí)行分 派給自己的方法調(diào)用之前,會對線程單元的當(dāng)前狀態(tài)進(jìn)行快照,這些狀態(tài)快照按照產(chǎn)生的 先后順序被組織在一個(gè)隊(duì)列中;快照與導(dǎo)致快照狀態(tài)形成的方法調(diào)用或返回值預(yù)測值一一 對應(yīng),如果將來返回值的預(yù)測值被驗(yàn)證是正確的,或者方法調(diào)用信息被驗(yàn)證是正確的,這些 狀態(tài)快照將按照順序一一提交,成為可見的系統(tǒng)狀態(tài)。
7.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)多線程劃分方法,其特征在于,線程單元獲得非推測控 制是指按照程序的順序語義線程單元得到控制。
8.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)多線程劃分方法,其特征在于,所述用戶程序?yàn)镴ava語 言編寫的程序。
全文摘要
本發(fā)明公開了一種動(dòng)態(tài)多線程劃分方法,該方法使虛擬機(jī)加載用戶程序,并生成線程單元;由線程單元執(zhí)行用戶程序中的指令,在執(zhí)行用戶程序過程中當(dāng)遇到用戶程序要求產(chǎn)生新對象時(shí),給新對象分配線程單元;當(dāng)遇到用戶程序中的方法調(diào)用時(shí),根據(jù)方法調(diào)用的目標(biāo)對象,將方法調(diào)用分派到目標(biāo)對象所在的線程單元;當(dāng)遇到用戶程序要求內(nèi)存訪問時(shí),根據(jù)線程單元當(dāng)時(shí)所處的模式?jīng)Q定內(nèi)存訪問方式。本發(fā)明不依賴樣本輸入,能夠根據(jù)程序的運(yùn)行情況來實(shí)時(shí)地決定劃分方案,對不同輸入具有更好的適應(yīng)性。
文檔編號G06F9/38GK101923460SQ20101023048
公開日2010年12月22日 申請日期2010年7月19日 優(yōu)先權(quán)日2010年7月19日
發(fā)明者李遠(yuǎn)成, 杜延寧, 趙銀亮, 韓博 申請人:西安交通大學(xué)