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