一種分支預測方法及相關裝置制造方法
【專利摘要】本發明實施例公開了一種分支預測方法及相關裝置,應用于處理器中,上述處理器包括:存儲寄存器標識與預測目標跳轉地址的一一對應關系信息的第一BTAC,和存儲程序計數器的字段與預測目標跳轉地址的一一對應關系信息的第二BTAC,其中,一種分支預測方法包括:從指令緩存中讀取指令;若確定該指令滿足寄存器預測條件,則:根據該指令的寄存器標識,從第一BTAC中獲取該指令的預測目標跳轉地址;若確定該指令不滿足寄存器預測條件,則根據該指令的程序計數器,從第二BTAC中獲取該指令的預測目標跳轉地址,本發明提供的技術方案能夠有效解決在共享BTAC時影響分支預測的準確率的問題。
【專利說明】一種分支預測方法及相關裝置
【技術領域】
[0001]本發明涉及計算機系統領域,尤其涉及一種分支預測方法及相關裝置。
【背景技術】
[0002]目前的處理器多采用流水線的結構,使得順序執行的指令流可以并行地執行。這種處理指令的方式在很大程度上提高了處理器的執行效率。在理想情況下,流水線的每個Stage (即流水線層)僅占用一個時鐘周期,所以每個時鐘周期都可以完成一條指令。但是實際情況并非如此理想,因為指令之間可能存在著相互的依賴關系從而影響指令執行的并行度。比如數據依賴、控制依賴(比如分支指令)、資源競爭、中斷等等因素,都會影響指令的并行度。
[0003]實際程序中包括分支指令,分支指令的分支行為往往到等到流水線的后端才能確定,因此,分支指令可能產生控制冒險從而導致流水線停頓,同時,處理器也不能確定從哪個地址開始取下一條指令直到這條分支指令執行完為止。大部分的處理器都采用了不同形式的分支預測機制,讓條件分支指令的目標跳轉方向和目標跳轉地址可以在流水線的前端被預測,使得處理器可以預測性地取指令并執行指令。如果分支預測正確或者正確率較高的話,可以大幅提高處理器的性能和功耗,如果分支預測錯誤的話,意味著預測取出的指令不能被執行,錯誤的指令需要從緩沖區中清除,然后從正確的地址處再重新取指令并執行。
[0004]分支目標地址緩存(BTAC, Branch Target Address Cache)用于對間接跳轉分支指令的目標跳轉地址進行預測。BTAC采用緩存的結構,以指令的程序計數器(PC,ProgramCounter)的一部分作為index (即索引),一部分作為tag (即標簽),如以PC的低8位作為index,以PC的高8位作為tag。BTAC的每個Entry (即表項)對應于一個index和一個tag,并且,BTAC的每個Entry都設置一個有效位,用于記錄這個Entry是否存放了有效的歷史信息(歷史信息即為預測的目標跳轉地址),其中,Entry存放的目標跳轉地址是虛擬地址(VA, Virtual Address)。如果BTAC滿了,像Cache—樣,也需要根據一定的替換算法決定哪個最近最少使用的Entry中存放的內容可以被替換掉。
[0005]在多線程處理器中,對BTAC的設置有兩種方式:
[0006]一種是共享的BTAC,多個線程共享同一塊BTAC,每個線程各自用自己的PC去索引BTAC當中存放的內容。這種方式雖然節約了面積,但是由于BTAC的索引地址是每個線程的PC,而不同線程的PC有可能一樣,因此,不同線程之間的歷史信息存放在同一塊BTAC中,將影響分支預測的準確率;
[0007]另一種是獨享的BTAC,每個線程各自設置一塊BTAC,BTAC為相應的線程提供預測分支目標跳轉地址的服務。這種方式雖然相比共享的方法在一定程度上提高了預測準確率,但是極大浪費了硬件資源和面積。
[0008]無論是共享的BTAC還是獨享的BTAC,它們有一個共同的特點:只要BTAC不滿,就以分支指令的PC作為索引記錄所有和分支指令相關的歷史信息。但是在實際的程序中,存在如下情況的幾率很大:多個不同的分支指令跳轉到同樣的目標地址,比如類似C++中“Printf”這種標準的庫函數,由經過編譯之后得到的匯編指令可以看出,不同的分支指令總是跳轉到相同的目標地址。那么使用傳統的BTAC結構,這些不同的分支指令雖然跳轉到同一個目標地址,但是仍將占用BTAC當中的多個Entry來記錄其相關歷史信息。
[0009]由上可見,在多線程處理器當中,BTAC的資源共享、分支預測的準確率之間的矛盾極為關出。
【發明內容】
[0010]本發明各個方面提供了一種分支預測方法及相關裝置,用于解決在共享BTAC時影響分支預測的準確率的問題。
[0011]為解決上述技術問題,提供以下技術方案:
[0012]本發明第一方面提供了一種分支預測方法,應用于處理器中,上述處理器包括:第一分支目標地址預測緩存器和第二分支目標地址預測緩存器,上述第一分支目標地址預測緩存器存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,上述第二分支目標地址預測緩存器存儲著:程序計數器的字段與預測目標跳轉地址的一一對應關系信息,其中,上述分支預測方法,包括:從指令緩存中讀取指令;
[0013]若確定讀取的上述指令滿足寄存器預測條件,則:
[0014]根據讀取的上述指令的寄存器標識,從上述第一分支目標地址預測緩存器中獲取讀取的上述指令的預測目標跳轉地址;
[0015]若確定讀取的上述指令不滿足上述寄存器預測條件,則:
[0016]則根據讀取的上述指令的程序計數器,從上述第二分支目標地址預測緩存器中獲取讀取的上述指令的預測目標跳轉地址;
[0017]其中,上述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
[0018]基于第一方面,在第一種可能的實現方式中,上述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識;
[0019]上述確定讀取的上述指令滿足寄存器預測條件,具體為:
[0020]當上述指令的類型為無條件間接跳轉分支指令,且上述指令中的寄存器標識為特定的寄存器標識時,確定讀取的上述指令滿足寄存器預測條件;
[0021]上述確定讀取的上述指令不滿足上述寄存器預測條件,具體為:
[0022]當上述指令的類型不為無條件間接跳轉分支指令,或者,上述指令中的寄存器標識不為特定的寄存器標識時,確定讀取的上述指令不滿足寄存器預測條件。
[0023]基于第一方面,或者第一方面的第一種可能的實現方式,在第二種可能的實現方式中,上述從上述指令緩存中讀取指令之前包括:
[0024]對待讀取的指令進行預譯碼,得到上述待讀取的指令的類型信息;
[0025]上述讀取指令之后包括:根據上述得到的指令的類型信息,判定當前讀取的指令的類型是否為無條件間接跳轉分支指令。
[0026]基于第一方面,或者第一方面的第一種可能的實現方式,或者第一方面的第二種可能的實現方式,在第三種可能的實現方式中,在上述讀取指令之前,若對高級語言進行編譯時調用的函數為標準庫函數,則,將編譯后的指令的類型指定為無條件間接跳轉分支指令。
[0027]本發明第二方面提供了一種分支預測裝置,應用于處理器中,上述處理器包括:第一分支目標地址預測緩存器和第二分支目標地址預測緩存器,上述第一分支目標地址預測緩存器存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,上述第二分支目標地址預測緩存器存儲著:程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息,或者,程序計數器的全部字段與預測目標跳轉地址的一一對應關系信息,其中,上述分支預測裝置,包括:
[0028]讀取單元,用于從指令緩存中讀取指令;
[0029]預測獲取單元,用于當確定上述讀取單元讀取的指令滿足寄存器預測條件時,根據上述讀取單元讀取的上述指令的寄存器標識,從上述第一分支目標地址預測緩存器中獲取上述讀取單元讀取的上述指令的預測目標跳轉地址;當確定上述讀取單元讀取的指令不滿足上述寄存器預測條件時,根據上述讀取單元讀取的上述指令的程序計數器,從上述第二分支目標地址預測緩存器中獲取上述讀取單元讀取的上述指令的預測目標跳轉地址;
[0030]其中,上述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
[0031]基于本發明第二方面,在第一種可能的實現方式中,上述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識;
[0032]上述分支預測裝置還包括:
[0033]確定單元,用于當上述讀取單元讀取的指令的類型為無條件間接跳轉分支指令,且上述讀取單元讀取的指令中的寄存器標識為特定的寄存器標識時,確定上述讀取單元讀取的指令滿足寄存器預測條件;當上述讀取單元讀取的指令的類型不為無條件間接跳轉分支指令,或者,上述讀取單元讀取的指令中的寄存器標識不為特定的寄存器標識時,確定讀取的上述指令不滿足寄存器預測條件。
[0034]基于本發明第二方面,或者本發明第二方面的第一種可能的實現方式,在第二種可能的實現方式中,上述分支預測裝置還包括:
[0035]預譯碼單元,用于對上述讀取單元待讀取的指令進行預譯碼,得到上述讀取單元待讀取的指令的類型信息;
[0036]判定單元,用于在上述讀取單元讀取上述指令后,根據上述預譯碼單元得到的指令的類型信息,判定上述讀取單元當前讀取的指令的類型是否為無條件間接跳轉分支指令。
[0037]基于本發明第二方面,或者本發明第二方面的第一種可能的實現方式,在第三種可能的實現方式中,上述分支預測裝置還包括:
[0038]編譯單元,用于對高級語言進行編譯;
[0039]指定單元,用于當上述編譯單元對高級語言進行編譯時調用的函數為標準庫函數時,將編譯后的指令的類型指定為無條件間接跳轉分支指令。
[0040]由上可見,本發明實施例中設置第一 BTAC和第二 BTAC,第一 BTAC中使用寄存器標識作為索引(即在第一 BTAC中存儲寄存器標識與預測目標跳轉地址的一一對應關系信息),第二 BTAC中使用PC作為索引(即在第二 BTAC中存儲程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息),當讀取的指令滿足寄存器預測條件時,使用第一BTAC進行分支預測,否則,使用第二 BTAC進行分支預測。由于寄存器標識相同的無條件間接跳轉分支指令的目標跳轉地址必然相同,因此,即使將目標跳轉地址相同的多個無條件間接跳轉分支指令的歷史信息存儲在第一 BTAC的同一個Entry中,也不會影響分支預測的準確率,換言之,本發明提供的技術方案能夠在共享第一 BTAC時不對分支預測的準確率產生影響,從而使得在保證分支預測的準確率的前提下實現BTAC的資源共享成為可能。
【專利附圖】
【附圖說明】
[0041]為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動性的前提下,還可以根據這些附圖獲得其他的附圖。
[0042]圖1為本發明提供的一種分支預測方法一個實施例流程示意圖;
[0043]圖2為本發明提供的一種分支預測方法另一個實施例流程示意圖;
[0044]圖3為本發明提供的一種分支預測方法再一個實施例流程示意圖;
[0045]圖4為本發明提供的一種分支預測裝置一個實施例結構示意圖;
[0046]圖5為本發明提供的一種分支預測裝置另一個實施例結構示意圖。
【具體實施方式】
[0047]本發明實施例提供了一種分支預測方法及相關裝置。
[0048]為使得本發明的發明目的、特征、優點能夠更加的明顯和易懂,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而非全部實施例?;诒景l明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的各個其他實施例,都屬于本發明保護的范圍。
[0049]下面對本發明實施例提供的一種分支預測方法進行描述,本發明實施例中的分支預測方法應用于處理器中,上述處理器包括:第一 BTAC和第二 BTAC,上述第一 BTAC存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,上述第二 BTAC存儲著:PC的字段與預測目標跳轉地址的一一對應關系信息,可選地,在上述第二 BTAC中存儲PC的部分字段與預測目標跳轉地址的一一對應關系信息,或者,在上述第二 BTAC中存儲PC的全部字段與預測目標跳轉地址的一一對應關系信息。請參閱圖1,本發明實施例中的分支預測方法,包括:
[0050]101、從指令緩存中讀取指令;
[0051]在本發明實施例中,步驟101讀取的指令有可能為分支指令,也有可能為非分支指令。通常,分支指令可以有如下兩種劃分方式:一種是針對跳轉條件,將分支指令的類型劃分為條件分支指令和無條件分支指令,其中,條件分支指令在滿足一定條件時才執行分支跳轉,無條件分支指令則不需要滿足任何條件,總是執行分支跳轉;另一種是針對目標跳轉地址,將分支指令的類型劃分為直接跳轉分支指令和間接跳轉分支指令,其中,直接跳轉分支指示的目標跳轉地址的偏移量直接在指令當中用立即數(即,在立即尋址方式指令中給出的數)指定,目標跳轉地址就是用分支指令本身的PC加上立即數的偏移量計算得到,而間接跳轉分支指令的目標跳轉地址是在寄存器當中指定的。
[0052]一條指令在從二級緩存或者內存取到指令緩存之前,需要對指令進行預譯碼,以便將指令的部分預譯碼結果作為分支預測的指導。比如,當分支指令在從二級緩存或者內存取到指令緩存之前,需要通過預譯碼階段識別出該分支指令的類型(如是否為條件分支指令、是否為間接跳轉分支指令等),以便根據分支指令的類型執行相應地分支預測。在預譯碼之后,預譯碼結果(如指令的類型信息)和指令會被一同保存在指令緩存中。需要說明的是,上述對指令的預譯碼操作可以由分支預測裝置執行,或者,也可以由其它裝置執行,此處不作限定。
[0053]其中,上述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
[0054]102、當讀取的指令滿足寄存器預測條件時,根據上述讀取的指令中的寄存器標識,從第一 BTAC中獲取上述讀取的指令的預測目標跳轉地址。
[0055]103、當讀取的指令不滿足寄存器預測條件時,根據上述讀取的指令中的程序計數器,從第二 BTAC中獲取上述讀取的指令的預測目標跳轉地址。
[0056]本發明實施例在處理器中設置第一 BTAC,為便于描述,下面將第一 BTAC描述為SBTAC,將第二 BTAC簡稱為BTAC。SBTAC的硬件構造與BTAC相類似,不同的是,BTAC是以PC的一部分字段或者全部字段作為索引,而SBTAC是以寄存器標識作為索引。由于SBTAC中存儲著寄存器標識與預測目標跳轉地址的一一對應關系信息,因此,分支預測裝置能夠根據上述指令中的寄存器標識,從SBTAC中找到與該寄存器標識相對應的預測目標跳轉地址。
[0057]在一種應用場景中,在步驟101之前,若對高級語言進行編譯時調用的函數為標準庫函數,則,分支預測裝置將編譯后的指令的類型指定為無條件間接跳轉分支指令,如將編譯后的指令的類型指定為分支與鏈接寄存器(BLR, Branch and Link Register)指令,BLR指令為一條無條件間接跳轉分支指令,它為一個子程序調用或者函數調用引起且一定會返回,返回的地址存放在Link Register (即鏈接寄存器)中。需要說明的是,本發明實施例中的高級語言主要是相對于匯編語言而言,它是較接近自然語言和數學公式的編程,基本脫離了機器的硬件系統,用人們更易理解的方式編寫程序。本發明實施例中的高級語言并不特指某一種具體的語言,可以包括很多編程語言,如java, c, c++, C#,pascal, python,lisp, prolog, FoxPro, VC,易語言等等,本發明實施例中的標準庫函數是指由一些按照高級語言標準預先編寫的基本函數組成的庫。
[0058]需要說明的是,本發明實施例中的寄存器標識可以為寄存器號,或者,寄存器標識也可以是其它能夠用于指示寄存器的代碼或者符號等,本發明實施例中的分支預測方法可以應用于多線程處理器中,也可以應用于單線程處理器中,此處不作限定。
[0059]由上可見,本發明實施例中設置第一 BTAC和第二 BTAC,第一 BTAC中使用寄存器標識作為索引(即在第一 BTAC中存儲寄存器標識與預測目標跳轉地址的一一對應關系信息),第二 BTAC中使用PC作為索引(即在第二 BTAC中存儲程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息),當讀取的指令滿足寄存器預測條件時,使用第一BTAC進行分支預測,否則,使用第二 BTAC進行分支預測。由于寄存器標識相同的無條件間接跳轉分支指令的目標跳轉地址必然相同,因此,目標跳轉地址相同的多個無條件間接跳轉分支指令的歷史信息能夠存儲在第一 BTAC的同一個Entry而不影響分支預測的準確率,從而能夠在保證分支預測的準確率的前提下實現BTAC的資源共享。
[0060]上述實施例中使用全部寄存器的寄存器標識作為SBTAC中的預測目標跳轉地址的索引,本發明實施例也可以只使用部分寄存器的寄存器標識作為SBTAC中的預測目標跳轉地址的索引,則上述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識,在當讀取的指令的類型為無條件間接跳轉分支指令,且讀取指令中的寄存器標識為特定的寄存器標識時,確定讀取的指令滿足寄存器預測條件,當讀取的指令的類型不為無條件間接跳轉分支指令,或者,讀取的指令中的寄存器標識不為特定的寄存器標識時,確定讀取的指令不滿足寄存器預測條件。如圖2所示,本發明實施例中的分支預測方法,包括:
[0061]201、從指令緩存中讀取指令;
[0062]一條指令在從二級緩存或者內存取到指令緩存之前,需要對指令進行預譯碼,以便將指令的部分預譯碼結果作為分支預測的指導。比如,當分支指令在從二級緩存或者內存取到指令緩存之前,需要通過預譯碼階段識別出該分支指令的類型(如是否為條件分支指令、是否為間接跳轉分支指令等),以便根據分支指令的類型執行相應地分支預測。在預譯碼之后,預譯碼結果和指令會被一同保存在指令緩存中。需要說明的是,上述對指令的預譯碼操作可以由分支預測裝置執行,或者,也可以由其它裝置執行,此處不作限定。
[0063]202、當讀取的指令的類型為無條件間接跳轉分支指令時,判斷上述讀取的指令中的寄存器標識是否為特定的寄存器標識;
[0064]若分支預測裝置判斷出上述讀取的指令中的寄存器標識為特定的寄存器標識,則執行步驟203,若分支預測裝置判斷出上述讀取的指令中的寄存器標識不為特定的寄存器標識,則執行步驟204。
[0065]203、根據上述讀取的指令中的寄存器標識,從第一 BTAC中獲取上述讀取的指令的預測目標跳轉地址;
[0066]其中,上述第一 BTAC中存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息。
[0067]204、當讀取的指令的類型不為無條件間接跳轉分支指令時,根據上述讀取的指令中的程序計數器,從第二 BTAC中獲取上述讀取的指令的預測目標跳轉地址。
[0068]在一種應用場景中,在步驟201之前,若對高級語言進行編譯時調用的函數為標準庫函數,則,分支預測裝置將編譯后的指令的類型指定為無條件間接跳轉分支指令,如將編譯后的指令的類型指定為BLR指令。BLR指令為一條無條件間接跳轉分支指令,它為一個子程序調用或者函數調用引起且一定會返回,返回的地址存放在Link Register (即鏈接寄存器)中。需要說明的是,本發明實施例中的高級語言主要是相對于匯編語言而言,它是較接近自然語言和數學公式的編程,基本脫離了機器的硬件系統,用人們更易理解的方式編寫程序。本發明實施例中的高級語言并不特指某一種具體的語言,可以包括很多編程語言,如 java, c, c++, C#, pascal, python, lisp, prolog, FoxPro, VC,易語言等等,本發明實施例中的標準庫函數是指由一些按照高級語言標準預先編寫的基本函數組成的庫。
[0069]需要說明的是,本發明實施例中的寄存器標識可以為寄存器號,或者,寄存器標識也可以是其它能夠用于指示寄存器的代碼或者符號等,本發明實施例中的分支預測方法可以應用于多線程處理器中,也可以應用于單線程處理器中,此處不作限定。
[0070]由上可見,本發明實施例中設置第一 BTAC和第二 BTAC,第一 BTAC中使用寄存器標識作為索引(即在第一 BTAC中存儲寄存器標識與預測目標跳轉地址的一一對應關系信息),第二 BTAC中使用PC作為索引(即在第二 BTAC中存儲程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息),當讀取的指令滿足寄存器預測條件時,使用第一BTAC進行分支預測,否則,使用第二 BTAC進行分支預測。由于寄存器標識相同的無條件間接跳轉分支指令的目標跳轉地址必然相同,因此,即使將目標跳轉地址相同的多個無條件間接跳轉分支指令的歷史信息存儲在第一 BTAC的同一個Entry中,也不會影響分支預測的準確率,換言之,本發明提供的技術方案能夠在共享第一 BTAC時不對分支預測的準確率產生影響,從而使得在保證分支預測的準確率的前提下實現BTAC的資源共享成為可能。
[0071]對于標準庫函數下的分支指令,分支指令的目標跳轉地址通常不會改變,因此,為了保證SBTAC的內容不會因為軟件進程的切換而出現更新或者無效的操作,本發明實施例中對標準庫函數下的分支指令使用SBTAC進行分支預測,如圖3所示,本發明實施例中的分支預測方法,包括:
[0072]301、對聞級語目進打編譯。
[0073]302、判斷是否調用標準庫函數;
[0074]在編譯過程中可以確定是否調用標準庫函數,若沒有調用標準庫函數,則執行步驟303,若調用了標準庫函數,則執行步驟304。
[0075]303、將編譯后的指令的類型指定為其它指令存儲在二級緩存或者內存中。
[0076]304、將編譯后的指令的類型指定為BLR指令存儲在二級緩存或者內存中。
[0077]步驟305?308與圖2所示實施例中的步驟201?204類似,其具體實現方式可以參照相應步驟中的描述,此處不再贅述。
[0078]需要說明的是,本發明實施例中的寄存器標識可以為寄存器號,或者,寄存器標識也可以是其它能夠用于指示寄存器的代碼或者符號等,本發明實施例中的分支預測方法可以應用于多線程處理器中,也可以應用于單線程處理器中,此處不作限定。
[0079]由上可見,本發明實施例中設置第一 BTAC和第二 BTAC,第一 BTAC中使用寄存器標識作為索引(即在第一 BTAC中存儲寄存器標識與預測目標跳轉地址的一一對應關系信息),第二 BTAC中使用PC作為索引(即在第二 BTAC中存儲程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息),當讀取的指令滿足寄存器預測條件時,使用第一BTAC進行分支預測,否則,使用第二 BTAC進行分支預測。由于寄存器標識相同的無條件間接跳轉分支指令的目標跳轉地址必然相同,因此,即使將目標跳轉地址相同的多個無條件間接跳轉分支指令的歷史信息存儲在第一 BTAC的同一個Entry中,也不會影響分支預測的準確率,換言之,本發明提供的技術方案能夠在共享第一 BTAC時不對分支預測的準確率產生影響,從而使得在保證分支預測的準確率的前提下實現BTAC的資源共享成為可能。
[0080]本發明實施例還提供了一種分支預測裝置,應用于處理器中,上述處理器包括:第一 BTAC和第二 BTAC,上述第一 BTAC存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,上述第二 BTAC存儲著:PC的字段與預測目標跳轉地址的一一對應關系信息,可選地,在上述第二 BTAC中存儲PC的部分字段與預測目標跳轉地址的一一對應關系信息,或者,在上述第二 BTAC中存儲PC的全部字段與預測目標跳轉地址的一一對應關系信息,如圖4所示,本發明實施例中的分支預測裝置400,包括:
[0081]讀取單元401,用于從指令緩存中讀取指令;
[0082]一條指令在從二級緩存或者內存取到指令緩存之前,需要對指令進行預譯碼,以便將指令的部分預譯碼結果作為分支預測的指導。比如,當分支指令在從二級緩存或者內存取到指令緩存之前,需要通過預譯碼階段識別出該分支指令的類型(如是否為條件分支指令、是否為間接跳轉分支指令等),以便根據分支指令的類型執行相應地分支預測。在預譯碼之后,預譯碼結果(如指令的類型信息)和指令會被一同保存在指令緩存中。在一種實現方式中,上述對指令的預譯碼操作可以由分支預測裝置執行,則本發明實施例中的分支預測裝置還可以包括:預譯碼單元,用于對讀取單元401待讀取的指令進行預譯碼,得到上述待讀取的指令的類型信息;判定單元,用于在讀取單元401讀取指令后,根據預譯碼單元得到的該指令的類型信息,判定該指令的類型是否為無條件間接跳轉分支指令。當然,上述對讀取單元401待讀取的指令的預譯碼操作也可以由其它裝置執行,此處不作限定。
[0083]預測獲取單元402,用于當確定讀取單元401讀取的指令滿足寄存器預測條件時,根據讀取單元401讀取的指令中的寄存器標識,從第一 BTAC中獲取讀取單元401讀取的指令的預測目標跳轉地址。當確定讀取單元401讀取的指令不滿足上述寄存器預測條件時,根據讀取單元401讀取的指令的PC,從第二 BTAC中獲取讀取單元401讀取的指令的預測目標跳轉地址;其中,上述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
[0084]可選地,上述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識。則分支預測裝置400還包括:確定單元,用于當讀取單元401讀取的指令的類型為無條件間接跳轉分支指令,且讀取單元401讀取的指令中的寄存器標識為特定的寄存器標識時,確定讀取單元401讀取的指令滿足寄存器預測條件;當讀取單元401讀取的指令的類型不為無條件間接跳轉分支指令,或者,讀取單元401讀取的指令中的寄存器標識不為特定的寄存器標識時,確定讀取的指令不滿足寄存器預測條件。
[0085]在一種應用場景中,在對高級語言進行編譯時,若對高級語言進行編譯時調用的函數為標準庫函數,則,分支預測裝置將編譯后的指令的類型指定為BLR。則在圖4所示的分支預測裝置的基礎上,分支預測裝置還可以包括:編譯單元,用于對高級語言進行編譯;指定單元,用于當上述編譯單元對高級語言進行編譯時調用的函數為標準庫函數時,將編譯后的指令的類型指定為無條件間接跳轉分支指令,如將編譯后的指令的類型指定為BLR指令。需要說明的是,本發明實施例中的高級語言主要是相對于匯編語言而言,它是較接近自然語言和數學公式的編程,基本脫離了機器的硬件系統,用人們更易理解的方式編寫程序。本發明實施例中的高級語言并不特指某一種具體的語言,可以包括很多編程語言,如java, c, c++, C#, pascal, python, lisp, prolog, FoxPro, VC,易語言等等,本發明實施例中的標準庫函數是指由一些按照高級語言標準預先編寫的基本函數組成的庫。
[0086]需要說明的是,本發明實施例中的寄存器標識可以為寄存器號,或者,寄存器標識也可以是其它能夠用于指示寄存器的代碼或者符號等,本發明實施例中的分支預測方法可以應用于多線程處理器中,也可以應用于單線程處理器中,此處不作限定。
[0087]需要說明的是,本發明實施例中的分支預測裝置可以如上述方法實施例中的分支預測裝置,可以用于實現上述方法實施例中的全部技術方案,其各個功能模塊的功能可以根據上述方法實施例中的方法具體實現,其具體實現過程可參照上述方法實施例中的相關描述,此處不再贅述。
[0088]由上可見,本發明實施例中設置第一 BTAC和第二 BTAC,第一 BTAC中使用寄存器標識作為索引(即在第一 BTAC中存儲寄存器標識與預測目標跳轉地址的一一對應關系信息),第二 BTAC中使用PC作為索引(即在第二 BTAC中存儲程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息),當讀取的指令滿足寄存器預測條件時,使用第一BTAC進行分支預測,否則,使用第二 BTAC進行分支預測。由于寄存器標識相同的無條件間接跳轉分支指令的目標跳轉地址必然相同,因此,即使將目標跳轉地址相同的多個無條件間接跳轉分支指令的歷史信息存儲在第一 BTAC的同一個Entry中,也不會影響分支預測的準確率,換言之,本發明提供的技術方案能夠在共享第一 BTAC時不對分支預測的準確率產生影響,從而使得在保證分支預測的準確率的前提下實現BTAC的資源共享成為可能。
[0089]本發明實施例還提供一種計算機存儲介質,其中,該計算機存儲介質存儲有程序,該程序執行包括上述方法實施例中記載的在一種分支預測方法和分支預測裝置的部分或全部布置。
[0090]本發明實施例提供另一個分支預測裝置,如圖5所示,本發明實施例中的分支預測裝置500,包括:
[0091]輸入裝置501、輸出裝置502、存儲器503以及處理器504(分支預測裝置的處理器的數量可以是一個或者多個,圖5以一個處理器為例)。在本發明的一些實施例中,輸入裝置501、輸出裝置502、存儲器503以及處理器504可以通過總線或其它方式連接,如圖5所示以通過總線連接為例。存儲器503中用來儲存從輸入裝置502輸入的數據,且還可以儲存處理器504處理數據的必要文件等信息;輸入裝置501和輸出裝置502可以包括分支預測裝置500與其他設備通信的端口,且還可以包括分支預測裝置500外接的輸出設備比如顯示器、鍵盤、鼠標和打印機等,具體地輸入裝置502可以包括鼠標和鍵盤等,而輸出裝置501包括顯示器等。
[0092]其中,處理器504包括:第一 BTAC和第二 BTAC,上述第一 BTAC存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,上述第二 BTAC存儲著:PC的字段與預測目標跳轉地址的一一對應關系信息,可選地,在上述第二BTAC中存儲PC的部分字段與預測目標跳轉地址的一一對應關系信息,或者,在上述第二 BTAC中存儲PC的全部字段與預測目標跳轉地址的一一對應關系信息。
[0093]處理器504執行如下步驟:
[0094]從指令緩存中讀取指令;
[0095]若確定讀取的上述指令滿足寄存器預測條件,則:
[0096]根據讀取的上述指令的寄存器標識,從上述第一分支目標地址預測緩存器中獲取讀取的上述指令的預測目標跳轉地址;
[0097]若確定讀取的上述指令不滿足上述寄存器預測條件,則:
[0098]則根據讀取的上述指令的程序計數器,從上述第二分支目標地址預測緩存器中獲取讀取的上述指令的預測目標跳轉地址;
[0099]其中,上述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
[0100]可選地,上述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識。
[0101]需要說明的是,本發明實施例中的寄存器標識可以為寄存器號,或者,寄存器標識也可以是其它能夠用于指示寄存器的代碼或者符號等,本發明實施例中的分支預測方法可以應用于多線程處理器中,也可以應用于單線程處理器中,此處不作限定。
[0102]需要說明的是,本發明實施例中的分支預測裝置可以如上述方法實施例中的分支預測裝置,可以用于實現上述方法實施例中的全部技術方案,其各個功能模塊的功能可以根據上述方法實施例中的方法具體實現,其具體實現過程可參照上述方法實施例中的相關描述,此處不再贅述。
[0103]由上可見,本發明實施例中設置第一 BTAC和第二 BTAC,第一 BTAC中使用寄存器標識作為索引(即在第一 BTAC中存儲寄存器標識與預測目標跳轉地址的一一對應關系信息),第二 BTAC中使用PC作為索引(即在第二 BTAC中存儲程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息),當讀取的指令滿足寄存器預測條件時,使用第一BTAC進行分支預測,否則,使用第二 BTAC進行分支預測。由于寄存器標識相同的無條件間接跳轉分支指令的目標跳轉地址必然相同,因此,即使將目標跳轉地址相同的多個無條件間接跳轉分支指令的歷史信息存儲在第一 BTAC的同一個Entry中,也不會影響分支預測的準確率,換言之,本發明提供的技術方案能夠在共享第一 BTAC時不對分支預測的準確率產生影響,從而使得在保證分支預測的準確率的前提下實現BTAC的資源共享成為可能。
[0104]需要說明的是,對于前述的各方法實施例,為了簡便描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本發明并不受所描述的動作順序的限制,因為依據本發明,某些步驟可以采用其它順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬于優選實施例,所涉及的動作和模塊并不一定都是本發明所必須的。
[0105]在上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其它實施例的相關描述。
[0106]本領域普通技術人員可以理解上述實施例中的各種方法中的全部或部分步驟是可以通過程序來指令相關的硬件來完成,該程序可以存儲于一計算機可讀存儲介質中,存儲介質例如可以包括:只讀存儲器、隨機存儲器、磁盤或光盤等。
[0107]以上對本發明所提供的一種分支預測方法及相關裝置進行了詳細介紹,對于本領域的一般技術人員,依據本發明實施例的思想,在【具體實施方式】及應用范圍上均會有改變之處,本說明書內容不應理解為對本發明的限制。
【權利要求】
1.一種分支預測方法,其特征在于,應用于處理器中,所述處理器包括:第一分支目標地址預測緩存器和第二分支目標地址預測緩存器,所述第一分支目標地址預測緩存器存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,所述第二分支目標地址預測緩存器存儲著:程序計數器的字段與預測目標跳轉地址的一一對應關系信息,其中,所述分支預測方法,包括: 從指令緩存中讀取指令; 若確定讀取的所述指令滿足寄存器預測條件,則: 根據讀取的所述指令的寄存器標識,從所述第一分支目標地址預測緩存器中獲取讀取的所述指令的預測目標跳轉地址; 若確定讀取的所述指令不滿足所述寄存器預測條件,則: 則根據讀取的所述指令的程序計數器,從所述第二分支目標地址預測緩存器中獲取讀取的所述指令的預測目標跳轉地址; 其中,所述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
2.根據權利要求1所述的方法,其特征在于, 所述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識; 所述確定讀取的所述指令滿足寄存器預測條件,具體為: 當所述指令的類型為無條件間接跳轉分支指令,且所述指令中的寄存器標識為特定的寄存器標識時,確定讀取的所述指令滿足寄存器預測條件; 所述確定讀取的所述指令不滿足所述寄存器預測條件,具體為: 當所述指令的類型不為無條件間接跳轉分支指令,或者,所述指令中的寄存器標識不為特定的寄存器標識時,確定讀取的所述指令不滿足寄存器預測條件。
3.根據權利要求1或2所述的方法,其特征在于, 所述從所述指令緩存中讀取指令之前包括: 對待讀取的指令進行預譯碼,得到所述待讀取的指令的類型信息; 所述讀取指令之后包括:根據所述得到的指令的類型信息,判定當前讀取的指令的類型是否為無條件間接跳轉分支指令。
4.根據權利要求1至3任一項所述的方法,其特征在于, 在所述讀取指令之前,若對高級語言進行編譯時調用的函數為標準庫函數,則,將編譯后的指令的類型指定為無條件間接跳轉分支指令。
5.一種分支預測裝置,其特征在于,應用于處理器中,所述處理器包括:第一分支目標地址預測緩存器和第二分支目標地址預測緩存器,所述第一分支目標地址預測緩存器存儲著:寄存器標識與預測目標跳轉地址的一一對應關系信息,所述第二分支目標地址預測緩存器存儲著:程序計數器的部分字段與預測目標跳轉地址的一一對應關系信息,或者,程序計數器的全部字段與預測目標跳轉地址的一一對應關系信息,其中,所述分支預測裝置,包括: 讀取單元,用于從指令緩存中讀取指令; 預測獲取單元,用于當確定所述讀取單元讀取的指令滿足寄存器預測條件時,根據所述讀取單元讀取的所述指令的寄存器標識,從所述第一分支目標地址預測緩存器中獲取所述讀取單元讀取的所述指令的預測目標跳轉地址;當確定所述讀取單元讀取的指令不滿足所述寄存器預測條件時,根據所述讀取單元讀取的所述指令的程序計數器,從所述第二分支目標地址預測緩存器中獲取所述讀取單元讀取的所述指令的預測目標跳轉地址; 其中,所述寄存器預測條件包括:指令的類型為無條件間接跳轉分支指令。
6.根據權利要求5所述的分支預測裝置,其特征在于, 所述寄存器預測條件還包括:指令中的寄存器標識為特定的寄存器標識; 所述分支預測裝置還包括: 確定單元,用于當所述讀取單元讀取的指令的類型為無條件間接跳轉分支指令,且所述讀取單元讀取的指令中的寄存器標識為特定的寄存器標識時,確定所述讀取單元讀取的指令滿足寄存器預測條件;當所述讀取單元讀取的指令的類型不為無條件間接跳轉分支指令,或者,所述讀取單元讀取的指令中的寄存器標識不為特定的寄存器標識時,確定讀取的所述指令不滿足寄存器預測條件。
7.根據權利要求5或6所述的分支預測裝置,其特征在于, 所述分支預測裝置還包括: 預譯碼單元,用于對所述讀取單元待讀取的指令進行預譯碼,得到所述讀取單元待讀取的指令的類型信息; 判定單元,用于在所述讀取單元讀取所述指令后,根據所述預譯碼單元得到的指令的類型信息,判定所述讀取單元當前讀取的指令的類型是否為無條件間接跳轉分支指令。
8.根據權利要求5或6所述的分支預測裝置,其特征在于, 所述分支預測裝置還包括: 編譯單元,用于對高級語言進行編譯; 指定單元,用于當所述編譯單元對高級語言進行編譯時調用的函數為標準庫函數時,將編譯后的指令的類型指定為無條件間接跳轉分支指令。
【文檔編號】G06F9/38GK104423929SQ201310367653
【公開日】2015年3月18日 申請日期:2013年8月21日 優先權日:2013年8月21日
【發明者】侯銳, 馮煜晶, 郭旭斌, 張乾龍 申請人:華為技術有限公司, 中國科學院計算技術研究所