本公開的技術(shù)涉及用于在微處理器(“處理器”)中執(zhí)行的指令的處理,并且具體地涉及處理器中的分支指令的分支預(yù)測。
背景技術(shù):
1、微處理器,本文中也被稱為“處理器”,針對各種各樣的應(yīng)用執(zhí)行計算任務(wù)。常規(guī)的處理器包括中央處理單元(cpu),其包括一個或多個處理器核或者“cpu核”。cpu執(zhí)行計算機(jī)程序指令(“指令”或者“軟件指令”)以執(zhí)行基于數(shù)據(jù)的操作并且生成結(jié)果。然后,作為非限制性示例,結(jié)果可以被存儲在存儲器中、作為對輸入/輸出(“i/o”)設(shè)備的輸出被提供,或者使該結(jié)果作為對由cpu執(zhí)行的另一指令的輸入值可用(即,通信的)。
2、處理器可以采用被稱為指令管線化的處理技術(shù),從而可以通過將每個指令的處理劃分為一系列步驟來增加正在被執(zhí)行的計算機(jī)指令的吞吐量,該步驟然后在由多個階段組成的執(zhí)行管線內(nèi)被執(zhí)行。如果執(zhí)行管線中的所有階段能夠同時地并且按照指令在執(zhí)行管線中所排序的順序地處理指令,則可以實現(xiàn)最優(yōu)處理器性能。然而,可能出現(xiàn)被稱為結(jié)構(gòu)冒險的情況,從而不能在沒有導(dǎo)致不正確的計算結(jié)果的情況下執(zhí)行下一指令。例如,控制冒險可以作為分支指令的執(zhí)行的結(jié)果而發(fā)生,該分支指令可以基于在執(zhí)行該分支指令時所評估的結(jié)果來重定向指令執(zhí)行的路徑。在遇到分支指令時,處理器可能需要暫停提取附加指令,直到分支指令已經(jīng)被執(zhí)行,這可能導(dǎo)致處理器性能降低和功率消耗增加。
3、一種用于使處理器性能最大化的方法涉及利用分支預(yù)測器電路來推測性地預(yù)測將由分支指令采取的路徑(基于,例如,先前執(zhí)行的分支指令的結(jié)果),并且使后續(xù)指令的提取基于分支預(yù)測。在分支指令到達(dá)指令管線的執(zhí)行階段并且被執(zhí)行時,通過將分支指令的結(jié)果目標(biāo)地址與在分支指令被提取時先前預(yù)測的目標(biāo)地址進(jìn)行比較,來驗證該分支指令的結(jié)果目標(biāo)地址。如果預(yù)測目標(biāo)地址與實際目標(biāo)地址相匹配(即,分支預(yù)測是正確的),則可以無延遲地進(jìn)行指令執(zhí)行,因為目標(biāo)地址處的后續(xù)指令已經(jīng)被提取并且將在指令管線中被呈現(xiàn)。為了使分支預(yù)測與先前觀察到的程序行為相互關(guān)聯(lián),分支預(yù)測器電路可以使用大小有限的歷史寄存器來跟蹤與例如全局分支歷史、路徑歷史等有關(guān)的數(shù)據(jù)。
4、許多常規(guī)處理器可以通過提供循環(huán)的特殊處理來實現(xiàn)進(jìn)一步的管線優(yōu)化和功率節(jié)省。如本文所使用的,“循環(huán)”指代指令管線中的指令的任何序列,其處理在背對背操作中被順序地重復(fù)。例如,循環(huán)可以從被編譯為指令組的軟件循環(huán)構(gòu)造中得到,該指令組被重復(fù)地和順序地處理。圖1示出了包括指令的指令流100的示例,該指令包括示例性循環(huán)102。圖1的示例中的循環(huán)102是以while指令104開始的“while”循環(huán),該while指令104在被處理時確定指定的條件評估是真還是假。如果確定while指令104的條件評估為真,則執(zhí)行循環(huán)102中的指令106至指令112,并且只要while指令104的條件評估為真,則執(zhí)行循環(huán)102中的指令106至指令112將繼續(xù)作為循環(huán)被執(zhí)行。如果確定while指令104的條件評估為假,則while指令104被認(rèn)為是退出分支指令,并且循環(huán)102退出到在退出目標(biāo)地址處的下一指令114。
5、如果可以在指令管線內(nèi)檢測到循環(huán)(諸如圖1中的循環(huán)102),則構(gòu)成該循環(huán)的指令可以在退出之前針對該循環(huán)被處理的迭代數(shù)目而被捕獲和重放,而指令管線不必須重新提取和重新解碼該指令。這是因為在第一迭代之后的循環(huán)的每個后續(xù)迭代必然涉及將針對循環(huán)的第一迭代已經(jīng)被提取和解碼的指令的相同序列。在這方面,許多常規(guī)處理器提供循環(huán)緩沖器電路以檢測、捕獲,以及重放循環(huán)指令??梢酝ㄟ^在從循環(huán)緩沖器重放循環(huán)指令時去激活或者以其他方式暫停指令管線的提取階段和解碼階段來實現(xiàn)功率節(jié)省。
6、然而,循環(huán)緩沖器電路的使用可能引起相對于對由分支預(yù)測器電路使用的分支預(yù)測器(即,歷史寄存器和/或分支預(yù)測器表格條目)的更新的問題。特別地,可能出現(xiàn)關(guān)于是否應(yīng)當(dāng)針對從循環(huán)緩沖器電路重放的循環(huán)內(nèi)的分支指令來更新分支預(yù)測器的問題。例如,就歷史寄存器而言,常規(guī)方案可以利用針對所遇到的每個分支指令的新數(shù)據(jù)來更新歷史寄存器,這使得被記錄在歷史寄存器中的較舊數(shù)據(jù)被移位。如果歷史寄存器包含64位并且所遇到的每個分支指令將一個(1)位插入到歷史寄存器中,則每迭代具有兩個(2)分支的循環(huán)將在每個循環(huán)迭代期間更新歷史寄存器兩次。在32個循環(huán)迭代之后,來自循環(huán)之前的指令的被存儲在歷史寄存器中的所有數(shù)據(jù)將由循環(huán)期間所執(zhí)行的更新移位,并且因此分支預(yù)測器將不能與循環(huán)之前的任何歷史相互關(guān)聯(lián)。此外,因為每循環(huán)迭代的每次更新將是相同的(除了可能針對最后一次迭代),所以無法區(qū)分超過32個迭代的不同循環(huán)(即,分支預(yù)測器將不能區(qū)分兩個循環(huán),其中一個循環(huán)迭代40次而另一循環(huán)迭代100次)。就分支預(yù)測器表格條目而言,針對在循環(huán)期間所遇到的每個分支指令重復(fù)地更新分支預(yù)測器表格條目可能導(dǎo)致過度功率消耗而沒有對應(yīng)的益處。
技術(shù)實現(xiàn)思路
1、本文中所公開的方面包括選擇性地更新針對從處理器中的循環(huán)緩沖器執(zhí)行的循環(huán)的分支預(yù)測器。處理器提供分支預(yù)測器更新電路,該分支預(yù)測器更新電路被配置為檢測包括多個循環(huán)指令的循環(huán),并且被配置為針對多個循環(huán)指令確定對歷史寄存器的潛在歷史寄存器更新的計數(shù),該多個循環(huán)指令被存儲在處理器的循環(huán)緩沖器電路內(nèi)。在一些方面中,可以將潛在歷史寄存器更新的計數(shù)確定為循環(huán)迭代的預(yù)測計數(shù)、多個循環(huán)指令內(nèi)的一個或多個分支指令的計數(shù)、以及針對一個或多個分支指令中的每個分支指令而被更新的歷史寄存器的位的計數(shù)的乘積。如果潛在歷史寄存器更新的計數(shù)沒有超過歷史寄存器的大小,則分支預(yù)測器更新電路被配置為基于多個循環(huán)指令更新分支預(yù)測器(即,歷史寄存器和/或處理器的分支預(yù)測器電路的分支預(yù)測器表格的分支預(yù)測器表格條目)。在將更新的分支預(yù)測器是歷史寄存器的方面中,分支預(yù)測器更新電路可以通過在從循環(huán)緩沖器電路發(fā)起循環(huán)的執(zhí)行之前執(zhí)行對歷史寄存器的所有更新來“快進(jìn)”對歷史寄存器的更新。如果分支預(yù)測器更新電路確定潛在歷史寄存器更新的計數(shù)超過歷史寄存器的大小,則在一些方面中,分支預(yù)測器更新電路可以從循環(huán)緩沖器電路發(fā)起循環(huán)的執(zhí)行而不更新針對循環(huán)的分支預(yù)測器。
2、在分支預(yù)測器電路提供與具有不同大小的對應(yīng)歷史寄存器相關(guān)聯(lián)的多個分支預(yù)測器表格的方面中,可能希望僅更新針對與較大歷史寄存器相關(guān)聯(lián)的分支預(yù)測器表格的分支預(yù)測器,而使針對與較小歷史寄存器相關(guān)聯(lián)的分支預(yù)測器表格的分支預(yù)測器保持不變。在這方面,這種方面可以規(guī)定分支預(yù)測器電路還被配置為確定歷史寄存器的大小是否超過歷史寄存器大小閾值,并且僅在歷史寄存器的大小超過歷史寄存器大小閾值的情況下更新分支預(yù)測器。
3、一些方面可以規(guī)定分支預(yù)測器更新電路僅針對在循環(huán)迭代期間(例如,在長運(yùn)行循環(huán)的情況下)執(zhí)行的潛在歷史寄存器更新的子集來執(zhí)行對分支預(yù)測器的更新。在這種方面中,分支預(yù)測器更新電路可以被配置為確定潛在歷史寄存器更新的計數(shù)是否超過更新計數(shù)閾值。如果是,則分支預(yù)測器更新電路被配置為僅針對潛在歷史寄存器更新的子集來更新分支預(yù)測器電路的分支預(yù)測器。在一些這種方面中,潛在歷史寄存器更新的子集可以由等式x+log10n-log10x確定,其中x是表示更新計數(shù)閾值的非零整數(shù),以及n是表示潛在歷史寄存器更新的計數(shù)的非零整數(shù)。因此,例如,如果將被更新的分支預(yù)測器是100位歷史寄存器,則更新計數(shù)閾值是80,每個循環(huán)迭代將1位更新到歷史寄存器中,以及潛在歷史寄存器更新的計數(shù)在100與999之間,則分支預(yù)測器將被更新81次。
4、在這方面,在一個示例性方面中,公開了用于針對從循環(huán)緩沖器執(zhí)行的循環(huán)選擇性地更新分支預(yù)測器的處理器。處理器包括:指令處理電路,其被配置為處理包括指令管線中的多個指令的指令流;分支預(yù)測器電路,其包括歷史寄存器;以及分支預(yù)測器更新電路。分支預(yù)測器更新電路被配置為檢測包括指令流中的多個指令之中的多個循環(huán)指令的循環(huán)。分支預(yù)測器更新電路還被配置為確定循環(huán)被存儲在處理器的循環(huán)緩沖器電路內(nèi)。分支預(yù)測器更新電路也被配置為針對多個循環(huán)指令確定對歷史寄存器的潛在歷史寄存器更新的計數(shù)。分支預(yù)測器更新電路附加地被配置為確定潛在歷史寄存器更新的計數(shù)是否超過歷史寄存器的大小。分支預(yù)測器更新電路還被配置為響應(yīng)于確定潛在歷史寄存器更新的計數(shù)沒有超過歷史寄存器的大小,基于多個循環(huán)指令更新分支預(yù)測器電路的分支預(yù)測器。
5、在另一示例性方面中,公開了用于針對從循環(huán)緩沖器執(zhí)行的循環(huán)選擇性地更新分支預(yù)測器的方法。方法包括檢測包括指令流中的多個指令之中的多個循環(huán)指令的循環(huán)。方法還包括確定循環(huán)被存儲在循環(huán)緩沖器電路內(nèi)。方法也包括針對多個循環(huán)指令確定對歷史寄存器的潛在歷史寄存器更新的計數(shù)。方法附加地包括確定潛在歷史寄存器更新的計數(shù)是否超過歷史寄存器的大小。方法還包括響應(yīng)于確定潛在歷史寄存器更新的計數(shù)沒有超過歷史寄存器的大小,基于多個循環(huán)指令更新分支預(yù)測器電路的分支預(yù)測器。
6、在另一示例性方面中,公開了非瞬態(tài)計算機(jī)可讀介質(zhì)。非瞬態(tài)計算機(jī)可讀介質(zhì)存儲計算機(jī)可執(zhí)行指令,該計算機(jī)可執(zhí)行指令在被執(zhí)行時,使處理器通過引起處理器檢測包括指令流中的多個指令之中的多個循環(huán)指令的循環(huán)來針對從循環(huán)緩沖器執(zhí)行的循環(huán)選擇性地更新分支預(yù)測器。計算機(jī)可執(zhí)行指令還使處理器確定循環(huán)被存儲在處理器的循環(huán)緩沖器電路內(nèi)。計算機(jī)可執(zhí)行指令也使處理器針對多個循環(huán)指令確定對歷史寄存器的潛在歷史寄存器更新的計數(shù)。計算機(jī)可執(zhí)行指令附加地使處理器確定潛在歷史寄存器更新的計數(shù)是否超過歷史寄存器的大小。計算機(jī)可執(zhí)行指令還使處理器響應(yīng)于確定潛在歷史寄存器更新的計數(shù)沒有超過歷史寄存器的大小,基于多個循環(huán)指令更新分支預(yù)測器電路的分支預(yù)測器。
7、在與附圖相關(guān)聯(lián)地閱讀以下優(yōu)選實施例的具體實施方式之后,本領(lǐng)域中的那些技術(shù)人員將理解本公開的范圍并且實現(xiàn)其附加方面。