專利名稱:一種實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于微處理器設(shè)計(jì)和應(yīng)用微處理器的系統(tǒng)設(shè)計(jì)領(lǐng)域,尤其涉及現(xiàn)代處理器實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法。
背景技術(shù):
在現(xiàn)代處理器中,推測式執(zhí)行是挖掘指令級(jí)并行性的重要手段之一。為了提高推測式執(zhí)行的效率,減少錯(cuò)誤的推測執(zhí)行,準(zhǔn)確的轉(zhuǎn)移預(yù)測技術(shù)是至關(guān)重要的。在現(xiàn)代的寬發(fā)射、深度流水的超標(biāo)量處理器體系結(jié)構(gòu)中,采用轉(zhuǎn)移預(yù)測的主要目的是為了提高CPU的運(yùn)算速度。推測執(zhí)行是依托于轉(zhuǎn)移預(yù)測基礎(chǔ)之上的,即如果CPU能夠在流水線執(zhí)行的前條指令結(jié)果出來之前能夠預(yù)測到是否程序轉(zhuǎn)移,就可以提前執(zhí)行相應(yīng)的指令,由此可避免處理器中流水線的空閑等待,從而提高CPU的運(yùn)行速度。另一方面,如果前一指令結(jié)果出來后證明轉(zhuǎn)移預(yù)測錯(cuò)誤,則必須將已裝入流水線執(zhí)行的指令和結(jié)果全部清除,然后再將正確的指令裝入流水線重新處理,從而降低了處理器性能。由此可見,準(zhǔn)確的轉(zhuǎn)移指令預(yù)測技術(shù)能夠?yàn)樘幚砥魈峁┻B續(xù)的指令流輸入,彌補(bǔ)了在轉(zhuǎn)移指令跳轉(zhuǎn)方向和跳轉(zhuǎn)目標(biāo)地址尚未計(jì)算出來時(shí)處理器無法繼續(xù)執(zhí)行而造成的處理器時(shí)鐘周期的浪費(fèi);而一旦發(fā)生轉(zhuǎn)移指令誤預(yù)測,處理器推測執(zhí)行的錯(cuò)誤步驟上的幾十條甚至上百條指令將被丟棄,所有推測執(zhí)行的工作將被取消,又會(huì)造成處理器時(shí)鐘周期的浪費(fèi)。因此,提高轉(zhuǎn)移指令預(yù)測準(zhǔn)確度是轉(zhuǎn)移指令預(yù)測設(shè)計(jì)和應(yīng)用的關(guān)鍵目標(biāo),對(duì)現(xiàn)代處理器挖掘指令級(jí)并行性具有重要意義。轉(zhuǎn)移指令根據(jù)轉(zhuǎn)移的目標(biāo)特性可以分為有條件轉(zhuǎn)移與無條件轉(zhuǎn)移,或者分為直接轉(zhuǎn)移與間接轉(zhuǎn)移。其中有條件直接轉(zhuǎn)移(簡稱“條件轉(zhuǎn)移”)和無條件間接轉(zhuǎn)移(簡稱“間接跳轉(zhuǎn)”)是兩類最重要的轉(zhuǎn)移指令。條件轉(zhuǎn)移指令通常與轉(zhuǎn)移歷史具有較強(qiáng)的關(guān)聯(lián)性,因此基于歷史的條件轉(zhuǎn)移預(yù)測器能夠達(dá)到較高的預(yù)測準(zhǔn)確率;而間接跳轉(zhuǎn)指令因具有多個(gè)目標(biāo)地址而難以準(zhǔn)確預(yù)測。間接跳轉(zhuǎn)指令被廣泛應(yīng)用于現(xiàn)代面向?qū)ο蟪绦蚝吞摂M機(jī)解釋器程序中,由此而引發(fā)了大量間接跳轉(zhuǎn)預(yù)測失效。據(jù)統(tǒng)計(jì),約45%的轉(zhuǎn)移預(yù)測失效是由間接跳轉(zhuǎn)指令所引起的, 因此,間接跳轉(zhuǎn)指令的預(yù)測失效問題是影響現(xiàn)代處理器性能的重要因素之一,如何設(shè)計(jì)高效準(zhǔn)確的間接跳轉(zhuǎn)預(yù)測器是目前處理器設(shè)計(jì)中面臨的一個(gè)難題。在現(xiàn)有的間接跳轉(zhuǎn)預(yù)測器中,關(guān)聯(lián)預(yù)測器是目前使用最為廣泛的一類預(yù)測器。為了提高關(guān)聯(lián)預(yù)測器的預(yù)測準(zhǔn)確率,先后有基于歷史、基于數(shù)據(jù)值和基于提前計(jì)算等多種間接跳轉(zhuǎn)預(yù)測器被提出。其中,基于歷史的間接跳轉(zhuǎn)預(yù)測器使用跳轉(zhuǎn)方向歷史和執(zhí)行路徑歷史等信息,指導(dǎo)間接跳轉(zhuǎn)目標(biāo)地址的預(yù)測;基于數(shù)據(jù)值的間接跳轉(zhuǎn)預(yù)測器使用某些數(shù)據(jù)值指導(dǎo)間接跳轉(zhuǎn)預(yù)測;而基于提前計(jì)算的間接跳轉(zhuǎn)預(yù)測器則使用特殊硬件對(duì)虛函數(shù)調(diào)用這一類特殊的間接跳轉(zhuǎn)指令提前計(jì)算其跳轉(zhuǎn)目標(biāo)地址。目前,最新研究表明,由于間接跳轉(zhuǎn)指令與某些數(shù)據(jù)值必然存在較強(qiáng)的關(guān)聯(lián)性,因此基于數(shù)據(jù)值的間接跳轉(zhuǎn)預(yù)測器相對(duì)來說通常能夠取得較高的預(yù)測準(zhǔn)確率。盡管如此,現(xiàn)有的基于數(shù)據(jù)值的間接跳轉(zhuǎn)預(yù)測器存在兩個(gè)難以解決的問題首先是尋找有效的關(guān)聯(lián)數(shù)據(jù)值是非常困難的;其次,這些關(guān)聯(lián)數(shù)據(jù)值很可能在間接跳轉(zhuǎn)預(yù)測時(shí)是無法得到的。這兩個(gè)問題導(dǎo)致了現(xiàn)有的基于數(shù)據(jù)值的間接跳轉(zhuǎn)預(yù)測器難以取得理想的預(yù)測結(jié)果。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法,能夠根據(jù)間接跳轉(zhuǎn)指令的有效關(guān)聯(lián)值準(zhǔn)確地進(jìn)行間接跳轉(zhuǎn)預(yù)測。為了解決上述技術(shù)問題,本發(fā)明提供了一種實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法,涉及編譯器和處理器,該方法包括編譯器對(duì)處理器執(zhí)行可執(zhí)行程序的過程進(jìn)行剖視,并獲取剖視信息;編譯器根據(jù)該剖視信息通過再次編譯過程識(shí)別源程序中間接跳轉(zhuǎn)指令對(duì)應(yīng)的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,并在源程序中插入用以標(biāo)識(shí)關(guān)聯(lián)數(shù)據(jù)值的引導(dǎo)指令,再次生成可執(zhí)行程序。進(jìn)一步地,編譯器通過對(duì)所述過程進(jìn)行剖視獲取的剖視信息,包括間接跳轉(zhuǎn)指令的執(zhí)行次數(shù)、動(dòng)態(tài)跳轉(zhuǎn)目標(biāo)數(shù)量以及目標(biāo)地址預(yù)測失效次數(shù)中的一種或多種。進(jìn)一步地,編譯器根據(jù)剖視信息通過再次編譯過程識(shí)別源程序中間接跳轉(zhuǎn)指令對(duì)應(yīng)的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,具體包括選取執(zhí)行次數(shù)多于次數(shù)閾值和預(yù)測失效率高于失效率閾值的間接跳轉(zhuǎn)指令為難預(yù)測指令;識(shí)別難預(yù)測指令對(duì)應(yīng)的所述子程序結(jié)構(gòu),包括虛函數(shù)調(diào)用、Switch-case語句以及函數(shù)指針調(diào)用中的一種或多種;其中對(duì)于虛函數(shù)調(diào)用,將虛函數(shù)表地址識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值;對(duì)于所述Switch-case語句,將標(biāo)準(zhǔn)化case變量值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值;對(duì)于函數(shù)指針調(diào)用,將函數(shù)指針值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值。進(jìn)一步地,編譯器在源程序中插入用以標(biāo)識(shí)關(guān)聯(lián)數(shù)據(jù)值的引導(dǎo)指令,再次生成可執(zhí)行程序,具體包括編譯器通過對(duì)源程序過程間的控制流進(jìn)行分析,在控制流的路徑上顯式地插入引導(dǎo)指令,然后再次生成可執(zhí)行程序;引導(dǎo)指令中攜帶的信息包括用于指示引導(dǎo)指令與所述難預(yù)測指令之間的距離值,用于標(biāo)識(shí)對(duì)應(yīng)于難預(yù)測指令的關(guān)聯(lián)數(shù)據(jù)值相應(yīng)的寄存器編號(hào)。進(jìn)一步地,在再次生成可執(zhí)行程序前,還包括編譯器根據(jù)源程序過程間的數(shù)據(jù)依賴關(guān)系對(duì)引導(dǎo)指令進(jìn)行調(diào)度,即包括根據(jù)源程序中指令之間的數(shù)據(jù)依賴關(guān)系建立數(shù)據(jù)依賴圖;在數(shù)據(jù)依賴圖中標(biāo)記引導(dǎo)指令以及引導(dǎo)指令所依賴的所有其它指令;修改被標(biāo)記的指令的調(diào)度優(yōu)先級(jí)為最高。進(jìn)一步地,該方法還包括處理器在執(zhí)行編譯器再次生成的可執(zhí)行程序過程中,根據(jù)弓I導(dǎo)指令動(dòng)態(tài)收集所述關(guān)聯(lián)數(shù)據(jù)值,并對(duì)難預(yù)測指令進(jìn)行預(yù)測。進(jìn)一步地,該方法還涉及一寄存器堆、一至少包括關(guān)聯(lián)值域的關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)以及一目標(biāo)地址緩沖區(qū);處理器在執(zhí)行編譯器再次生成的可執(zhí)行程序過程中,根據(jù)引導(dǎo)指令動(dòng)態(tài)收集關(guān)聯(lián)數(shù)據(jù)值,并對(duì)難預(yù)測指令進(jìn)行預(yù)測,具體包括在引導(dǎo)指令的發(fā)射階段,根據(jù)該引導(dǎo)指令所攜帶的寄存器編號(hào),從寄存器堆中讀取相應(yīng)的寄存器中的值,并將讀取的值作為關(guān)聯(lián)數(shù)據(jù)值寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中的關(guān)聯(lián)值域;在所述難預(yù)測指令的預(yù)測階段,從關(guān)聯(lián)值域中讀取關(guān)聯(lián)數(shù)據(jù)值,根據(jù)難預(yù)測指令的程序計(jì)數(shù)器PC值和讀取的關(guān)聯(lián)數(shù)據(jù)值從所述目標(biāo)地址緩沖區(qū)中預(yù)測該難預(yù)測指令的目標(biāo)地址。進(jìn)一步地,涉及的關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)還包括標(biāo)簽域;處理器將關(guān)聯(lián)數(shù)據(jù)值寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中的關(guān)聯(lián)值域,具體包括將引導(dǎo)指令的PC值與該引導(dǎo)指令攜帶的距離值之和作為標(biāo)簽,若查詢到該標(biāo)簽與標(biāo)簽域中的值相匹配的項(xiàng),則將讀取的關(guān)聯(lián)數(shù)據(jù)值寫入該項(xiàng)對(duì)應(yīng)的關(guān)聯(lián)值域中;否則,在關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中新分配一項(xiàng),并將新分配的項(xiàng)相應(yīng)的標(biāo)簽域進(jìn)行初始化,將讀取的關(guān)聯(lián)數(shù)據(jù)值寫入該新分配的項(xiàng)相應(yīng)的關(guān)聯(lián)值域。進(jìn)一步地,處理器在對(duì)所述間接跳轉(zhuǎn)指令進(jìn)行預(yù)測之前,還包括若查詢到間接跳轉(zhuǎn)指令的PC值與關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的標(biāo)簽域中的值相匹配,則將該跳轉(zhuǎn)指令識(shí)別為難預(yù)測指令;處理器在難預(yù)測指令的預(yù)測階段,讀取關(guān)聯(lián)值域中相應(yīng)的關(guān)聯(lián)數(shù)據(jù)值,根據(jù)難預(yù)測指令的PC值和讀取的關(guān)聯(lián)數(shù)據(jù)值從目標(biāo)地址緩沖區(qū)中預(yù)測該難預(yù)測指令的目標(biāo)地址, 具體包括用該難預(yù)測指令的PC值作為標(biāo)簽從關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)相應(yīng)項(xiàng)的關(guān)聯(lián)值域中讀取關(guān)聯(lián)數(shù)據(jù)值;對(duì)難預(yù)測指令的PC值和讀取的關(guān)聯(lián)數(shù)據(jù)值進(jìn)行異或操作,將異或操作的結(jié)果作為索引,將從目標(biāo)地址緩沖區(qū)中讀取的值作為預(yù)測的難預(yù)測指令的目標(biāo)地址,進(jìn)行下一周期指令的取指和執(zhí)行過程。進(jìn)一步地,涉及的關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)還包括標(biāo)識(shí)域,該方法還包括處理器在對(duì)引導(dǎo)指令進(jìn)行取指時(shí),將該引導(dǎo)指令的PC值和該引導(dǎo)指令攜帶的距離值之和作為標(biāo)簽查詢關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的標(biāo)簽域,若存在與標(biāo)簽域的值相匹配的項(xiàng),則將該項(xiàng)的標(biāo)識(shí)域的值設(shè)為匹配標(biāo)識(shí)值;處理器在對(duì)間接跳轉(zhuǎn)指令進(jìn)行預(yù)測時(shí),用該間接跳轉(zhuǎn)指令的PC值作為標(biāo)簽查詢到與關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的標(biāo)簽域的值相匹配的項(xiàng),則將該項(xiàng)的標(biāo)識(shí)域的值設(shè)為預(yù)測標(biāo)識(shí)值;處理器在引導(dǎo)指令的發(fā)射階段,若根據(jù)該引導(dǎo)指令查詢關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)對(duì)應(yīng)的標(biāo)識(shí)域的值為預(yù)測標(biāo)識(shí)值,則在將根據(jù)該引導(dǎo)指令從寄存器堆讀取的關(guān)聯(lián)數(shù)據(jù)值寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)對(duì)應(yīng)的關(guān)聯(lián)值域的同時(shí),對(duì)難預(yù)測指令的目標(biāo)地址進(jìn)行第二次預(yù)測,若比較兩次預(yù)測的結(jié)果相同,則忽略該第二次預(yù)測的結(jié)果;否則取消第一次預(yù)測之后的所有推測式執(zhí)行的結(jié)果,并重新開始指令的取指和執(zhí)行。通過本發(fā)明的方法及系統(tǒng),由于編譯器在編譯時(shí)刻識(shí)別的典型子程序結(jié)構(gòu)及其有效的關(guān)聯(lián)數(shù)據(jù)值,并通過插入引導(dǎo)指令傳遞給處理器,使得處理器在執(zhí)行程序過程中根據(jù)引導(dǎo)指令將動(dòng)態(tài)收集的關(guān)聯(lián)數(shù)據(jù)值作為有效的關(guān)聯(lián)信息,或者,將動(dòng)態(tài)收集的多個(gè)關(guān)聯(lián)數(shù)據(jù)值形成值歷史模式作為有效的關(guān)聯(lián)信息,來引導(dǎo)預(yù)測間接跳轉(zhuǎn)指令,從而有效地提高了間接跳轉(zhuǎn)指令的預(yù)測準(zhǔn)確率,由此提高了處理器及其應(yīng)用整體的系統(tǒng)性能。
圖1是本發(fā)明的實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法實(shí)施例流程圖;圖2是圖1所示的方法實(shí)施例中編譯器在二次編譯中識(shí)別關(guān)聯(lián)數(shù)據(jù)值實(shí)施例的流程圖;圖3是圖1所示的方法實(shí)施例中處理器根據(jù)引導(dǎo)指令收集關(guān)聯(lián)數(shù)據(jù)值并預(yù)測間接跳轉(zhuǎn)指令方法一實(shí)施例的流程圖;圖4是在圖3所示的方法實(shí)施例中使用的值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測裝置的一實(shí)施例的結(jié)構(gòu)框圖;圖5是對(duì)圖3所示的方法實(shí)施例流程的操作進(jìn)一步細(xì)述的流程;圖6是處理器在執(zhí)行程序過程中幾個(gè)典型操作的時(shí)刻點(diǎn)示意圖;圖7是圖1所示的方法實(shí)施例中編譯器進(jìn)行再次編譯的裝置實(shí)施例的結(jié)構(gòu);圖8是說明本發(fā)明方法及裝置的預(yù)測結(jié)果的評(píng)測實(shí)驗(yàn)結(jié)果數(shù)據(jù)示意圖。
具體實(shí)施例方式下面結(jié)合附圖和優(yōu)選實(shí)施例對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)地說明。以下例舉的實(shí)施例僅用于說明和解釋本發(fā)明,而不構(gòu)成對(duì)本發(fā)明技術(shù)方案的限制。本發(fā)明采用軟硬件協(xié)同的技術(shù)方案,提出了一種基于編譯指導(dǎo)的值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法及系統(tǒng),其核心思想是編譯器通過對(duì)典型的子程序結(jié)構(gòu)中所包含的間接跳轉(zhuǎn)指令的特點(diǎn)分析,找到不同的子程序結(jié)構(gòu)中的間接跳轉(zhuǎn)指令應(yīng)該關(guān)聯(lián)到的不同關(guān)聯(lián)數(shù)據(jù)值, 并通過在程序中插入引導(dǎo)指令對(duì)關(guān)聯(lián)數(shù)據(jù)值進(jìn)行標(biāo)記,以指導(dǎo)處理器在執(zhí)行可執(zhí)行程序時(shí)進(jìn)行的間接跳轉(zhuǎn)預(yù)測。本發(fā)明基于上述思想設(shè)計(jì)了一種根據(jù)子程序結(jié)構(gòu)自動(dòng)為難預(yù)測的間接跳轉(zhuǎn)指令識(shí)別不同關(guān)聯(lián)值的編譯方法,并設(shè)計(jì)了一種能將編譯時(shí)識(shí)別的關(guān)聯(lián)數(shù)據(jù)值傳遞給處理器的引導(dǎo)指令。編譯器根據(jù)子程序結(jié)構(gòu)識(shí)別關(guān)聯(lián)值后顯式地插入引導(dǎo)指令,以便將編譯時(shí)刻識(shí)別的關(guān)聯(lián)信息傳遞給處理器。如圖1所示,是本發(fā)明提供的實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法實(shí)施例的流程,包括編譯器在編譯時(shí)刻執(zhí)行的流程和處理器在程序運(yùn)行時(shí)刻執(zhí)行的流程,分別包括如下步驟10 編譯器通過首次編譯將源程序編譯成可執(zhí)行程序;20 編譯器對(duì)處理器執(zhí)行可執(zhí)行程序過程進(jìn)行剖視,獲取剖視信息;編譯器對(duì)處理器在執(zhí)行可執(zhí)行程序過程中的間接跳轉(zhuǎn)指令進(jìn)行剖視,搜集程序間接跳轉(zhuǎn)指令在典型輸入集情況下的剖視(profiling)信息,主要包括間接跳轉(zhuǎn)指令的執(zhí)行次數(shù)、動(dòng)態(tài)跳轉(zhuǎn)目標(biāo)數(shù)量以及目標(biāo)地址預(yù)測失效次數(shù)中的一種或多種。30:編譯器根據(jù)剖視信息進(jìn)行二次編譯,為間接跳轉(zhuǎn)指令識(shí)別源程序中的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,并在編譯過程中插入引導(dǎo)指令;
其中,編譯器識(shí)別源程序中的間接跳轉(zhuǎn)指令所對(duì)應(yīng)的子程序結(jié)構(gòu),主要包括虛函數(shù)調(diào)用、Switch-case語句、函數(shù)指針調(diào)用中的一種或多種;根據(jù)相應(yīng)的子程序結(jié)構(gòu)識(shí)別與間接跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)具有較強(qiáng)關(guān)聯(lián)性的數(shù)據(jù)值;通過過程間控制流分析,將引導(dǎo)指令顯式插入到程序中,以標(biāo)識(shí)該間接跳轉(zhuǎn)指令所對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值。本發(fā)明為實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測而設(shè)置的“引導(dǎo)指令”,是通過擴(kuò)展指令系統(tǒng)而添加的一種特殊指令(是使用處理器的用戶所看不到的指令),該指令攜帶兩類信息一類信息用于指示本引導(dǎo)指令與相應(yīng)的間接跳轉(zhuǎn)指令的距離,表示這種距離的數(shù)值可以為正值或者負(fù)值,它由引導(dǎo)指令和間接跳轉(zhuǎn)指令的相對(duì)順序決定;另一類信息則是標(biāo)識(shí)間接跳轉(zhuǎn)指令所對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值相應(yīng)的寄存器編號(hào)。引導(dǎo)指令的具體格式可以根據(jù)處理器的指令系統(tǒng)的特點(diǎn)而定制。40:生成可執(zhí)行程序;50 處理器在執(zhí)行可執(zhí)行程序過程中根據(jù)引導(dǎo)指令動(dòng)態(tài)收集關(guān)聯(lián)數(shù)據(jù)值,并對(duì)間接跳轉(zhuǎn)指令進(jìn)行預(yù)測。圖1中所示的步驟30,即編譯器在第二次編譯過程中識(shí)別關(guān)聯(lián)數(shù)據(jù)值實(shí)施例的流程表示在圖2中,包括如下步驟301 編譯器根據(jù)源程序及其典型輸入集剖視處理器執(zhí)行的程序,搜集難預(yù)測指令;編譯器根據(jù)在剖視過程中獲取的剖視信息選取執(zhí)行次數(shù)多于次數(shù)閾值和預(yù)測失效率高于失效率閾值的間接跳轉(zhuǎn)指令作為“難預(yù)測指令”。302 根據(jù)源程序中的子程序結(jié)構(gòu)為每個(gè)難預(yù)測指令識(shí)別關(guān)聯(lián)數(shù)據(jù)值;編譯器在二次編譯過程中對(duì)那些“難預(yù)測指令”進(jìn)行特殊處理,包括(1)識(shí)別“難預(yù)測指令”對(duì)應(yīng)的子程序結(jié)構(gòu);這些子程序結(jié)構(gòu)是一種局部控制流和數(shù)據(jù)依賴結(jié)構(gòu),即包括上述虛函數(shù)調(diào)用、 Switch-case語句、函數(shù)指針調(diào)用中的一種或多種。由于這些子程序結(jié)構(gòu)攜帶了源程序級(jí)別的控制流和數(shù)據(jù)流信息,因此能夠更清楚地表明哪些數(shù)據(jù)值與間接跳轉(zhuǎn)指令關(guān)聯(lián)性較強(qiáng), 以及如何使用這些關(guān)聯(lián)性強(qiáng)的數(shù)據(jù)值。(2)根據(jù)相應(yīng)的子程序結(jié)構(gòu)識(shí)別與間接跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)具有較強(qiáng)關(guān)聯(lián)性的數(shù)據(jù)值;其中a、對(duì)于虛函數(shù)調(diào)用,編譯器將虛函數(shù)表地址識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值。虛函數(shù)是一種為實(shí)現(xiàn)面向?qū)ο蟪绦蛑小岸鄳B(tài)性”特征而設(shè)計(jì)的一種特殊函數(shù)調(diào)用。 該“多態(tài)性”是指發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí),有可能導(dǎo)致完全不同的行為, 因此虛函數(shù)調(diào)用目標(biāo)地址由對(duì)象的具體類型動(dòng)態(tài)確定。應(yīng)用于虛函數(shù)調(diào)用的間接跳轉(zhuǎn)指令通常需要進(jìn)行三個(gè)過程,即獲取對(duì)象地址、獲取虛函數(shù)表地址以及間接跳轉(zhuǎn)。根據(jù)虛函數(shù)調(diào)用的語義特征,可以發(fā)現(xiàn)虛函數(shù)表地址和間接跳轉(zhuǎn)指令的目標(biāo)地址是一一對(duì)應(yīng)的,因此編譯器將虛函數(shù)表地址識(shí)別為間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值。b、對(duì)于Switch-case語句,編譯器將標(biāo)準(zhǔn)化case變量值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值。Switch-case語句是一種根據(jù)case變量值動(dòng)態(tài)選擇分支路徑執(zhí)行的控制流結(jié)構(gòu),被廣泛用于C/C++/C#/Java等現(xiàn)代高級(jí)編程語言中。通常,當(dāng)分支路徑數(shù)目大于一定閾值時(shí),編譯器會(huì)使用間接跳轉(zhuǎn)指令來實(shí)現(xiàn)Switch-case語句,否則使用if-else結(jié)構(gòu)來實(shí)現(xiàn)。 當(dāng)使用間接跳轉(zhuǎn)指令實(shí)現(xiàn)時(shí),其具體過程為首先對(duì)case變量進(jìn)行標(biāo)準(zhǔn)化使其成為從0開始的相鄰枚舉變量,然后使用標(biāo)準(zhǔn)化case變量值作為索引獲得相應(yīng)目標(biāo)地址,并使用間接跳轉(zhuǎn)指令跳轉(zhuǎn)到相應(yīng)分支路徑。由于標(biāo)準(zhǔn)化case變量值直接決定了間接跳轉(zhuǎn)指令將會(huì)跳轉(zhuǎn)到哪個(gè)分支路徑,它與間接跳轉(zhuǎn)指令目標(biāo)地址具有很強(qiáng)的關(guān)聯(lián)性,因此編譯器識(shí)別標(biāo)準(zhǔn)化 case變量值作為關(guān)聯(lián)值。C、對(duì)于函數(shù)指針調(diào)用,編譯器將函數(shù)指針值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值。函數(shù)指針調(diào)用主要用于根據(jù)指針內(nèi)容跳轉(zhuǎn)到相應(yīng)的目標(biāo)地址。該函數(shù)指針值直接決定了間接跳轉(zhuǎn)指令的目標(biāo)地址,因此編譯器識(shí)別函數(shù)指針值作為間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值。303 在源程序的控制流路徑上顯式地插入引導(dǎo)指令,以標(biāo)識(shí)關(guān)聯(lián)數(shù)據(jù)值;編譯器通過對(duì)源程序的控制流進(jìn)行分析,在該控制流的路徑上顯式地插入引導(dǎo)指令,以標(biāo)識(shí)相應(yīng)的間接跳轉(zhuǎn)指令所對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值。編譯器在每一個(gè)控制路徑上插入引導(dǎo)指令,可跟蹤多條控制流路徑,所以每個(gè)間接跳轉(zhuǎn)指令可能會(huì)對(duì)應(yīng)多個(gè)弓I導(dǎo)指令。304 根據(jù)程序過程間數(shù)據(jù)依賴關(guān)系對(duì)引導(dǎo)指令進(jìn)行調(diào)度,以增大引導(dǎo)指令和間接跳轉(zhuǎn)指令間的距離??蓤?zhí)行程序中的指令之間是存在數(shù)據(jù)依賴關(guān)系的,譬如一個(gè)寄存器中的值依賴于另外一個(gè)寄存器的值,或依賴于對(duì)多個(gè)寄存器的值運(yùn)算的結(jié)果,或依賴于一個(gè)標(biāo)號(hào)地址中的值。編譯器對(duì)引導(dǎo)指令的調(diào)度主要是根據(jù)指令之間的這種數(shù)據(jù)依賴關(guān)系,在不影響程序正確性的前提下動(dòng)態(tài)調(diào)度引導(dǎo)指令以及引導(dǎo)指令的前驅(qū)指令和后繼指令,以增大引導(dǎo)指令和間接跳轉(zhuǎn)指令之間的距離,從而使得處理器能夠及時(shí)通過引導(dǎo)指令傳遞的關(guān)聯(lián)數(shù)據(jù)值對(duì)間接跳轉(zhuǎn)指令目標(biāo)地址進(jìn)行預(yù)測。具體的指令調(diào)度算法是基于傳統(tǒng)“表調(diào)度”算法(參考《Compilers principles, Techniques, & Tools, second Edition))中 10. 3. 2 節(jié))實(shí)現(xiàn)的,包含如下步驟 根據(jù)程序中指令之間的數(shù)據(jù)依賴關(guān)系建立數(shù)據(jù)依賴圖; 在數(shù)據(jù)依賴圖中標(biāo)記引導(dǎo)指令,以及引導(dǎo)指令所依賴的所有其它指令; 修改這些被標(biāo)記指令的調(diào)度優(yōu)先級(jí),使得它們的優(yōu)先級(jí)最高,以便盡可能早地完成這些被標(biāo)記指令的調(diào)度。通過修改調(diào)度優(yōu)先級(jí)的方法,引導(dǎo)指令就可以盡早完成調(diào)度,在引導(dǎo)指令和間接跳轉(zhuǎn)指令之間留下盡可能多的指令,從而增大了弓丨導(dǎo)指令和間接跳轉(zhuǎn)指令之間的距離。對(duì)于圖1所示的方法實(shí)施例中處理器根據(jù)引導(dǎo)指令收集關(guān)聯(lián)數(shù)據(jù)值并預(yù)測間接跳轉(zhuǎn)指令方法實(shí)施例的具體流程表示在圖3中,包括如下步驟510:在引導(dǎo)指令的發(fā)射階段,根據(jù)引導(dǎo)指令從寄存器堆動(dòng)態(tài)收集關(guān)聯(lián)數(shù)據(jù)值,并寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū);處理器在開始運(yùn)行可執(zhí)行程序時(shí),通過執(zhí)行引導(dǎo)指令來動(dòng)態(tài)收集關(guān)聯(lián)數(shù)據(jù)值,并使用關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)結(jié)構(gòu)保存收集的關(guān)聯(lián)數(shù)據(jù)值。
關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的結(jié)構(gòu)可參見圖4中的關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1,它是一種容量很小(可小于IK bit)的硬件存儲(chǔ)器,至少包含關(guān)聯(lián)值域,用于存放處理器收集的關(guān)聯(lián)數(shù)據(jù)值。其訪問方式可以根據(jù)處理器特性配置為全相連(即當(dāng)關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中的項(xiàng)目數(shù)較少時(shí),可以訪問全部項(xiàng)目)或者組相連(即當(dāng)關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中的項(xiàng)目數(shù)較多時(shí),每次只能訪問同一組的項(xiàng)目),可以配置為含標(biāo)簽(在全相連的情況下每次訪問需要用標(biāo)簽作為索引)或無標(biāo)簽(在組相連的情況下可以不用訪問標(biāo)簽)。處理器根據(jù)引導(dǎo)指令從寄存器堆動(dòng)態(tài)收集關(guān)聯(lián)數(shù)據(jù)值,并寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū),具體包括在圖5所示的流程中如下步驟中511 在引導(dǎo)指令的發(fā)射階段,根據(jù)引導(dǎo)指令表明的寄存器的編號(hào)讀取寄存器堆中相應(yīng)寄存器的值作為關(guān)聯(lián)數(shù)據(jù)值收集;請(qǐng)參照?qǐng)D4,當(dāng)引導(dǎo)指令進(jìn)入發(fā)射階段時(shí),處理器根據(jù)引導(dǎo)指令所標(biāo)識(shí)的關(guān)聯(lián)數(shù)據(jù)值對(duì)應(yīng)的寄存器編號(hào)RA,從寄存器堆2中讀取相應(yīng)的寄存器中的值,并將其作為關(guān)聯(lián)數(shù)據(jù)值收集。512:將當(dāng)前引導(dǎo)指令的PC值與該引導(dǎo)指令攜帶的距離值之和作為標(biāo)簽訪問關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)內(nèi)各項(xiàng)的標(biāo)簽域;請(qǐng)參照?qǐng)D4,關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1還包含標(biāo)簽域,用于存放訪問關(guān)聯(lián)值域的索引標(biāo)簽值。處理器寫入過程以當(dāng)前引導(dǎo)指令所對(duì)應(yīng)的間接跳轉(zhuǎn)指令的程序計(jì)數(shù)器(PC, Program Counter)值作為標(biāo)簽,該標(biāo)簽具體計(jì)算方式為將當(dāng)前引導(dǎo)指令的PC值加上該引導(dǎo)指令中所攜帶的距離值Offset。513 515 處理器在對(duì)圖4所示的關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1的寫入過程中,若該標(biāo)簽與關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1的某一項(xiàng)的標(biāo)簽域的值相匹配,則直接將從寄存器堆2中讀取的關(guān)聯(lián)數(shù)據(jù)值寫入這一項(xiàng)的關(guān)聯(lián)值域;否則,在關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1中新分配一項(xiàng),并將其中的標(biāo)簽域進(jìn)行初始化,以及將讀取的關(guān)聯(lián)數(shù)據(jù)值寫入該項(xiàng)的關(guān)聯(lián)值域。520:在間接跳轉(zhuǎn)指令的取指階段,根據(jù)間接跳轉(zhuǎn)指令訪問關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū),識(shí)別難預(yù)測的間接跳轉(zhuǎn)指令;處理器根據(jù)間接跳轉(zhuǎn)指令訪問關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū),識(shí)別難預(yù)測的間接跳轉(zhuǎn)指令, 具體包括在圖5所示的如下步驟521、522中521 在指令的取指階段,將間接跳轉(zhuǎn)指令的PC值作為標(biāo)簽訪問關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)內(nèi)各項(xiàng)的標(biāo)簽域;522:若關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)存在該標(biāo)簽與標(biāo)簽域中的值匹配的項(xiàng),將該間接跳轉(zhuǎn)指令識(shí)別為難預(yù)測指令,否則識(shí)別為普通跳轉(zhuǎn)指令。530 根據(jù)難預(yù)測的間接跳轉(zhuǎn)指令的PC值和從關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)讀取的相應(yīng)的關(guān)聯(lián)數(shù)據(jù)值獲取保存在目標(biāo)地址緩沖區(qū)內(nèi)的目標(biāo)地址,作為難預(yù)測指令的預(yù)測結(jié)果。處理器對(duì)識(shí)別為難預(yù)測指令的預(yù)測處理和對(duì)識(shí)別為普通跳轉(zhuǎn)指令的處理分別包括在圖5所示的如下步驟531、532中531 對(duì)于難預(yù)測指令,將從相應(yīng)的關(guān)聯(lián)值域讀取的關(guān)聯(lián)數(shù)據(jù)值與該指令的PC值相異或,并以異或結(jié)果作為索引,從常規(guī)BTB中讀取間接跳轉(zhuǎn)目標(biāo)地址。請(qǐng)參照?qǐng)D4,處理器對(duì)所有的難預(yù)測指令以該指令的PC值作為標(biāo)簽訪問關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1,并讀取相應(yīng)項(xiàng)關(guān)聯(lián)域中的關(guān)聯(lián)數(shù)據(jù)值;然后將讀取的關(guān)聯(lián)數(shù)據(jù)值與該指令的PC值相異或,并將異或結(jié)果作為索引訪問常規(guī)的目標(biāo)地址緩沖區(qū)(BTB,Branch Target Buffer) 3,并將從BTB 3中讀取的值作為對(duì)該間接跳轉(zhuǎn)指令預(yù)測的目標(biāo)地址,進(jìn)行下一周期指令的取指和執(zhí)行過程。532 對(duì)于普通跳轉(zhuǎn)指令,按該指令的PC值訪問BTB,獲取目標(biāo)地址。處理器對(duì)普通跳轉(zhuǎn)指令的訪問過程和傳統(tǒng)訪問過程一致,即直接使用該普通跳轉(zhuǎn)指令的PC值作為索引訪問常規(guī)的BTB。引導(dǎo)指令的發(fā)射時(shí)刻既有可能在該指令的取指時(shí)刻之前,如圖6中所示的時(shí)刻 (1),也有可能在該指令的取指時(shí)刻之后,如圖6中所示的時(shí)刻O)。因此,在間接跳轉(zhuǎn)指令被取指時(shí)的預(yù)測階段,當(dāng)前間接跳轉(zhuǎn)指令對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值有可能尚未寫入關(guān)聯(lián)值緩沖區(qū)中,在此情況下可使用“目標(biāo)地址覆蓋”機(jī)制進(jìn)行處理,即首先使用關(guān)聯(lián)值緩沖區(qū)中已有的舊值作為關(guān)聯(lián)數(shù)據(jù)值進(jìn)行第一次目標(biāo)地址預(yù)測(因?yàn)樘幚砥鞔藭r(shí)并不知道該值是舊值); 在隨后發(fā)生的引導(dǎo)指令發(fā)射階段,當(dāng)處理器將最新的關(guān)聯(lián)數(shù)據(jù)值寫入關(guān)聯(lián)數(shù)據(jù)緩沖區(qū)的同時(shí),使用更新后的關(guān)聯(lián)數(shù)據(jù)值進(jìn)行第二次目標(biāo)地址預(yù)測,并比較第二次預(yù)測的結(jié)果,若兩次預(yù)測的結(jié)果相同,則忽略第二次預(yù)測的結(jié)果并繼續(xù)當(dāng)前取指和執(zhí)行過程,若兩次預(yù)測的結(jié)果不同,則取消第一次預(yù)測之后所有推測執(zhí)行的指令,并根據(jù)第二次預(yù)測的結(jié)果進(jìn)行新的取指和執(zhí)行過程。由于第二次預(yù)測具有更高的預(yù)測準(zhǔn)確率,因此“目標(biāo)地址覆蓋”機(jī)制能夠有效減小預(yù)測失效,減少預(yù)測失效所帶來的流水線清空的開銷。上述“目標(biāo)地址覆蓋”機(jī)制可借助于關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的標(biāo)識(shí)域,譬如U比特(可有一個(gè)或多個(gè)Bit)來實(shí)現(xiàn),如圖4所示,在關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1中包含該U比特,用于表明引導(dǎo)指令發(fā)射階段和間接跳轉(zhuǎn)預(yù)測階段的相對(duì)順序。當(dāng)引導(dǎo)指令被取指時(shí),處理器根據(jù)引導(dǎo)指令的PC值和該引導(dǎo)指令包含的距離值Off set之和查詢關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1,若存在標(biāo)簽匹配項(xiàng),則設(shè)置該項(xiàng)的U比特為匹配標(biāo)識(shí)值(譬如設(shè)為0);當(dāng)相應(yīng)的間接跳轉(zhuǎn)指令被取指和預(yù)測時(shí),處理器根據(jù)該指令的PC值也查詢關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1,并將對(duì)應(yīng)項(xiàng)的U比特設(shè)置為預(yù)測標(biāo)識(shí)值(譬如設(shè)為1)。在引導(dǎo)指令的發(fā)射階段,處理器若查詢對(duì)應(yīng)的U比特為預(yù)測標(biāo)識(shí)值(譬如為1),則表明相應(yīng)項(xiàng)的關(guān)聯(lián)值域中的關(guān)聯(lián)數(shù)據(jù)值是首次預(yù)測(發(fā)生在引導(dǎo)指令的發(fā)射時(shí)刻之前)使用的關(guān)聯(lián)數(shù)據(jù)值,是舊值,則處理器在將該引導(dǎo)指令對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1的同時(shí),再次對(duì)間接跳轉(zhuǎn)指令的目標(biāo)地址進(jìn)行預(yù)測,并比較兩次預(yù)測的結(jié)果,若兩次預(yù)測的結(jié)果相同則忽略第二次預(yù)測結(jié)果,否則取消第一次預(yù)測之后的所有推測式執(zhí)行的結(jié)果,并重新開始指令的取指和執(zhí)行。針對(duì)上述實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測方法實(shí)施例,本發(fā)明相應(yīng)地還提供了一種在該方法實(shí)施例中編譯時(shí)刻進(jìn)行再次編譯的裝置實(shí)施例,其結(jié)構(gòu)如圖7所示,包括依次連接的程序剖視模塊710、關(guān)聯(lián)數(shù)據(jù)值識(shí)別模塊720以及引導(dǎo)指令插入模塊730,其中程序剖視模塊710,用于對(duì)處理器執(zhí)行可執(zhí)行程序的過程進(jìn)行剖視,并將獲取的剖視信息輸出給關(guān)聯(lián)數(shù)據(jù)值識(shí)別模塊720 ;關(guān)聯(lián)數(shù)據(jù)值識(shí)別模塊720,用于根據(jù)輸入的剖視信息通過再次編譯過程識(shí)別源程序中間接跳轉(zhuǎn)指令對(duì)應(yīng)的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,并將識(shí)別的子程序結(jié)構(gòu)對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值輸出給引導(dǎo)指令插入模塊730 ;引導(dǎo)指令插入模塊730,用于將輸入的關(guān)聯(lián)數(shù)據(jù)值包含在相應(yīng)的弓I導(dǎo)指令里插入到源程序中,再次生成可執(zhí)行程序。程序剖視模塊710通過對(duì)上述過程進(jìn)行剖視獲取、并向關(guān)聯(lián)數(shù)據(jù)值識(shí)別模塊輸出的剖視信息,包括間接跳轉(zhuǎn)指令的執(zhí)行次數(shù)、動(dòng)態(tài)跳轉(zhuǎn)目標(biāo)數(shù)量以及目標(biāo)地址預(yù)測失效次數(shù)中的一種或多種;關(guān)聯(lián)數(shù)據(jù)值識(shí)別模塊720選取執(zhí)行次數(shù)多于次數(shù)閾值和預(yù)測失效率高于失效率閾值的間接跳轉(zhuǎn)指令為難預(yù)測指令;識(shí)別難預(yù)測指令對(duì)應(yīng)的子程序結(jié)構(gòu),包括虛函數(shù)調(diào)用、 Switch-case語句以及函數(shù)指針調(diào)用中的一種或多種;其中對(duì)于虛函數(shù)調(diào)用,將虛函數(shù)表地址識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的所述關(guān)聯(lián)數(shù)據(jù)值;對(duì)于Switch-case語句,將標(biāo)準(zhǔn)化 case變量值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的所述關(guān)聯(lián)數(shù)據(jù)值;對(duì)于函數(shù)指針調(diào)用,將函數(shù)指針值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值;引導(dǎo)指令插入模塊730進(jìn)一步包括引導(dǎo)指令插入單元和引導(dǎo)指令調(diào)度單元,其中引導(dǎo)指令插入單元,用于通過對(duì)源程序過程間的控制流進(jìn)行分析,在控制流的路徑上顯式地插入引導(dǎo)指令,引導(dǎo)指令中攜帶的信息包括用于指示引導(dǎo)指令與難預(yù)測指令之間的距離值,用于標(biāo)識(shí)對(duì)應(yīng)于難預(yù)測指令的關(guān)聯(lián)數(shù)據(jù)值相應(yīng)的寄存器編號(hào);引導(dǎo)指令調(diào)度單元,用于對(duì)插入引導(dǎo)指令的源程序根據(jù)指令之間的數(shù)據(jù)依賴關(guān)系對(duì)引導(dǎo)指令進(jìn)行動(dòng)態(tài)調(diào)度,以增大引導(dǎo)指令和間接跳轉(zhuǎn)指令之間的距離;然后再次生成可執(zhí)行程序。針對(duì)上述實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測方法實(shí)施例,本發(fā)明相應(yīng)地還提供了一種在該方法實(shí)施例中處理器在程序時(shí)刻預(yù)測間接跳轉(zhuǎn)指令的裝置實(shí)施例,其結(jié)構(gòu)框圖如圖4所示,包括關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1、寄存器堆2、目標(biāo)地址緩沖區(qū)3、指令取指模塊4以及引導(dǎo)指令發(fā)射模塊5,其中指令取指模塊4,用于在指令的取指時(shí)刻將接收的引導(dǎo)指令輸出給引導(dǎo)指令發(fā)射模塊5 ;引導(dǎo)指令發(fā)射模塊5,用于在引導(dǎo)指令發(fā)射階段根據(jù)該引導(dǎo)指令從寄存器堆2讀取收集間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值,并存放在關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1 ;關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1,至少包含關(guān)聯(lián)值域,用于存放引導(dǎo)指令發(fā)射模塊5收集的關(guān)聯(lián)數(shù)據(jù)值;寄存器堆2,用于在處理器執(zhí)行指令期間通過多個(gè)寄存器存放間接跳轉(zhuǎn)指令對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)值;目標(biāo)地址緩沖區(qū)3,用于根據(jù)間接跳轉(zhuǎn)指令的PC值和關(guān)聯(lián)數(shù)據(jù)值作為索引,保存間接跳轉(zhuǎn)指令的目標(biāo)地址。關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1還包含標(biāo)簽域,用于存放訪問相應(yīng)項(xiàng)關(guān)聯(lián)值域的索引標(biāo)簽;引導(dǎo)指令發(fā)射模塊5在引導(dǎo)指令發(fā)射階段根據(jù)引導(dǎo)指令包含的寄存器的編號(hào)從寄存器堆2中讀取相應(yīng)寄存器中的值作為間接跳轉(zhuǎn)指令的關(guān)聯(lián)數(shù)據(jù)值,根據(jù)引導(dǎo)指令的PC 值和引導(dǎo)指令攜帶的距離值Offset之和作為訪問標(biāo)簽將收集的關(guān)聯(lián)數(shù)據(jù)值寫入相應(yīng)項(xiàng)的關(guān)聯(lián)值域。
指令取指模塊4在間接跳轉(zhuǎn)指令的取指時(shí)刻,將該間接跳轉(zhuǎn)指令的PC值作為標(biāo)簽與關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1中的標(biāo)簽域進(jìn)行比較,若查詢到該標(biāo)簽與某一項(xiàng)標(biāo)簽域中的值相匹配,則將該跳轉(zhuǎn)指令識(shí)別為“難預(yù)測指令”。指令取指模塊4在間接跳轉(zhuǎn)指令的預(yù)測階段,針對(duì)“難預(yù)測指令”以該指令的PC值作為標(biāo)簽訪問關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1,并從相應(yīng)項(xiàng)關(guān)聯(lián)值域中讀取關(guān)聯(lián)數(shù)據(jù)值;將讀取的關(guān)聯(lián)數(shù)據(jù)值與該指令的PC值相異或,并將異或結(jié)果作為索引訪問目標(biāo)地址緩沖區(qū)3,并將從中讀取的值作為對(duì)該間接跳轉(zhuǎn)指令預(yù)測的目標(biāo)地址進(jìn)行下一周期指令的取指和執(zhí)行過程。關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1還包含標(biāo)識(shí)域,譬如U比特;指令取指模塊4還在對(duì)引導(dǎo)指令的取指時(shí)刻,用該引導(dǎo)指令的PC值和該引導(dǎo)指令包含的距離值Offset之和作為標(biāo)簽查詢關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1的標(biāo)簽域,若存在標(biāo)簽匹配項(xiàng),則設(shè)置該項(xiàng)的U比特為一匹配標(biāo)識(shí)值(譬如設(shè)為0);在對(duì)相應(yīng)的間接跳轉(zhuǎn)指令進(jìn)行預(yù)測時(shí),根據(jù)該指令的PC值查詢到有與關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1的標(biāo)簽域的值相匹配的項(xiàng),則將該項(xiàng)的U比特設(shè)置為一預(yù)測標(biāo)識(shí)值(譬如設(shè)為1)。引導(dǎo)指令發(fā)射模塊5在引導(dǎo)指令的發(fā)射時(shí)刻將該引導(dǎo)指令的PC值和其包含的距離值之和作為標(biāo)簽,若查詢到關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1中對(duì)應(yīng)項(xiàng)的U比特為預(yù)測標(biāo)識(shí)值(譬如為1),則在將根據(jù)該引導(dǎo)指令包含的寄存器的編號(hào)從寄存器堆2讀取的關(guān)聯(lián)數(shù)據(jù)值寫入關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)1相應(yīng)的關(guān)聯(lián)值域的同時(shí),向指令取指模塊4輸出再次預(yù)測命令;指令取指模塊4根據(jù)再次預(yù)測命令對(duì)間接跳轉(zhuǎn)指令的目標(biāo)地址進(jìn)行預(yù)測,并比較兩次預(yù)測的結(jié)果,若兩次預(yù)測的結(jié)果相同則忽略第二次預(yù)測結(jié)果,否則取消第一次預(yù)測之后的所有推測式執(zhí)行的結(jié)果,并重新開始指令的取指和執(zhí)行。針對(duì)上述方法實(shí)施例和裝置實(shí)施例進(jìn)行了預(yù)測結(jié)果評(píng)測實(shí)驗(yàn)。評(píng)測實(shí)驗(yàn)結(jié)果表明,本發(fā)明能夠有效地提高預(yù)測準(zhǔn)確率,從而提高處理器性能。實(shí)驗(yàn)環(huán)境基于Simplekalar 模擬器和SPEC典型評(píng)測程序集。基礎(chǔ)處理器使用4K表項(xiàng)、4路組相連BTB結(jié)構(gòu)實(shí)現(xiàn)間接跳轉(zhuǎn)預(yù)測,基本參數(shù)如表1所示。表1.基礎(chǔ)處理器配置參數(shù)
權(quán)利要求
1.一種實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法,涉及編譯器和處理器,該方法包括 編譯器對(duì)處理器執(zhí)行可執(zhí)行程序的過程進(jìn)行剖視,并獲取剖視信息;編譯器根據(jù)所述剖視信息通過再次編譯過程識(shí)別源程序中間接跳轉(zhuǎn)指令對(duì)應(yīng)的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,并在所述源程序中插入用以標(biāo)識(shí)所述關(guān)聯(lián)數(shù)據(jù)值的引導(dǎo)指令,再次生成可執(zhí)行程序。
2.按照權(quán)利要求1所述的方法,其特征在于,所述編譯器通過對(duì)所述過程進(jìn)行剖視獲取的剖視信息,包括間接跳轉(zhuǎn)指令的執(zhí)行次數(shù)、動(dòng)態(tài)跳轉(zhuǎn)目標(biāo)數(shù)量以及目標(biāo)地址預(yù)測失效次數(shù)中的一種或多種。
3.按照權(quán)利要求2所述的方法,其特征在于,所述編譯器根據(jù)所述剖視信息通過再次編譯過程識(shí)別源程序中間接跳轉(zhuǎn)指令對(duì)應(yīng)的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,具體包括選取執(zhí)行次數(shù)多于次數(shù)閾值和預(yù)測失效率高于失效率閾值的所述間接跳轉(zhuǎn)指令為難預(yù)測指令;識(shí)別所述難預(yù)測指令對(duì)應(yīng)的所述子程序結(jié)構(gòu),包括虛函數(shù)調(diào)用、Switch-case語句以及函數(shù)指針調(diào)用中的一種或多種;其中對(duì)于所述虛函數(shù)調(diào)用,將虛函數(shù)表地址識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的所述關(guān)聯(lián)數(shù)據(jù)值;對(duì)于所述Switch-case語句,將標(biāo)準(zhǔn)化case變量值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的所述關(guān)聯(lián)數(shù)據(jù)值;對(duì)于所述函數(shù)指針調(diào)用,將函數(shù)指針值識(shí)別為相應(yīng)的間接跳轉(zhuǎn)指令的所述關(guān)聯(lián)數(shù)據(jù)值。
4.按照權(quán)利要求3所述的方法,其特征在于,所述編譯器在所述源程序中插入用以標(biāo)識(shí)所述關(guān)聯(lián)數(shù)據(jù)值的引導(dǎo)指令,再次生成可執(zhí)行程序,具體包括所述編譯器通過對(duì)所述源程序過程間的控制流進(jìn)行分析,在所述控制流的路徑上顯式地插入所述引導(dǎo)指令,然后再次生成可執(zhí)行程序;所述引導(dǎo)指令中攜帶的信息包括用于指示所述引導(dǎo)指令與所述難預(yù)測指令之間的距離值,用于標(biāo)識(shí)對(duì)應(yīng)于所述難預(yù)測指令的所述關(guān)聯(lián)數(shù)據(jù)值相應(yīng)的寄存器編號(hào)。
5.按照權(quán)利要求4所述的方法,其特征在于,在再次生成可執(zhí)行程序前,還包括 所述編譯器根據(jù)所述源程序過程間的數(shù)據(jù)依賴關(guān)系對(duì)所述引導(dǎo)指令進(jìn)行調(diào)度,即包括根據(jù)所述源程序中指令之間的數(shù)據(jù)依賴關(guān)系建立數(shù)據(jù)依賴圖; 在所述數(shù)據(jù)依賴圖中標(biāo)記所述弓I導(dǎo)指令以及所述弓I導(dǎo)指令所依賴的所有其它指令; 修改被標(biāo)記的指令的調(diào)度優(yōu)先級(jí)為最高。
6.按照權(quán)利要求4或5所述的方法,其特征在于,還包括所述處理器在執(zhí)行所述編譯器再次生成的可執(zhí)行程序過程中,根據(jù)所述引導(dǎo)指令動(dòng)態(tài)收集所述關(guān)聯(lián)數(shù)據(jù)值,并對(duì)所述難預(yù)測指令進(jìn)行預(yù)測。
7.按照權(quán)利要求6所述的方法,其特征在于,還涉及一寄存器堆、一至少包括關(guān)聯(lián)值域的關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)以及一目標(biāo)地址緩沖區(qū);所述處理器在執(zhí)行所述編譯器再次生成的可執(zhí)行程序過程中,根據(jù)所述引導(dǎo)指令動(dòng)態(tài)收集所述關(guān)聯(lián)數(shù)據(jù)值,并對(duì)所述難預(yù)測指令進(jìn)行預(yù)測,具體包括在所述引導(dǎo)指令的發(fā)射階段,根據(jù)該引導(dǎo)指令所攜帶的所述寄存器編號(hào),從所述寄存器堆中讀取相應(yīng)的寄存器中的值,并將讀取的值作為所述關(guān)聯(lián)數(shù)據(jù)值寫入所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中的所述關(guān)聯(lián)值域;在所述難預(yù)測指令的預(yù)測階段,從所述關(guān)聯(lián)值域中讀取關(guān)聯(lián)數(shù)據(jù)值,根據(jù)所述難預(yù)測指令的程序計(jì)數(shù)器PC值和讀取的所述關(guān)聯(lián)數(shù)據(jù)值從所述目標(biāo)地址緩沖區(qū)中預(yù)測該難預(yù)測指令的目標(biāo)地址。
8.按照權(quán)利要求7所述的方法,其特征在于,涉及的所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)還包括標(biāo)簽域;所述處理器將所述關(guān)聯(lián)數(shù)據(jù)值寫入所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中的所述關(guān)聯(lián)值域,具體包括將所述引導(dǎo)指令的PC值與該引導(dǎo)指令攜帶的所述距離值之和作為標(biāo)簽,若查詢到該標(biāo)簽與所述標(biāo)簽域中的值相匹配的項(xiàng),則將讀取的所述關(guān)聯(lián)數(shù)據(jù)值寫入該項(xiàng)對(duì)應(yīng)的關(guān)聯(lián)值域中;否則,在所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)中新分配一項(xiàng),并將新分配的項(xiàng)相應(yīng)的標(biāo)簽域進(jìn)行初始化,將讀取的所述關(guān)聯(lián)數(shù)據(jù)值寫入該新分配的項(xiàng)相應(yīng)的關(guān)聯(lián)值域。
9.按照權(quán)利要求8所述的方法,其特征在于,所述處理器在對(duì)所述間接跳轉(zhuǎn)指令進(jìn)行預(yù)測之前,還包括若查詢到所述間接跳轉(zhuǎn)指令的PC值與所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的所述標(biāo)簽域中的值相匹配,則將該跳轉(zhuǎn)指令識(shí)別為難預(yù)測指令;所述處理器在所述難預(yù)測指令的預(yù)測階段,讀取所述關(guān)聯(lián)值域中相應(yīng)的關(guān)聯(lián)數(shù)據(jù)值, 根據(jù)所述難預(yù)測指令的PC值和讀取的所述關(guān)聯(lián)數(shù)據(jù)值從所述目標(biāo)地址緩沖區(qū)中預(yù)測該難預(yù)測指令的目標(biāo)地址,具體包括用所述難預(yù)測指令的PC值作為標(biāo)簽從所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)相應(yīng)項(xiàng)的關(guān)聯(lián)值域中讀取所述關(guān)聯(lián)數(shù)據(jù)值;對(duì)所述難預(yù)測指令的PC值和讀取的所述關(guān)聯(lián)數(shù)據(jù)值進(jìn)行異或操作,將所述異或操作的結(jié)果作為索引,將從所述目標(biāo)地址緩沖區(qū)中讀取的值作為預(yù)測的所述難預(yù)測指令的目標(biāo)地址,進(jìn)行下一周期指令的取指和執(zhí)行過程。
10.按照權(quán)利要求9所述的方法,其特征在于,涉及的所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)還包括標(biāo)識(shí)域,所述方法還包括所述處理器在對(duì)所述引導(dǎo)指令進(jìn)行取指時(shí),將該引導(dǎo)指令的PC值和該引導(dǎo)指令攜帶的距離值之和作為標(biāo)簽查詢所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的標(biāo)簽域,若存在與所述標(biāo)簽域的值相匹配的項(xiàng),則將該項(xiàng)的標(biāo)識(shí)域的值設(shè)為匹配標(biāo)識(shí)值;所述處理器在對(duì)所述間接跳轉(zhuǎn)指令進(jìn)行預(yù)測時(shí),用該間接跳轉(zhuǎn)指令的PC值作為標(biāo)簽查詢到與所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)的標(biāo)簽域的值相匹配的項(xiàng),則將該項(xiàng)的標(biāo)識(shí)域的值設(shè)為預(yù)測標(biāo)識(shí)值;所述處理器在所述引導(dǎo)指令的發(fā)射階段,若根據(jù)該引導(dǎo)指令查詢所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)對(duì)應(yīng)的標(biāo)識(shí)域的值為所述預(yù)測標(biāo)識(shí)值,則在將根據(jù)該引導(dǎo)指令從所述寄存器堆讀取的所述關(guān)聯(lián)數(shù)據(jù)值寫入所述關(guān)聯(lián)數(shù)據(jù)值緩沖區(qū)對(duì)應(yīng)的關(guān)聯(lián)值域的同時(shí),對(duì)所述難預(yù)測指令的目標(biāo)地址進(jìn)行第二次預(yù)測,若比較兩次預(yù)測的結(jié)果相同,則忽略該第二次預(yù)測的結(jié)果;否則取消第一次預(yù)測之后的所有推測式執(zhí)行的結(jié)果,并重新開始指令的取指和執(zhí)行。
全文摘要
本發(fā)明披露了一種實(shí)現(xiàn)值關(guān)聯(lián)間接跳轉(zhuǎn)預(yù)測的方法,涉及編譯器和處理器,該方法包括編譯器對(duì)處理器執(zhí)行可執(zhí)行程序的過程進(jìn)行剖視,并獲取剖視信息;編譯器根據(jù)該剖視信息通過再次編譯過程識(shí)別源程序中間接跳轉(zhuǎn)指令對(duì)應(yīng)的子程序結(jié)構(gòu)及其關(guān)聯(lián)數(shù)據(jù)值,并在源程序中插入用以標(biāo)識(shí)關(guān)聯(lián)數(shù)據(jù)值的引導(dǎo)指令,再次生成可執(zhí)行程序。處理器在執(zhí)行編譯器再次生成的可執(zhí)行程序過程中,根據(jù)引導(dǎo)指令動(dòng)態(tài)收集所述關(guān)聯(lián)數(shù)據(jù)值,并對(duì)難預(yù)測指令進(jìn)行預(yù)測。本發(fā)明有效地提高了間接跳轉(zhuǎn)指令的預(yù)測準(zhǔn)確率,提高了處理器及其應(yīng)用整體的系統(tǒng)性能。
文檔編號(hào)G06F9/38GK102156634SQ201110099440
公開日2011年8月17日 申請(qǐng)日期2011年4月20日 優(yōu)先權(quán)日2011年4月20日
發(fā)明者佟冬, 劉先華, 張吉豫, 程旭, 譚明星 申請(qǐng)人:北京北大眾志微系統(tǒng)科技有限責(zé)任公司