專(zhuān)利名稱(chēng):利用從分支預(yù)測(cè)得出的未來(lái)分支路徑信息進(jìn)行預(yù)取的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及有條件地執(zhí)行由編譯程序或程序員插入到程序中的預(yù)取指令。
高速緩存是小的高速的存儲(chǔ)器緩沖器,邏輯上放在處理器和主存儲(chǔ)器之間,并用來(lái)保持主存儲(chǔ)器中最近要引用的部分。由于處理器的速度遠(yuǎn)遠(yuǎn)快于它的主存儲(chǔ)器,當(dāng)今的處理器需要高速緩存。邏輯上位于處理器和主存儲(chǔ)器之間的高速緩存系統(tǒng)在特性上可能是層次的,即具有多層高速緩存。高速緩存系統(tǒng)中可找到的存儲(chǔ)器請(qǐng)求是快速滿足的,通常為一個(gè)或二個(gè)周期,而未命中高速緩存并且從存儲(chǔ)器滿足的請(qǐng)求可能要數(shù)個(gè)周期。對(duì)于從存儲(chǔ)器滿足的請(qǐng)求,通常比從高速緩存滿足的請(qǐng)求時(shí)間多20到30個(gè)周期。每個(gè)未命中高速緩存并在存儲(chǔ)器找到的請(qǐng)求通常使處理器延遲一個(gè)該未命中的時(shí)間長(zhǎng)度。
預(yù)取是一種經(jīng)常使用的用來(lái)減少因高速緩存未命中造成的延遲的技術(shù)。預(yù)取機(jī)制試圖預(yù)測(cè)存儲(chǔ)器的哪些區(qū)段將由程序使用并且在處理器通常要請(qǐng)求它們之前把它們?nèi)〉礁咚倬彺嬷小5湫偷?,存?chǔ)器的各個(gè)區(qū)段稱(chēng)為行并且其尺寸在128到256個(gè)字節(jié)的范圍內(nèi)。若預(yù)取機(jī)制是成功的,則在時(shí)間上充分早地把存儲(chǔ)器的某行傳送到高速緩存中,以避免由于高速緩存未命中造成的任何處理拖延。
通常采用的預(yù)取技術(shù)涉及把預(yù)取指令插入到程序中。例如,Chllahan等人的論文“Software Prefetch”(Proceedings of the fourthInternational Conference on Architectural Support For ProgrammingLanguages and Operating System,1991年4月)說(shuō)明把執(zhí)行預(yù)取的新指令添加到指令集中。而且,IBM RS/6000和Power PC處理器具有Data-Cache-Block-Touch(dcbt)指令,其把存儲(chǔ)器中的一行預(yù)取到高速緩存中。編譯程序(它可能采用靜態(tài)和/或動(dòng)態(tài)編譯技術(shù))或程序員可在實(shí)際使用信息之前把預(yù)取指令(下面稱(chēng)為接觸指令)插入程序中,以嘗試確保在執(zhí)行程序中的下一條指令時(shí)存儲(chǔ)器的該行會(huì)處在高速緩存中??衫媒佑|指令預(yù)取指令和數(shù)據(jù)。例如,可在程序中的即將到來(lái)的分支之前插入一條接觸指令以預(yù)取位于該分支的目標(biāo)處的指令組。類(lèi)似地,可在送數(shù)(load)指令之前放上接觸指令以把數(shù)據(jù)預(yù)取到高速緩存中。
我們通過(guò)下面的程序例子開(kāi)始說(shuō)明我們的專(zhuān)利申請(qǐng)。
圖1示出一個(gè)含有三個(gè)分支和四條接觸指令的程序。這三個(gè)分支把該程序分成七個(gè)程序段。分別把三個(gè)分支編號(hào)為B1、B2和B3以標(biāo)識(shí)分支BC,EQ,轉(zhuǎn)移1;BC EQ,轉(zhuǎn)移2;和BC EQ,轉(zhuǎn)移3。在下圖中用于這七個(gè)程序段的編號(hào)方式將會(huì)變清楚。這四個(gè)接觸指令可預(yù)取數(shù)據(jù)項(xiàng)A、B、C和D。存在四個(gè)送數(shù)指令以把數(shù)據(jù)項(xiàng)A、B、C和D取到寄存器5中。圖2表示同一程序的樹(shù)圖。這三個(gè)分支把該程序分成七個(gè)程序段。對(duì)每個(gè)程序段編號(hào)并把號(hào)碼放在圓圈內(nèi)。每個(gè)分支的未取路徑示成樹(shù)叉的左邊緣,而被取路徑是右邊緣。這四個(gè)送數(shù)指令位于該樹(shù)的四個(gè)葉段中,即分別在程序段4、5、6和7中。這四個(gè)接觸指令即預(yù)取位置A、B、C和D也分別位于程序段4、5、6和7中,但出現(xiàn)在它們的送數(shù)指令配對(duì)之前。
為了增加在把存儲(chǔ)器的塊預(yù)取到高速緩存和另一條指令對(duì)它的后繼使用之間的時(shí)間間隔,編譯程序試圖在程序中把接觸指令從hp1向前移動(dòng)到ehp1。但是,把預(yù)取指令從原始程序段移到較前面的程序段并不總是改善性能,并且甚至可以因造成出現(xiàn)不必要的或不使用的預(yù)取而降低性能。
例如,研究圖2中示出的程序控制流程圖。若編程程序把程序段4中找到的用于數(shù)據(jù)A的接觸指令移到段2中(以增加在預(yù)取數(shù)據(jù)和后繼使用之間的時(shí)間間隔),則它實(shí)質(zhì)上試圖預(yù)測(cè)分支B2(BC EQ,轉(zhuǎn)移2)被取或不被取的結(jié)局。在該情況下編譯程序必須假定不取分支B2。若該程序的實(shí)際執(zhí)行流程是從段2到段5,則因?yàn)槿×嗽摲种?,?shù)據(jù)項(xiàng)A被預(yù)取并且未使用。
類(lèi)似地,編譯程序可以把用于數(shù)據(jù)項(xiàng)A和B的二條接觸指令移到程序段2中。現(xiàn)在,段2會(huì)預(yù)取A和B二者。然而,取決于該分支的結(jié)局,只會(huì)使用一個(gè)預(yù)取。若不取該分支,則對(duì)A的預(yù)取是正確的并不使用對(duì)B的預(yù)取。若取該分支,則使用B但不使用A。
存在幾個(gè)為什么要避免不準(zhǔn)確或不成功預(yù)取的理由。第一,每個(gè)不使用的預(yù)取以無(wú)用信息污染高速緩存并且浪費(fèi)寶貴的高速緩存空間。
第二,當(dāng)做出不成功預(yù)取時(shí),替換算法必須選擇目前高速緩存中的要廢棄的一行。此時(shí),若在另一次未命中出現(xiàn)之前引用該廢棄行,則出現(xiàn)一次附加的(并且不必要的)未命中。
第三,當(dāng)向高速緩存?zhèn)魉皖A(yù)取行時(shí),可能阻止處理器在該行傳送周期期間引用高速緩存。設(shè)想若高速緩存行是128字節(jié)并且若傳送總線是8字節(jié)寬,則需要16個(gè)周期以把該行拷貝到高速緩存中。
第四,每次不使用的預(yù)取把寶貴的總線周期浪費(fèi)于向高速緩存?zhèn)魉痛鎯?chǔ)器的行。若該期間出現(xiàn)真實(shí)的(必然)高速緩存未命中,則總線會(huì)忙于傳送無(wú)用的預(yù)取并且該真實(shí)的高速緩存被延遲。
本發(fā)明的主題是允許編譯程序把所有四條接觸指令(A、B、C和D)都移到程序段1中(如圖3中所示)并且具有只執(zhí)行那些產(chǎn)生有用預(yù)取的預(yù)取指令的高準(zhǔn)確性。在該例子中看出在每次執(zhí)行程序段1時(shí)會(huì)執(zhí)行所有四條接觸指令,然而只有一次預(yù)取會(huì)產(chǎn)生有用的預(yù)取。取決于分支B1、B2和B3的分支動(dòng)作(被取和不被取),只會(huì)到達(dá)程序樹(shù)的葉節(jié)點(diǎn)中的一個(gè)節(jié)點(diǎn)。另外三個(gè)葉節(jié)點(diǎn)代表不執(zhí)行代碼。我們的預(yù)取機(jī)制依賴(lài)于各分支的驗(yàn)證的可預(yù)測(cè)性以允許分支預(yù)測(cè)機(jī)制捕獲穿過(guò)程序的執(zhí)行路徑的重復(fù)特性,該分支預(yù)測(cè)機(jī)制保持有關(guān)程序的執(zhí)行路徑的信息并向處理器提供該信息。然后處理器判定要執(zhí)行哪些接觸指令并且廢棄那些沿著程序的不被取路徑的接觸指令。并且,通過(guò)選擇性地執(zhí)行接觸指令,編譯程序可以在程序中自由地放置并且進(jìn)取性地“上移”各預(yù)取指令以增大在預(yù)取指令和由另一條指令對(duì)它的實(shí)際使用之間的距離,并且由此增加通過(guò)預(yù)取獲得的性能。
例如,技術(shù)上已經(jīng)知道可高準(zhǔn)確性地預(yù)測(cè)各分支。典型地,各分支周期性地被取用或不取用并且常常利用分支的先前動(dòng)作來(lái)預(yù)測(cè)該分支的下次(或未來(lái))動(dòng)作。通過(guò)使用現(xiàn)代分支預(yù)測(cè)算法,分支預(yù)測(cè)機(jī)制常??蛇_(dá)到90%或更高的預(yù)測(cè)準(zhǔn)確性。分支的驗(yàn)證的可預(yù)測(cè)性代表程序行為的基礎(chǔ)規(guī)律,其允許分支預(yù)測(cè)機(jī)制記錄并預(yù)測(cè)哪些接觸指令會(huì)產(chǎn)生有用的預(yù)取以及廢棄(不執(zhí)行)產(chǎn)生不必預(yù)取的接觸指令。
由于穿過(guò)程序的執(zhí)行流程是重復(fù)的并且分支動(dòng)作是重復(fù)的,從而我們的預(yù)取機(jī)制行之有效。利用圖3,若程序的流程是從程序段1到程序段3再到段6,則取用分支B1和不取分支B3。由于分支動(dòng)作是高重復(fù)性的,當(dāng)重復(fù)執(zhí)行程序時(shí)程序的執(zhí)行流程再次從程序段1到3再到6的概率是高的。
此外,我們的預(yù)取機(jī)制遠(yuǎn)在指令執(zhí)行周期之前的處理器譯碼周期期間廢棄不準(zhǔn)確的預(yù)取指令。這簡(jiǎn)化了處理器的設(shè)計(jì)并改進(jìn)總性能,還避免了與廢除(取消)無(wú)用預(yù)取或者在發(fā)出預(yù)取以后浪費(fèi)寶貴高速緩存空間或總線周期相關(guān)聯(lián)的不必要復(fù)雜性。
存在一些涉及預(yù)取機(jī)制的專(zhuān)利,它們各具有一定的優(yōu)點(diǎn)和缺點(diǎn)。
例如,幾份專(zhuān)利說(shuō)明在程序的循環(huán)內(nèi)預(yù)取數(shù)據(jù)。
授予Santhanam的美國(guó)專(zhuān)利5,704,053說(shuō)明一種把預(yù)取指令添加到程序循環(huán)中的機(jī)理。該技術(shù)利用來(lái)自其以前的應(yīng)用運(yùn)行的執(zhí)行概要確定在循環(huán)中的何處插入預(yù)取指令。
授予Hsu的美國(guó)專(zhuān)利5,843,934確定循環(huán)內(nèi)的程序的存儲(chǔ)器存取模式。在循環(huán)體上均勻地安排預(yù)取。這避免預(yù)取的聚集,尤其當(dāng)因置換以前更新過(guò)的高速緩存行預(yù)取而造成排空或回寫(xiě)時(shí)。根據(jù)循環(huán)迭代的數(shù)量和每次循環(huán)迭代上要進(jìn)行的預(yù)取數(shù)量編排預(yù)取。
授予Widigen等的美國(guó)專(zhuān)利5,919,256描述一種從代替引用存儲(chǔ)器的操作數(shù)高速緩存中預(yù)取數(shù)據(jù)的機(jī)制。然后利用來(lái)自該操作數(shù)高速緩存的數(shù)據(jù)值推測(cè)地執(zhí)行指令。若從操作數(shù)高速緩存檢索的數(shù)據(jù)值等于實(shí)際的操作數(shù)值,則完成該推測(cè)執(zhí)行。若二個(gè)值不相等,則廢棄所有推測(cè)執(zhí)行。
授予Mirza的美國(guó)專(zhuān)利5,357,618確定跨距1或N或該跨距值的一種組合的行組的預(yù)取長(zhǎng)度。利用跨距寄存器計(jì)算程序的引用模式并且利用專(zhuān)用指令在通用寄存器和跨距寄存器之間傳送該值。編譯程序利用這些新指令控制循環(huán)內(nèi)的預(yù)取。
更通用的預(yù)取技術(shù)包括授予Wilson的美國(guó)專(zhuān)利5,896,517利用后臺(tái)存儲(chǔ)器移動(dòng)(BMM)機(jī)制改進(jìn)程序的性能。BMM機(jī)制并行于常規(guī)處理器操作在存儲(chǔ)器層次的不同層之間執(zhí)行后臺(tái)存儲(chǔ)器移動(dòng)操作。
授予Emberson的美國(guó)專(zhuān)利5,838,945說(shuō)明一種把長(zhǎng)度可變的行取到高速緩存中的預(yù)取機(jī)制。利用一種專(zhuān)用指令指示要預(yù)取的高速緩存行的長(zhǎng)度、預(yù)裝入預(yù)取數(shù)據(jù)的高速緩存集合定位以及預(yù)取類(lèi)型(指令或數(shù)據(jù))。
授予Goodnow等人的美國(guó)專(zhuān)利5,918,246說(shuō)明一種利用編譯程序生成的程序圖的預(yù)取方法。接著利用程序圖把適當(dāng)?shù)闹噶詈蛿?shù)據(jù)信息預(yù)取到高速緩存中。程序圖包含分支的地址單元和分支目標(biāo)以及程序使用的各數(shù)據(jù)單元。
授予Berenbaum等人的美國(guó)專(zhuān)利5,778,435說(shuō)明一種基于歷史的預(yù)取機(jī)制,其在緩沖器中保存高速緩存未命中地址。通過(guò)前N個(gè)周期發(fā)布的指令地址對(duì)該緩沖器編索引。然后利用緩沖器值作為預(yù)取地址以試圖避免高速緩存未命中。
授予Howry的美國(guó)專(zhuān)利5,732,242說(shuō)明一種預(yù)取指令含有“提示”位組的機(jī)理。這些提示位組指示要進(jìn)行哪一種預(yù)取操作,即預(yù)取是排它的或只讀的;并且指示裝入哪個(gè)設(shè)置該行的高速緩存(最近最少使用或最近最多使用)。
授予Palmer的美國(guó)專(zhuān)利5,305,389說(shuō)明一種在模式存儲(chǔ)器中存儲(chǔ)存取模式的預(yù)取機(jī)制。通過(guò)把當(dāng)前的一組對(duì)象(存取)和該模式存儲(chǔ)器中保持的對(duì)象(存取)比較,得到預(yù)取候選。對(duì)于生成預(yù)取候選,不要求模式匹配顯示出對(duì)模式存儲(chǔ)器中保存的對(duì)象的完全匹配。對(duì)每個(gè)匹配模式的剩余對(duì)象嘗試預(yù)取。
在IBM技術(shù)公報(bào)第36卷第10期第69-70頁(yè)(1993年10月)中的Kaeli等人的“數(shù)據(jù)預(yù)取對(duì)分支預(yù)測(cè)的連接”中,說(shuō)明一種數(shù)據(jù)預(yù)取和分支預(yù)測(cè)的耦合。該機(jī)制在分支歷史表中保存以前的操作數(shù)未命中的地址。每當(dāng)查閱分支歷史表以預(yù)測(cè)分支動(dòng)作,或取用或不取用,時(shí),若找到匹配,則嘗試操作數(shù)預(yù)取。只為分支歷史表中保存的以前的未命中嘗試預(yù)取。
共同轉(zhuǎn)讓給本發(fā)明的受讓人的并因此本文對(duì)其全文引用的授予Dubey的美國(guó)專(zhuān)利5,774,685使用一種預(yù)取指令,其對(duì)在預(yù)取指令和使用該數(shù)據(jù)的指令之間的分支路徑(它由編譯程序確定)編碼,其中該分支路徑代表插入分支的動(dòng)作(被取用或不取用)。利用預(yù)取指令中包含的推測(cè)分支路徑信息標(biāo)志各個(gè)預(yù)取行。存在專(zhuān)用硬件以比較預(yù)取行的標(biāo)志信息和處理器執(zhí)行的實(shí)際分支動(dòng)作。每當(dāng)該標(biāo)志信息不同于實(shí)際分支動(dòng)作時(shí),就較早地廢棄該預(yù)取行,同時(shí)在高速緩存中較長(zhǎng)期地保持其標(biāo)志和實(shí)際分支動(dòng)作相等的各預(yù)取行。
類(lèi)似地,授予Yeh等人的美國(guó)專(zhuān)利5,742,804說(shuō)明一種只預(yù)取指令的機(jī)制。在程序中即將到來(lái)的分支的前面插入分支預(yù)測(cè)指令。每條分支預(yù)測(cè)指令充當(dāng)一條預(yù)取指令,并包含一個(gè)預(yù)測(cè)即將到來(lái)的分支的方向(取或不取)的猜測(cè)字段、預(yù)取地址、要預(yù)取的字節(jié)數(shù)以及一個(gè)指示通往該即將到來(lái)的分支的分支路徑的跟蹤向量。通過(guò)比較即將到來(lái)的分支的動(dòng)作和由跟蹤向量預(yù)測(cè)的動(dòng)作,利用跟蹤向量取消已發(fā)出的預(yù)取。不存在預(yù)取數(shù)據(jù)的機(jī)制。
此外,共同轉(zhuǎn)讓給本發(fā)明的受讓人的并因此本文對(duì)其全文引用的Puzak的美國(guó)專(zhuān)利(申請(qǐng)?zhí)?8/599,833)說(shuō)明一種條件執(zhí)行預(yù)取指令的方法。其利用歷史表,該表記錄以前執(zhí)行的預(yù)取指令取出的信息實(shí)際上是否由處理器使用。該表被稱(chēng)為接觸歷史表。利用該表中包含的信息只執(zhí)行那些取出有用數(shù)據(jù)的預(yù)取指令,并廢棄(不執(zhí)行)取出不使用數(shù)據(jù)的預(yù)取指令。
利用編譯程序在程序中放置接觸指令是一種周知的預(yù)取技術(shù)。例如,William Y.chen、Scottt Mahlke、Pahua Chang和Wen-mei w.Hwu在“Data Access Microarchitectures For Superscalar Processors WithCompiler-Assisted Data Prefetching”(in 24thAnnual InternationalSymposium on Microarchitecture,pages 69-73,Nov 1991)中,以及Todd C.Mowry在“Tolerating Latency Through Software-ControlledData Prefetching”(Ph.D Thesis,Computer Systems Laboratory,Stanford University,CA 9305,March 1994)中,說(shuō)明一些在程序中放置接觸指令以把數(shù)據(jù)預(yù)取到高速緩存中作為減少高速緩存的等待時(shí)間的方法。
圖1是一個(gè)帶有四條送數(shù)指令和四條預(yù)取指令的程序的圖示表示;圖2是該程序的控制流程圖;圖3是該程序把各接觸指令移到第一程序段下的控制流程圖;圖4示出接觸指令的格式;圖5是依據(jù)本發(fā)明的包含著預(yù)取預(yù)測(cè)控制的處理器的功能方塊圖;圖6是依據(jù)本發(fā)明的圖5的待決分支預(yù)測(cè)邏輯的功能方塊圖;圖7是依據(jù)本發(fā)明的圖5的分支歷史隊(duì)列的功能方塊圖;圖8是依據(jù)本發(fā)明的圖6的待決分支預(yù)測(cè)隊(duì)列的功能方塊圖;圖9是依據(jù)本發(fā)明的圖6的分支預(yù)測(cè)機(jī)制命中邏輯的功能方塊圖;圖10是依據(jù)本發(fā)明的圖6的分支譯碼邏輯的功能方塊圖;圖11是依據(jù)本發(fā)明的圖6的接觸指令譯碼邏輯的功能方塊圖;圖12是一個(gè)表,其說(shuō)明用于比較分支歷史表征碼和接觸指令中的分支表征碼的表征碼比較邏輯;圖13表示接觸指令信息塊的格式;圖14是依據(jù)本發(fā)明的圖6的分支執(zhí)行邏輯的功能方塊圖;圖15是依據(jù)本發(fā)明的圖5的接觸指令執(zhí)行單元的功能方塊圖。
現(xiàn)一般地說(shuō)明本預(yù)取機(jī)制的操作并在后面作更詳細(xì)的說(shuō)明。請(qǐng)注意,本文中的設(shè)計(jì)說(shuō)明是為解釋的簡(jiǎn)潔性而不是為設(shè)計(jì)的最優(yōu)性選擇的。例如,假定所有指令是按順序執(zhí)行的,但是所呈現(xiàn)的說(shuō)明不排斥無(wú)序設(shè)計(jì)。
每條接觸指令具有一個(gè)分支表征碼字段(包含在指令中),該字段說(shuō)明在該接觸指令和由其預(yù)取的數(shù)據(jù)的實(shí)際使用之間的路徑上的一系列分支的分支取向(取用或不取用)。該分支表征碼字段指示穿越程序的從該接觸指令到引用所預(yù)取的數(shù)據(jù)項(xiàng)的指令的路徑。分支表征碼字段是由編譯程序在程序的代碼生成期間設(shè)置的。通過(guò)對(duì)每條接觸指令關(guān)聯(lián)在該接觸指令和存儲(chǔ)器引用之間的各個(gè)分支的分支取向的指示,利用運(yùn)行期分支預(yù)測(cè)機(jī)制來(lái)判定是否要執(zhí)行接觸指令。從而,在一條接觸指令被譯碼后,僅當(dāng)它的分支表征碼字段可被驗(yàn)證成或確認(rèn)成對(duì)應(yīng)于分支預(yù)測(cè)符期待的路徑后才執(zhí)行它。若它的分支表征碼字段不和分支預(yù)測(cè)機(jī)制所選擇的期待分支路徑匹配,則廢棄該接觸指令。
例如,利用圖3,當(dāng)?shù)谝淮芜M(jìn)入段1時(shí),并行地出現(xiàn)二個(gè)事件。第一,譯碼所有四條接觸指令并發(fā)送到執(zhí)行單元。第二,查閱分支預(yù)測(cè)機(jī)制并判定不存在用于指令分支B1的分支歷史。
在不存在任何分支歷史信息下,不執(zhí)行程序段1中的任何接觸指令(注意,這種決策是任意的并且是一種有些保守的預(yù)取策略。從該策略到一處更為進(jìn)取的策略的范圍中的替代辦法是當(dāng)不能得到任何分支預(yù)測(cè)歷史時(shí)執(zhí)行所有四條接觸指令。)隨著執(zhí)行各個(gè)程序段,該分支預(yù)測(cè)機(jī)制確定取分支B1并且不取分支B2。分支預(yù)測(cè)機(jī)制記錄該信息并且該信息和分支B1相關(guān)聯(lián)。在第二次執(zhí)行段1時(shí),再次并行地出現(xiàn)二個(gè)事件。譯碼這四條接觸指令并發(fā)送到執(zhí)行單元,并且分支預(yù)測(cè)機(jī)制再次搜索以確定和B1關(guān)聯(lián)的分支歷史。這一次,B1的分支歷史預(yù)測(cè)下二個(gè)分支的結(jié)局是先取用然后不取用。把該信息和該接觸指令中含有的分支表征碼字段比較。
例如,接觸指令A(yù)的表征碼是二個(gè)不取用的分支。接觸指令B的表征碼是一個(gè)不取用的分支然后跟著一個(gè)取用的分支。接觸指令C具有的表征碼是先取用然后不取用,而接觸指令D的表征碼是二個(gè)取用的分支。
只有那些和分支預(yù)測(cè)機(jī)制中包含的分支歷史信息匹配的接觸指令才會(huì)得到執(zhí)行。在該例子中只令執(zhí)行接觸指令C。其它接觸指令會(huì)被廢棄,因?yàn)樗鼈兊姆种П碚鞔a信息不和從分支推測(cè)機(jī)制得到的信息匹配。
預(yù)取塊C并且用作從段1到3再到6的程序的執(zhí)行流程。只要代表程序執(zhí)行流程的分支動(dòng)作保持不變,該預(yù)取策略就是正確的。
圖4示出接觸指令50的格式。該指令包含下列字段操作碼51,該字段表示該指令使用的操作碼。分支表征碼52,該字段指示在該接觸指令與由該接觸指令所預(yù)取的數(shù)據(jù)引用之間遇到的后N個(gè)唯一循環(huán)不算的分支的所需結(jié)局或方向。(注意,該決策是隨意的并且它可能考慮所有分支順序,在構(gòu)建分支表征碼時(shí)帶有循環(huán)或不帶有循環(huán)。)例如,從圖3,當(dāng)編譯程序把用于數(shù)據(jù)C的接觸指令移入段1時(shí),它越過(guò)該程序的執(zhí)行路徑中的二個(gè)分支。為到達(dá)數(shù)據(jù)C的原始引用所需的每個(gè)分支結(jié)局是由單個(gè)子字段代表的,其中每個(gè)子字段可具有三個(gè)值中的一個(gè)值T,取用該分支。
N,不取用該分支。
D,可以取用或不取用該分支。在該情況下分支方向是“不在意”。(注意每個(gè)子字段可取三個(gè)不同的值,從而一個(gè)具有五個(gè)子字段的分支表征碼字段具有取、不取、不在意值的35=243種不同的可能組合。這可用8位的二進(jìn)制編碼表示,28=256。)接觸地址53,該字段指示要預(yù)取的高速緩存塊的地址。該字段的格式可代表一個(gè)基址寄存器和位移值或一個(gè)從該接觸指令地址相對(duì)偏離的值。若選擇基址和位移表示,則預(yù)取地址是基址寄存器中包含的值和位移值的和。若通過(guò)相對(duì)偏離規(guī)定預(yù)取地址,則該值可表示相對(duì)于(加或減)接觸指令地址的字節(jié)、字或甚至高速緩存行的數(shù)量。
下面的例子可代表圖3中列出的四條接觸指令。
“接觸”NN,A“接觸”NT,B“接觸”TN,C“接觸”TT,D
這里每個(gè)接觸指令在程序中向上移動(dòng)二個(gè)分支。若分支表征碼字段為四目長(zhǎng)(允許每條接觸指令越過(guò)四個(gè)分支),則最后二個(gè)分支的結(jié)局應(yīng)由“不在意”狀況表示或用D表示。例如,來(lái)自段1的預(yù)取項(xiàng)C的四個(gè)位置分支表征碼應(yīng)是“接觸”TNDD,C。分支表征碼全為D的接觸指令表示“全預(yù)取”狀態(tài)。利用這種表征碼,總是出現(xiàn)預(yù)取而與由分支預(yù)測(cè)機(jī)制找到(或未找到)的任何分支歷史信息無(wú)關(guān)。
利用該預(yù)取指令可以預(yù)取指令和數(shù)據(jù)二者。例如,為了預(yù)取指令,通過(guò)確定從程序中的當(dāng)前位置到新段的相對(duì)距離(按字節(jié)數(shù)、字?jǐn)?shù)或高速緩存行數(shù)),編譯程序可計(jì)算出未來(lái)要執(zhí)行的某程序段的地址。接觸指令然后會(huì)利用該相對(duì)地址規(guī)定預(yù)取地址。類(lèi)似地,可以通過(guò)相對(duì)偏離(當(dāng)知道時(shí))或在設(shè)置基址寄存器下通過(guò)使用基址和位移地址規(guī)范,確定預(yù)取數(shù)據(jù)。
在本發(fā)明的優(yōu)選實(shí)施例中,可擴(kuò)大編譯程序以生成用于一個(gè)按如下所述實(shí)現(xiàn)條件預(yù)取機(jī)制的機(jī)器的代碼。上面說(shuō)明的接觸指令在一類(lèi)專(zhuān)用寄存器(接觸寄存器)中產(chǎn)生(技術(shù))結(jié)果,并且除定址和頁(yè)面故障中斷不起作用之外,使相同的目標(biāo)地址具有送數(shù)指令的執(zhí)行時(shí)間和存儲(chǔ)器特性。它是編譯程序慣例的人工制品并且用來(lái)表示在接觸指令和對(duì)其預(yù)取的數(shù)據(jù)的引用之間的顯式相關(guān)性。
編譯期間,在編譯程序第一次通過(guò)指令編排之前,在緊靠著每個(gè)存儲(chǔ)器引用(裝入或存儲(chǔ)或程序段)之前插入一條接觸指令,并按一個(gè)對(duì)源(subject)存儲(chǔ)器引用的操作數(shù)包括接觸寄存器結(jié)果。
該操作數(shù)僅用于向編譯程序表示在該接觸指令上的存儲(chǔ)器引用的技術(shù)相關(guān)性。此外,每個(gè)為其已生成一個(gè)接觸指令的存儲(chǔ)器引用被標(biāo)記成具有大為減少的等待時(shí)間,通常只為一個(gè)周期。現(xiàn)在,在傳送指令編排時(shí),已經(jīng)被建立的情況將造成編譯程序試圖重新定位各接觸指令,以使它們的所有或部分期望等待時(shí)間復(fù)蓋它們的相關(guān)的存儲(chǔ)器引用。請(qǐng)回憶這相關(guān)性是由存儲(chǔ)器引用的附加接觸寄存器操作數(shù)表示的。
通常,條件分支的出現(xiàn)可能限制編譯程序?yàn)閺?fù)蓋其等待時(shí)間而對(duì)接觸指令“上移”的距離。為了檢測(cè)該情況,在傳送指令編排后,進(jìn)行一次掃描以確定位于各基本塊的前部的接觸指令。對(duì)于每條這樣的指令,若編譯程序判定尚未全部復(fù)蓋它的所有使用的等待時(shí)間,則采用一次特別的變換以沿分支向上移動(dòng)該接觸指令。并在此刻修改該接觸指令的表征碼字段以指示從其上移動(dòng)該指令的分支的方向。實(shí)際上,把該表征碼字段向右移位一個(gè)子字段位置(假定分支表征碼排列成子字段1在左側(cè)),并對(duì)它添加前綴取用/不取用/不在意指示符。在該變換后,若存在任何改變,則再一次傳送編排,并且其可能造成接觸指令的進(jìn)一步移動(dòng)。重復(fù)這種場(chǎng)面,直至所得到的改善不值得編譯程序再次傳送編排為止。在該變換之后,表征碼字段編碼出從預(yù)取指令到使用由該預(yù)取指令取出的信息的指令的路徑。
為消除重復(fù)應(yīng)進(jìn)行代碼的最后一次通過(guò)。這種最簡(jiǎn)單的重復(fù)是發(fā)生在相同高速緩存行中相同基本塊地址上有二條接觸指令時(shí)(但請(qǐng)注意可能需要復(fù)雜的別名分析以檢測(cè)許多這種類(lèi)型的重復(fù),并且事實(shí)上不是所有這樣的重復(fù)都能在編譯時(shí)間時(shí)檢測(cè)出的)。此類(lèi)重復(fù)的一種可檢測(cè)情況可能是在編譯程序把接觸指令向上游移動(dòng)到會(huì)合點(diǎn)造成該指令的一個(gè)或多個(gè)拷貝時(shí)引入的。若檢測(cè)出此時(shí)間,則可通過(guò)適當(dāng)?shù)匦薷谋碚鞔a字段消除該重復(fù),即,一旦表征碼字段是二個(gè)子字段不同,就把子字段設(shè)定為不在意。當(dāng)一條接觸指令統(tǒng)治另一條,二條都定址相同高速緩存行中項(xiàng)時(shí),出現(xiàn)略為復(fù)雜的重復(fù)。在要消除檢測(cè)出的這次重復(fù)時(shí)必須施以判斷。若許多指令位于出現(xiàn)重復(fù)接觸指令的之間,并且若在其中存在相關(guān)聯(lián)的存儲(chǔ)器引用,則后一條接觸指令可能仍然是需要的,因?yàn)樵谟龅胶笠粭l接觸指令時(shí)它引用的高速緩存行可能已從高速緩存排出。這種判斷會(huì)收錄在考慮目標(biāo)處理器的期望高速緩存幾何的編譯程序直觀判斷中。
業(yè)內(nèi)人士容易理解,可以利用替代的編譯技術(shù)來(lái)生成接觸指令和對(duì)應(yīng)的分支表征碼并放置在指令流中供條件執(zhí)行,并且還理解本發(fā)明可使用任何替代的編譯技術(shù)。
圖5示出支持該預(yù)取機(jī)制所需要的計(jì)算機(jī)系統(tǒng)的主要要素。該圖示出下述組件
存儲(chǔ)器5存儲(chǔ)處理器上執(zhí)行的指令和操作數(shù)。存儲(chǔ)器的最近使用部分被傳送到高速緩存。
高速緩存10其中保存指令和數(shù)據(jù)的高速存儲(chǔ)器。向指令緩沖器提供指令并且向執(zhí)行單元提供操作數(shù)。還從執(zhí)行單元接收更新(存儲(chǔ))和預(yù)取請(qǐng)求。(注意,本設(shè)計(jì)說(shuō)明中呈現(xiàn)一個(gè)公共的或統(tǒng)一的高速緩存,但該說(shuō)明可容易地修改成拆開(kāi)或分離指令高速緩存和數(shù)據(jù)高速緩存)。
指令緩沖器15保存已由指令取邏輯20取的指令。
譯碼器25檢查指令緩沖器并譯碼指令。典型地,存在含有正被譯碼的指令的地址的程序計(jì)數(shù)器(PC)寄存器。指令譯碼后接著把它送到適當(dāng)?shù)膱?zhí)行單元。接觸指令以及分支還由作進(jìn)一步處理的待決分支預(yù)測(cè)邏輯進(jìn)行處理。
執(zhí)行單元組,執(zhí)行指令。典型地,一個(gè)處理器會(huì)具有多個(gè)執(zhí)行單元以改進(jìn)性能并提高并行性。在本說(shuō)明中,把所有接觸指令分配給接觸執(zhí)行單元200和把分支發(fā)送到分支執(zhí)行單元300。所有其它指令到通用執(zhí)行單元250。出于簡(jiǎn)單化并呈現(xiàn)清晰設(shè)計(jì),選擇這樣的配置。很清楚,許多其它執(zhí)行單元配置可以和本機(jī)制一起使用。每個(gè)執(zhí)行單元關(guān)聯(lián)著一個(gè)執(zhí)行隊(duì)列(未示出)。執(zhí)行隊(duì)列保持等待執(zhí)行的已譯碼指令。
分支預(yù)測(cè)機(jī)制30記錄以前執(zhí)行過(guò)的分支的分支動(dòng)作信息(被取或不被取)。還通過(guò)取和不取分支順序引導(dǎo)指令取機(jī)制并接收來(lái)自分支執(zhí)行單元和分支歷史隊(duì)列的更新。典型地,分支預(yù)測(cè)邏輯和指令取邏輯,在指令取之前通過(guò)預(yù)測(cè)即將到來(lái)的分支所進(jìn)行的分支預(yù)測(cè),攜手工作。指令取機(jī)制會(huì)使用分支預(yù)測(cè)信息,以便若不取某分支則取后繼指令,或者若某分支預(yù)測(cè)為要取則轉(zhuǎn)移到一個(gè)新的指令取地址。當(dāng)工作正常時(shí)分支預(yù)測(cè)機(jī)制可在時(shí)間上足夠早地檢測(cè)(預(yù)測(cè))被取分支,從而指令取機(jī)制可在流水線中出現(xiàn)任何拖延之前取分支目標(biāo)。
分支預(yù)測(cè)機(jī)制操作上類(lèi)似于美國(guó)專(zhuān)利4,679,141中說(shuō)明的分支歷史表(BHT),但對(duì)該表中的每條項(xiàng)包含附加信息(被取分支和不取分支)。這附加信息說(shuō)明處理器以前遇到過(guò)的下N個(gè)分支的預(yù)測(cè)分支動(dòng)作。把該信息移到待決分支預(yù)測(cè)邏輯100。在那里把它和接觸指令中包含的分支表征碼進(jìn)行比較。后面會(huì)說(shuō)明這些機(jī)制的操作。
待決分支預(yù)測(cè)邏輯100圖6示出待決分支預(yù)測(cè)邏輯的操作的總概要,后面將給出更詳細(xì)的說(shuō)明。待決分支預(yù)測(cè)邏輯包括五個(gè)子單元待決分支預(yù)測(cè)隊(duì)列(PBPQ)125,分支譯碼邏輯101,接觸指令譯碼邏輯150,分支執(zhí)行邏輯175以及分支預(yù)測(cè)命中邏輯190。PBPQ保持說(shuō)明N個(gè)分支(其中每個(gè)分支被分支預(yù)測(cè)機(jī)制30(圖5)檢測(cè)(預(yù)測(cè)))的動(dòng)作的預(yù)測(cè)信息。該信息會(huì)被待決分支預(yù)測(cè)邏輯中的另外四個(gè)子單元使用或修改。譯碼器通過(guò)路徑901把指令譯碼信息發(fā)送到指令選擇控制102。若正在譯碼某分支,則控制流進(jìn)入分支譯碼邏輯101,或者若譯碼某接觸指令,則進(jìn)入接觸指令譯碼邏輯150。分支譯碼邏輯向分支執(zhí)行單元提供分支預(yù)測(cè)信息(通過(guò)路徑975),并且在譯碼分支后用地址排序信息復(fù)位譯碼器(通過(guò)路徑965)和指令取邏輯(通過(guò)路徑970)。接觸指令譯碼邏輯150比較每條接觸指令中包含的分支表征碼和JPBPQ中保存的分支歷史信息。只把那些帶有匹配的分支表征碼的接觸指令發(fā)送到接觸執(zhí)行單元。分支執(zhí)行邏輯175對(duì)照分支的實(shí)際執(zhí)行結(jié)果,檢查分支預(yù)測(cè)信息。當(dāng)檢測(cè)出預(yù)測(cè)錯(cuò)誤時(shí),清洗PBPQ,并且重新啟動(dòng)指令取單元和譯碼器。分支預(yù)測(cè)命中邏輯190把分支預(yù)測(cè)信息保存到PBPQ中。待決分支預(yù)測(cè)邏輯中的其它子單元使用該信息。后面將更詳細(xì)地說(shuō)明這四個(gè)子單元的操作。
請(qǐng)注意,實(shí)際上應(yīng)把在待決分支預(yù)測(cè)邏輯中說(shuō)明的許多功能集成到譯碼器、分支預(yù)測(cè)機(jī)制或處理器的執(zhí)行單元上。典型地,周期時(shí)間限制會(huì)要求把該邏輯的某些部分放到這些單元內(nèi)。然而,出于揭示的簡(jiǎn)明性,后面分離地說(shuō)明它們。
分支歷史隊(duì)列(BHQ)400對(duì)處理器執(zhí)行的每個(gè)分支,暫時(shí)性地記錄在該分支之后執(zhí)行的分支的取/不取動(dòng)作序列。BHQ的功能是為BHT中的每項(xiàng)形成分支歷史表征碼。接著把該表征碼和正在譯碼的接觸指令的分支表征碼進(jìn)行比較。圖7示出分支歷史隊(duì)列的基本特征。該圖示出BHQ是按由分支地址信息字段410和分支歷史表征碼字段420組成的項(xiàng)目數(shù)組排列的。N個(gè)分支地址項(xiàng)411包含在分支地址信息字段中。每個(gè)分支地址項(xiàng)411和一個(gè)N位的分支歷史表征碼相關(guān)聯(lián)。該N個(gè)位中的每一位代表處理器遇到的N個(gè)分支的動(dòng)作(被取或不被取)并且對(duì)應(yīng)于接觸指令的分支表征碼中的N個(gè)子字段。
分支歷史隊(duì)列可按先進(jìn)先出(FIFO)隊(duì)列實(shí)現(xiàn),其中把處理器遇到的每個(gè)新分支放在該隊(duì)列上。當(dāng)處理器執(zhí)行一個(gè)分支時(shí),發(fā)生四個(gè)動(dòng)作。第一,所有現(xiàn)有的隊(duì)列地址項(xiàng)以及它們的對(duì)應(yīng)分支表征碼信息在隊(duì)列中向下推一個(gè)位置。這使隊(duì)列的第一個(gè)位置空出來(lái)以用于新的分支地址項(xiàng)。第二,所有分支歷史表征碼向左移一位,以對(duì)剛進(jìn)入隊(duì)列的新分支的分支動(dòng)作提供空間。第三,把該分支的地址放在BHQ的分支地址1中并清除分支歷史表征碼。通過(guò)路徑950設(shè)定分支地址。第四,接著把新分支動(dòng)作作為最右的一位而添加到分支歷史隊(duì)列中的所有分支歷史表征碼上。以這種方式構(gòu)建的分支歷史表征碼裝定每個(gè)分支動(dòng)作字段,以和接觸指令中找到的分支表征碼的N個(gè)子字段相匹配。
例如,該圖示出只填入BHQ的第一項(xiàng)的最右一位。這里,Xn代表該分支的動(dòng)作。事實(shí)上,每個(gè)分支歷史表征碼的第n位代表在分支歷史隊(duì)列的第一位置中找到的分支的動(dòng)作。該隊(duì)列的第二項(xiàng)(分支地址2)只填入最右側(cè)的二項(xiàng)。其中Xn-1代表在它的分支地址字段中標(biāo)識(shí)的分支的動(dòng)作,而Xn代表接著執(zhí)行的分支的動(dòng)作。注意,這是BHQ的第一位置上的分支。BHQ的第三項(xiàng)中的分支歷史表征碼只填入三個(gè)最右側(cè)的分支動(dòng)作。其中Xn-2代表在它的分支地址字段中標(biāo)識(shí)的分支的動(dòng)作,Xn-1代表在該分支之后執(zhí)行的分支(BHQ的第二位置上的分支)的動(dòng)作,而Xn代表在該分支后第二個(gè)執(zhí)行的分支(它是BHQ的第一位置上的分支)的動(dòng)作。最后,BHQ的最后一項(xiàng)示出一個(gè)N位寬和完整填入的分支歷史表征碼。這些位編號(hào)為X1,X2,…Xn-2,Xn-1,Xn。其中,X1說(shuō)明由該分支地址段標(biāo)識(shí)的分支的動(dòng)作。它的值可以是1或0中之一,1代表該分支被取而0意味著該分支不被取。位X2說(shuō)明在由分支地址字段標(biāo)識(shí)的分支之后執(zhí)行的分支的動(dòng)作。而X3(圖中未示出)說(shuō)明在由分支地址字段標(biāo)識(shí)的分支之后第二個(gè)執(zhí)行的分支的動(dòng)作并依次類(lèi)推,并且最后三個(gè)執(zhí)行的分支的動(dòng)作標(biāo)記為Xn-2,Xn-1和Xn。它們分別標(biāo)識(shí)BHQ的第三、第二和第一位置上的分支的動(dòng)作。
對(duì)于進(jìn)入BHQ的每個(gè)新分支,必須有一個(gè)分支離開(kāi)(被推出)BHQ(不考慮啟動(dòng)狀態(tài))。當(dāng)一個(gè)分支離開(kāi)BHQ時(shí),它的分支表征碼是完整的,接著在BHT中保存該分支表征碼供未來(lái)引用。該處理涉及用離開(kāi)BHQ的分支的地址搜索BHT。若找到匹配,則用匹配的BHT項(xiàng)保存該分支表征碼。該分支表征碼代表處理器執(zhí)行的下N個(gè)分支的程序路徑。若未在BHT中找到分支,則建立一個(gè)新項(xiàng)。
指令取邏輯20,其中從高速緩存取指令并放到指令緩沖器15中。指令取控制器必須和分支預(yù)測(cè)機(jī)制30通信以確定何時(shí)指令取應(yīng)該沿著程序的某順序路徑繼續(xù)或何時(shí)由于某預(yù)測(cè)分支而應(yīng)轉(zhuǎn)移到新的指令地址。典型地,分支預(yù)測(cè)機(jī)制遠(yuǎn)遠(yuǎn)早于指令取控制(在時(shí)間和分支預(yù)測(cè)二方面上),從而指令取可以無(wú)縫地把指令取到指令緩沖器中并不會(huì)因取分支出現(xiàn)流水淺而拖延。
我們現(xiàn)在可以完整地說(shuō)明本發(fā)明的動(dòng)作。把該機(jī)制考慮成是三個(gè)獨(dú)立但同步的三個(gè)進(jìn)程是方便的,即指令取(包括分支預(yù)測(cè))、譯碼和執(zhí)行。
指令取進(jìn)程沿著程序的各預(yù)測(cè)路徑把指令取到指令緩沖器中。這些路徑基于分支預(yù)測(cè)機(jī)制做出的預(yù)測(cè)。當(dāng)分支預(yù)測(cè)機(jī)制檢測(cè)出一個(gè)分支時(shí),在PBPQ中建立一個(gè)項(xiàng)。這包括在PBPQ中保存分支地址、預(yù)測(cè)目標(biāo)地址和分支歷史表征碼。圖8給出對(duì)PBPQ的更詳細(xì)說(shuō)明。PBPQ排列成一個(gè)具有分支地址信息字段126、目標(biāo)地址信息字段128、分支歷史表征碼字段130和有效位字段132的各項(xiàng)的數(shù)組。分支地址信息字段含有各自的分支地址項(xiàng)140,其中分支地址項(xiàng)標(biāo)識(shí)其方向已由分支預(yù)測(cè)機(jī)制預(yù)測(cè)的一個(gè)分支的地址。請(qǐng)注意分支地址字段中保存的每個(gè)地址可以是短縮的或截短的。有可能只在每個(gè)PBPQ項(xiàng)中保存構(gòu)成完整分支地址的位組的子集。PBPQ中和各個(gè)分支地址項(xiàng)相關(guān)聯(lián)的是一個(gè)分支目標(biāo)項(xiàng)142、一個(gè)分支歷史表征碼144項(xiàng)和一個(gè)有效位146。分支目標(biāo)字段標(biāo)識(shí)和分支地址字段標(biāo)識(shí)的分支對(duì)應(yīng)的預(yù)測(cè)目標(biāo)地址。
分支歷史表征碼包含N位,其中每位表示處理器遇到的下N個(gè)分支的預(yù)測(cè)動(dòng)作(被取或不被取),并對(duì)應(yīng)于接觸指令的分支表征碼中的N個(gè)子字段。例如,分支歷史表征碼的第一位代表對(duì)應(yīng)的分支地址字段中標(biāo)識(shí)的分支的預(yù)測(cè)動(dòng)作。第二位代表處理機(jī)在該對(duì)應(yīng)的分支地址字段中找到分支后要執(zhí)行的下一個(gè)分支的預(yù)測(cè)動(dòng)作。接著,第三位代表在該分支地址字段標(biāo)識(shí)的分支后第二個(gè)要執(zhí)行的分支的預(yù)測(cè)動(dòng)作。最后,第n位代表在該分支地址字段上找到的分支后第n-1個(gè)要執(zhí)行的分支的預(yù)測(cè)動(dòng)作。和每個(gè)分支地址字段相關(guān)的有效位表示該分支地址項(xiàng)是否有效。零(0)表示無(wú)效而1表示有效。
把PBPQ想象成是一個(gè)其第一項(xiàng)(或頭)為最老的項(xiàng)的隊(duì)列是方便的。新項(xiàng)添加到隊(duì)列中從頭項(xiàng)開(kāi)始向尾項(xiàng)搜索的第一可使用的空項(xiàng)上。從該隊(duì)列的頭部去掉一些項(xiàng)并把所有有效的子項(xiàng)向上推一個(gè)位置。
圖9更詳細(xì)地示出分支預(yù)測(cè)機(jī)制命中邏輯190的操作。該圖示出由分支預(yù)測(cè)機(jī)制提供的分支預(yù)測(cè)項(xiàng)195。每個(gè)分支預(yù)測(cè)項(xiàng)具有一個(gè)分支地址、一個(gè)預(yù)測(cè)目標(biāo)地址和一個(gè)被預(yù)測(cè)分支歷史表征碼。回想在分支歷史隊(duì)列中構(gòu)建分支歷史表征碼并在完成時(shí)發(fā)送到分支預(yù)測(cè)機(jī)制。有效檢測(cè)邏輯191判定PBPQ的第一個(gè)位置是否有效。若第一個(gè)位置有效則向選擇邏輯192發(fā)送一個(gè)有效信號(hào),選擇邏輯192找到PBPQ中的第一個(gè)可用位置。此時(shí),更新PBPQ、保存分支預(yù)測(cè)項(xiàng)并把有效指示符146置成1。若PBPQ的第一個(gè)位置是無(wú)效的,則使能選擇邏輯194并在PBPQ的第一位置中在把有效位146置成1情況下保存分支預(yù)測(cè)信息。
指令取機(jī)制由PBPQ中找到的預(yù)測(cè)分支地址信息引導(dǎo)。取出指令塊組和放在指令緩沖器中,并且取出的每個(gè)新指令塊含有順序上跟著先前取出的塊的新指令組。典型地,每個(gè)塊在四字或雙四字(16或32字節(jié)界限)上裝定。但是,指定流中的分支造成指令順序取上的斷裂,從而必須由指令取機(jī)制檢測(cè)或預(yù)測(cè)。PBPQ提供必要信息,以沿著程序的順序路徑或者跨過(guò)程序中由分支造成的轉(zhuǎn)移來(lái)引導(dǎo)指令取控制。
通過(guò)比較指令取地址和PBPQ中含有的被預(yù)測(cè)分支地址,檢測(cè)指令流中的轉(zhuǎn)移。若找到匹配并且該分支預(yù)測(cè)為被取,則下個(gè)指令取地址將是在PBPQ中找到的被預(yù)測(cè)目標(biāo)地址。若未找到匹配或者該分支預(yù)測(cè)成不被取,則下個(gè)指令取將是順序上靠著前一次被取塊的下個(gè)指令塊。
若指令緩沖器隊(duì)列已滿,則指令取進(jìn)程必須等待,直至某存儲(chǔ)槽變?yōu)榭墒褂谩.?dāng)塊中的包含的所有指令都被譯碼后,存儲(chǔ)槽變?yōu)榭墒褂?。分支預(yù)測(cè)進(jìn)程,在PBPQ中無(wú)自由的存儲(chǔ)槽時(shí),必須等待。
當(dāng)分支被譯碼時(shí),存儲(chǔ)槽變成可使用。注意,當(dāng)執(zhí)行分支時(shí)執(zhí)行單元會(huì)檢查分支預(yù)測(cè)。預(yù)測(cè)信息將包含在譯碼器發(fā)送到執(zhí)行單元的譯碼信息中。若在執(zhí)行進(jìn)程中檢查出分支預(yù)測(cè)誤差,則廢棄跟隨該預(yù)測(cè)錯(cuò)的分支取得指令緩沖器的所有指令和PBPQ中的所有的項(xiàng)。
譯碼進(jìn)程從指令緩沖器取出指令并把它們發(fā)送到適當(dāng)?shù)膱?zhí)行單元。并行譯碼進(jìn)程還把所有的接觸指令和分支指令發(fā)送到待決分支預(yù)測(cè)機(jī)制以供處理?;貞浽趫D6中在和譯碼周期并行下,所有分支指令發(fā)送到分支譯碼邏輯,并且所有接觸指令發(fā)送到接觸指令譯碼邏輯。
圖10更詳細(xì)地示出待決分支預(yù)測(cè)機(jī)制內(nèi)的分支譯碼邏輯101的操作。每當(dāng)譯碼分支時(shí),把它的地址和PBPQ125中最老的分支地址進(jìn)行比較。PBPQ中的第一項(xiàng)將永遠(yuǎn)對(duì)應(yīng)于最老的項(xiàng)。選擇邏輯103確定該第一項(xiàng)是否有效。若該第一項(xiàng)有效,則使能門(mén)104和105,而若該第一項(xiàng)無(wú)效,則激勵(lì)門(mén)108。若使能門(mén)104和105,則把被譯碼的分支的地址和PBPQ125中最老的項(xiàng)的分支地址字段140比較。若出現(xiàn)匹配,則被預(yù)測(cè)的程序路徑準(zhǔn)確地遵循程序的實(shí)際路徑。通過(guò)路徑905向分支預(yù)測(cè)選擇邏輯116發(fā)送一個(gè)匹配信號(hào)。在其中檢查分支歷史表征碼144的第一個(gè)分支預(yù)測(cè)位,以確定該分支的方向是被取還是不被取。若該分支預(yù)測(cè)為被取,則把譯碼器的程序計(jì)數(shù)器置成該分支指令的預(yù)測(cè)目標(biāo)地址。若該分支預(yù)測(cè)為不被取,則把譯碼器的程序計(jì)數(shù)器置為該分支指令之后的地址。然后通過(guò)路徑975把該分支猜測(cè)信息發(fā)送到分支執(zhí)行單元300(圖5中示出)。這包括分支預(yù)測(cè)(取或不取)以及預(yù)測(cè)目標(biāo)地址。最后,利用邏輯124去掉PBPQ中的第一項(xiàng)并把所有其它項(xiàng)上推一個(gè)位置。這釋放PBPQ中的一個(gè)位置。接著把該自由位置標(biāo)志成無(wú)效。
回到地址比較邏輯106,若正被譯碼的分支的地址不和PBPQ中找到的被預(yù)測(cè)分支的地址匹配,則出現(xiàn)分支預(yù)測(cè)錯(cuò)誤。程序不遵循分支預(yù)測(cè)機(jī)制預(yù)測(cè)的路徑。當(dāng)此出現(xiàn)時(shí),利用分支預(yù)測(cè)出錯(cuò)邏輯107通過(guò)路徑906向PBPQ發(fā)送一個(gè)清除信號(hào)。另外,當(dāng)出現(xiàn)分支預(yù)測(cè)錯(cuò)誤時(shí),必須重新啟動(dòng)指令取邏輯。利用邏輯111和路徑970清除指令緩沖器并且從該剛譯碼分支之后的地址重新開(kāi)始取指令。
回到有效選擇邏輯103,若PBPQ的第一(最老)項(xiàng)是無(wú)效的,則分支預(yù)測(cè)機(jī)制尚未預(yù)測(cè)過(guò)分支。典型地,該事件出現(xiàn)于處理器正在第一次或者在現(xiàn)有分支信息老化離開(kāi)分支預(yù)測(cè)機(jī)制中的BHT后處理某程序時(shí)。當(dāng)此出現(xiàn)時(shí),分支預(yù)測(cè)機(jī)制沒(méi)有任何分支信息并且不能提供有關(guān)任何即將到來(lái)的分支的信息。然而,分支譯碼邏輯仍然必須向分支執(zhí)行邏輯提供分支預(yù)測(cè)信息和向譯碼器提供要繼續(xù)譯碼的下一條指令的地址。門(mén)108檢查某無(wú)效的PBPQ項(xiàng)并把條件代碼和分支地址信息送到選擇邏輯109。在其中確定該分支的條件代碼。若該分支是無(wú)條件分支(總是取),則利用邏輯112把譯碼器的程序計(jì)數(shù)器置為該分支的目標(biāo)地址。若該分支是有條件的,則假定不取該分支并且譯碼器將繼續(xù)譯碼該分支之后的指令。注意,出于簡(jiǎn)單,選擇該策略。很清楚,可以設(shè)計(jì)更精巧的策略以在PBPQ沒(méi)有任何預(yù)測(cè)信息時(shí)預(yù)測(cè)分支的方向。例如,可以在各個(gè)操作碼的基礎(chǔ)上確定條件代碼從而選擇不同的取/不取決策。最后,利用邏輯114和路徑975把分支預(yù)測(cè)信息發(fā)送到分支執(zhí)行單元。
譯碼器還對(duì)每個(gè)分支指令分配一個(gè)唯一的指令標(biāo)識(shí)符(IID)。該IID用于控制接觸執(zhí)行單元中每條接觸指令的執(zhí)行次序。例如,譯碼器中一個(gè)指定寄存器用于分配分支IID值。典型地,每當(dāng)譯碼一個(gè)分支時(shí),該寄存器遞增1。然后把分支IID置為等于該寄存器的值。
圖11示出接觸指令譯碼邏輯150的結(jié)構(gòu)和操作。回想圖6中,每當(dāng)譯碼接觸指令時(shí),就調(diào)用接觸指令譯碼邏輯。選擇邏輯151判定PBPQ的第一項(xiàng)是否有效。若它有效,則使能門(mén)152和154。這些門(mén)允許把正被譯碼的接觸指令的分支表征碼(通過(guò)路徑910發(fā)送)和PBPQ中的第一項(xiàng)的分支歷史表征碼(通過(guò)路徑912)傳送到表征碼比較邏輯156。
圖12示出一個(gè)概括表征碼比較邏輯156的表。分支歷史信息和該接觸指令的分支表征碼比較。即,接觸指令的分支表征碼的每個(gè)子字段和分支歷史表征碼的對(duì)應(yīng)位比較。若分支歷史表征碼的第n位為1(用于被取用的分支),則為了匹配,該接觸指令的分支表征碼的第n個(gè)子字段必須規(guī)定被取或“T”。類(lèi)似地,若分支歷史表征碼的第n位是0(用于不被取的分支),則為了匹配,分支歷史的第n個(gè)子字段必須規(guī)定不被取或“N”。然而,若接觸指令的分支表征碼的第n個(gè)子字段為用于不在意的“D”,則不論分支歷史字段的第n位是0或是1都出現(xiàn)匹配。然后對(duì)所有比較結(jié)果一起進(jìn)行“與”運(yùn)算以產(chǎn)生最終相等/不相等結(jié)果。對(duì)于代表“匹配”的最終結(jié)果,所有子字段比較結(jié)果都必須等于“匹配”。若任何子字段產(chǎn)生“不匹配”狀態(tài),則最終結(jié)果會(huì)是“不匹配”。只把那些帶有匹配分支表征碼的接觸指令發(fā)送到接觸指令執(zhí)行單元供執(zhí)行。
回到圖11,若表征碼比較邏輯確定分支表征碼不相等,則利用邏輯162廢棄該指令。然而,若表征碼是相等的,則利用邏輯160裝配一個(gè)接觸指令信息塊。把該接觸指令和接觸指令信息塊一起發(fā)送到接觸指令執(zhí)行單元。在那里執(zhí)行各個(gè)接觸指令。
圖13示出接觸指令信息塊170的格式。每條項(xiàng)具有下述字段。
分支表征碼171說(shuō)明在該接觸指令和該接觸指令預(yù)取的數(shù)據(jù)的引用之間出現(xiàn)多至N個(gè)分支的動(dòng)作的程序路徑。該信息包含在該接觸指令中并在圖4中說(shuō)明。
分支IID172在該接觸指令之前譯碼的分支指令的指令標(biāo)識(shí)符。該標(biāo)識(shí)符將用于對(duì)帶有緊靠著該分支之后的接觸指令的分支指令的執(zhí)行的排序。對(duì)每條譯碼的接觸指令分配最近譯碼的分支的IDD。
分支表征碼有效位(BMVB)173該位指示是否可以執(zhí)行該接觸指令。若該接觸指令的分支表征碼成功地和PBPQ中找到的分支歷史表征碼匹配,則把該位置成1。這表示可以執(zhí)行該接觸指令。若該位為零,則該分支表征碼不和(尚未和)某被預(yù)測(cè)分支的分支歷史表征碼匹配。接觸指令執(zhí)行單元只執(zhí)行那些帶著B(niǎo)MVB置為1的接觸指令。
執(zhí)行信息174為執(zhí)行指令所需的控制信號(hào)和信息。例如,對(duì)于指令執(zhí)行,需要接觸指令預(yù)取(接觸)項(xiàng)的地址。該值可能已經(jīng)通過(guò)列出指定寄存器、位移值和寄存器值,計(jì)算出或被規(guī)定。
利用邏輯160構(gòu)建接觸信息塊的分支表征碼171、分支IID172和執(zhí)行信息174。接著把該信息發(fā)送到接觸指令執(zhí)行單元。
回到有效選擇邏輯151,若PBPQ的第一項(xiàng)是無(wú)效的,則不存在和某接觸指令的分支表征碼進(jìn)行比較的有效分支歷史表征碼。當(dāng)此出現(xiàn)時(shí)利用邏輯161廢棄該接觸指令。
典型地,在譯碼接觸指令時(shí),分支預(yù)測(cè)機(jī)制會(huì)足夠遠(yuǎn)的在譯碼器的前面并且會(huì)已經(jīng)預(yù)測(cè)了下個(gè)即將到來(lái)的分支的結(jié)局。事實(shí)上很明顯分支預(yù)測(cè)機(jī)制可在譯碼器的前面保持對(duì)分支進(jìn)行的預(yù)測(cè)。即,通常分支預(yù)測(cè)機(jī)制在譯碼器的前面足夠遠(yuǎn)以在譯碼某分支時(shí)已對(duì)下個(gè)即將到來(lái)的分支作出預(yù)測(cè)。如上面所說(shuō)明,分支預(yù)測(cè)機(jī)制唯一一次未作出預(yù)測(cè)應(yīng)發(fā)生在處理器第一次執(zhí)行某程序時(shí)。當(dāng)出現(xiàn)該事件時(shí),本文所說(shuō)明的預(yù)取機(jī)制偏移到回避預(yù)測(cè)。只把那些它們的分支表征碼和分支預(yù)測(cè)機(jī)制的預(yù)測(cè)路徑匹配的接觸指令發(fā)送到執(zhí)行單元供執(zhí)行。
執(zhí)行進(jìn)程從執(zhí)行隊(duì)列取指令并予以執(zhí)行。當(dāng)執(zhí)行分支時(shí)檢驗(yàn)它的預(yù)測(cè)。分支執(zhí)行邏輯檢驗(yàn)分支預(yù)測(cè)。圖14示出分支執(zhí)行邏輯175的操作。該圖示出分支執(zhí)行單元向分支執(zhí)行邏輯回送下述信息分支猜測(cè),由分支譯碼邏輯做出的分支預(yù)測(cè)(取或不取)。
分支動(dòng)作,分支的實(shí)際動(dòng)作(取或不取)。
預(yù)測(cè)目標(biāo)地址,分支譯碼邏輯得出的預(yù)測(cè)目標(biāo)地址。
實(shí)際分支目標(biāo),分支的實(shí)際目標(biāo)地址。該地址在譯碼周期期間被計(jì)算。注意,典型地,譯碼器包括一個(gè)用于引用存儲(chǔ)器的指令的地址生成機(jī)制。
通過(guò)路徑950傳送該信息。利用分支動(dòng)作比較邏輯177比較分支猜測(cè)和分支實(shí)際方向,并且利用分支地址比較邏輯179比較預(yù)測(cè)分支地址和真實(shí)分支地址。分支動(dòng)作比較邏輯177具有三種輸出。若預(yù)測(cè)動(dòng)作和分支實(shí)際動(dòng)作都是不取,則在路徑925上發(fā)出信號(hào)并不需要?jiǎng)幼?邏輯180)。若預(yù)測(cè)動(dòng)作和實(shí)際動(dòng)作都是取(路徑929),則檢驗(yàn)分支地址比較邏輯179的結(jié)果。若分支預(yù)測(cè)地址不和分支實(shí)際地址匹配(路徑913),則激勵(lì)“與”檢測(cè)邏輯182并利用邏輯184清除PBPQ。另外,利用邏輯185和186通知指令取邏輯和譯碼器開(kāi)始跟隨該分支后的指令。若預(yù)測(cè)分支地址和實(shí)際分支地址相等,則使能路徑933并不需要?jiǎng)幼?邏輯188)。來(lái)自分支動(dòng)作比較邏輯的第三種輸出(路徑927)檢查預(yù)測(cè)分以方向何時(shí)不和實(shí)際分支方向匹配。這里該分支或者預(yù)測(cè)為取但執(zhí)行時(shí)為不取,或者預(yù)測(cè)為不取但實(shí)際上被取。當(dāng)發(fā)生此時(shí),預(yù)測(cè)是錯(cuò)誤的并且必須重新啟動(dòng)流水線。利用邏輯184清除PBPQ,并且利用邏輯185和186在跟隨該分支下重新啟動(dòng)指令取邏輯和譯碼器。
圖15示出接觸指令單元200的操作。若正確預(yù)測(cè)分支,則把該分支的IID發(fā)送到接觸指令執(zhí)行單元。該圖示出通過(guò)路徑995提供分支的IID。在接觸指令執(zhí)行隊(duì)列262中保持譯過(guò)碼的接觸指令。比較邏輯205檢查接觸指令隊(duì)列中保持的每條接觸指令的分支IID,并把它和由分支執(zhí)行單元提供的分支IID比較。把具有匹配的分支IID的接觸指令發(fā)送到選擇邏輯210。在其中檢查BMVB。若BMVB為1(有效),則利用邏輯215執(zhí)行該接觸指令。在執(zhí)行接觸指令時(shí)向高速緩存發(fā)送預(yù)取請(qǐng)求。若預(yù)取請(qǐng)求所標(biāo)識(shí)的高速緩存行不在高速緩存中(高速緩存未命中),則從存儲(chǔ)器取該行并放在高速緩存中。若BMVB為0(無(wú)效),則廢棄該指令。從而只執(zhí)行那些具有匹配的分支IID的,并且分支表征碼有效位為1的接觸指令。當(dāng)執(zhí)行該接觸指令時(shí)向高速緩存發(fā)送它的預(yù)取請(qǐng)求。
請(qǐng)注意,可對(duì)高速緩存10增加一個(gè)預(yù)取緩沖器。預(yù)取緩沖器保持那些作為預(yù)取請(qǐng)求(例如起源于接觸指令的請(qǐng)求)的結(jié)果而不是作為常規(guī)高速緩存未命中的結(jié)果而從存儲(chǔ)器傳送的存儲(chǔ)器行。注意,當(dāng)高速緩存設(shè)計(jì)提供預(yù)取時(shí),可能出現(xiàn)二種類(lèi)型的未命中預(yù)取未命中和請(qǐng)求(或常規(guī))未命中。預(yù)取未命中是產(chǎn)生高速緩存未命中的預(yù)取請(qǐng)求。在這種情況下,從存儲(chǔ)器回送的行發(fā)送到預(yù)取緩沖器并當(dāng)由處理器使用時(shí)傳送到高速緩存。另一方面,常規(guī)未命中(或請(qǐng)求未命中)是非高速緩存預(yù)取的高速緩存未命中。在這樣的情況下,未命中后回送的存儲(chǔ)器行直接發(fā)送到高速緩存而不寫(xiě)入預(yù)取緩沖器。請(qǐng)求未命中是常規(guī)指令取的結(jié)果,操作數(shù)請(qǐng)求來(lái)自譯碼器或地址生成機(jī)制并且從通用執(zhí)行單元向高速緩存發(fā)送存儲(chǔ)。
預(yù)取緩沖器在技術(shù)上是周知的。例如,IBM技術(shù)公開(kāi)蘭皮書(shū)論文“一種允許再裝入序列期間進(jìn)行指令高速緩存存取的方法”,1992年10月342期;“早預(yù)期緩沖器”,1992年3月卷34第106期第63-64頁(yè);“新語(yǔ)境位”,1987年7月第510頁(yè);它們說(shuō)明未命中或預(yù)取緩沖器,其中在把存儲(chǔ)器行裝入高速緩存之前先把它傳送到預(yù)取緩沖器中,這些論文都作為參考引用。
上面說(shuō)明的是一種用于預(yù)測(cè)由編譯程序或程序員放到程序中的預(yù)取指令的成功或失敗的機(jī)制。在處理器的譯碼周期期間發(fā)生預(yù)測(cè)。該機(jī)制是一種優(yōu)選預(yù)測(cè)機(jī)制,但它并不表示替代方法效率會(huì)較差。下面給出替代的設(shè)計(jì)。
分支預(yù)測(cè)機(jī)制發(fā)送的分支歷史表征碼不必必須表示該被預(yù)測(cè)分支后面的各分支的確切的取和不取的方式。例如,分支預(yù)測(cè)機(jī)制可以從BHT中用于各分支的歷史位的集合導(dǎo)出分支歷史表征碼。然后可以利用各個(gè)分支的動(dòng)作的集合歷史構(gòu)建分支歷史表征碼。
在一種備擇實(shí)施例中,可動(dòng)態(tài)地從PBPQ上已存在的預(yù)測(cè)過(guò)的分支構(gòu)建分支歷史表征碼。例如,若譯碼某接觸指令時(shí)PBPQ上存在四個(gè)預(yù)測(cè)過(guò)的分支,則可以動(dòng)態(tài)地構(gòu)建分支歷史表征碼并設(shè)置成等于它們各自的取/不取預(yù)取序列。若接觸指令中規(guī)定的分支表征碼長(zhǎng)于動(dòng)態(tài)構(gòu)建的分支歷史表征碼,則可對(duì)該分支歷史表征碼加上若干不在意狀態(tài)。
在研究本文中公開(kāi)的本發(fā)明的說(shuō)明和實(shí)現(xiàn)中,本發(fā)明的其它實(shí)施例對(duì)業(yè)內(nèi)人士是明顯的。所考慮到的說(shuō)明以及各例子的用意只是示例性的,且本發(fā)明的確切范圍由權(quán)利要求書(shū)指明。
權(quán)利要求
1.在一個(gè)包含一個(gè)邏輯上置于存儲(chǔ)器和至少一個(gè)處理器單元之間的高速緩沖器的系統(tǒng)中,一種用于執(zhí)行存儲(chǔ)在該存儲(chǔ)器中的指令流的方法,其中該指令流由其中包括至少一個(gè)把信息從該存儲(chǔ)器預(yù)取到該高速緩沖器的預(yù)取指令的一系列指令組成,該方法包括步驟生成第一路徑數(shù)據(jù),其中該第一路徑數(shù)據(jù)表示從該預(yù)取指令到某使用由該預(yù)取指令預(yù)取的信息的指令的第一路徑;生成第二路徑數(shù)據(jù),其中該第二路徑數(shù)據(jù)表示執(zhí)行的預(yù)測(cè)第二路徑;根據(jù)把第一路徑與第二路徑進(jìn)行比較以確定第一路徑是否符合預(yù)測(cè)的第二路徑的比較操作,有條件地執(zhí)行該預(yù)取指令。
2.權(quán)利要求1的方法,其中從進(jìn)行靜態(tài)編譯的編譯程序得出第一路徑數(shù)據(jù)。
3.權(quán)利要求1的方法,其中從表征由該至少一個(gè)處理器單元?jiǎng)討B(tài)執(zhí)行該指令序列的信息得出第二路徑數(shù)據(jù)。
4.權(quán)利要求1的方法,其中一旦判定第一路徑符合預(yù)測(cè)的第二路徑就把該預(yù)取指令加到該指令流中供該至少一個(gè)的處理器單元執(zhí)行。
5.權(quán)利要求1的方法,還包括步驟一旦確定第一路徑不符合預(yù)測(cè)的第二路徑就從由該至少一個(gè)處理器單元執(zhí)行的指令流中去掉該預(yù)取指令。
6.權(quán)利要求1的方法,其中第二路徑數(shù)據(jù)關(guān)聯(lián)著一個(gè)或多個(gè)分支指令,并且其中第二路徑數(shù)據(jù)包括一個(gè)表示沿著各相關(guān)分支指令的預(yù)測(cè)執(zhí)行路線的表征碼。
7.權(quán)利要求6的方法,其中第一路徑數(shù)據(jù)包括一個(gè)表示從該預(yù)取指令到使用由該預(yù)取指令預(yù)取的信息的指令的執(zhí)行路徑的表征碼。
8.權(quán)利要求7的方法,其中第二路徑基于與分支指令相關(guān)聯(lián)的預(yù)測(cè)的累積。
9.權(quán)利要求8的方法,其中第二路徑數(shù)據(jù)是從基于指令流的以前執(zhí)行作出的預(yù)測(cè)得出的。
10.權(quán)利要求1的方法,其中預(yù)取指令包括一個(gè)標(biāo)識(shí)從存儲(chǔ)器預(yù)取到高速緩沖器的指令的字段。
11.權(quán)利要求1的方法,其中預(yù)取指令包括一個(gè)標(biāo)識(shí)從存儲(chǔ)器預(yù)取到高速緩沖器的數(shù)據(jù)的字段,其中該數(shù)據(jù)由該指令流中的至少一條指令操作。
12.在一個(gè)包括一個(gè)存儲(chǔ)由其中包括至少一條預(yù)取指令的指令序列組成的指令流的存儲(chǔ)器、一個(gè)執(zhí)行該指令序列的處理器單元以及一個(gè)邏輯上置于該存儲(chǔ)器和該至少一個(gè)處理器單元之間高速緩沖器的系統(tǒng)里,一種用于有條件地執(zhí)行該預(yù)取指令的設(shè)備包括用于生成第一路徑數(shù)據(jù)的譯碼器邏輯電路,其中該第一路徑數(shù)據(jù)表示從該預(yù)取指令到某使用由該預(yù)取指令預(yù)取的信息的指令的第一路徑;用于生成第二路徑數(shù)據(jù)的路徑預(yù)測(cè)邏輯電路,其中該第二路徑數(shù)據(jù)表示執(zhí)行的預(yù)測(cè)第二路徑;執(zhí)行邏輯電路,用于根據(jù)把第一路徑與第二路徑進(jìn)行比較以確定第一路徑是否符合預(yù)測(cè)的第二路徑的比較操作,有條件地執(zhí)行該預(yù)取指令。
13.權(quán)利要求12的設(shè)備,其中從進(jìn)行靜態(tài)編譯的編譯程序得出第一路徑數(shù)據(jù)。
14.權(quán)利要求12的設(shè)備,其中從表征由該至少一個(gè)處理器單元?jiǎng)討B(tài)執(zhí)行該指令序列的信息,得出第二路徑數(shù)據(jù)。
15.權(quán)利要求12的設(shè)備,其中一旦判定第一路徑符合預(yù)徑的第二路徑,該執(zhí)行邏輯電路就執(zhí)行該預(yù)取指令。
16.權(quán)利要求12的設(shè)備,其中一旦確定第一路徑不符合預(yù)測(cè)的第二路徑,該執(zhí)行邏輯電路就略去該預(yù)取指令的執(zhí)行。
17.權(quán)利要求12的設(shè)備,其中第二路徑數(shù)據(jù)關(guān)聯(lián)著一個(gè)或多個(gè)分支指令,并且其中第二路徑數(shù)據(jù)包括一個(gè)表示沿著各相關(guān)分支指令的預(yù)測(cè)執(zhí)行路線的表征碼。
18.權(quán)利要求17的設(shè)備,其中第一路徑數(shù)據(jù)包括一個(gè)表示從該預(yù)取指令到使用由該預(yù)取指令預(yù)取的信息的指令的執(zhí)行路徑的表征碼。
19.權(quán)利要求18的設(shè)備,還包括用于生成和分支指令相關(guān)聯(lián)的預(yù)測(cè)的分支預(yù)測(cè)邏輯電路,以及用于累積由該分支預(yù)測(cè)邏輯電路生成的預(yù)測(cè)的分支歷史隊(duì)列電路,其中由該路徑預(yù)測(cè)邏輯電路生成的第二路徑數(shù)據(jù)基于該分支歷史隊(duì)列電路中累積的各預(yù)測(cè)。
20.權(quán)利要求19的設(shè)備,其中各預(yù)測(cè)基于該指令流以前的執(zhí)行。
21.權(quán)利要求12的設(shè)備,其中預(yù)取指令包括一個(gè)標(biāo)識(shí)從存儲(chǔ)器預(yù)取到高速緩沖器的指令的字段。
22.權(quán)利要求12的設(shè)備,其中預(yù)取指令包括一個(gè)標(biāo)識(shí)從存儲(chǔ)器預(yù)取到高速緩沖器的數(shù)據(jù)的字段,其中該數(shù)據(jù)由該指令流中的至少一條指令操作。
全文摘要
說(shuō)明一種在指令譯碼周期期間預(yù)測(cè)預(yù)取指令的有用性的機(jī)制。預(yù)測(cè)為有用(預(yù)取有用數(shù)據(jù))的預(yù)取指令被發(fā)送到處理器的某執(zhí)行單元供執(zhí)行,并廢棄預(yù)測(cè)為無(wú)用的預(yù)取指令。利用包含在分支歷史機(jī)制中的分支預(yù)測(cè)表征碼,進(jìn)行關(guān)于預(yù)取指令的有用性的預(yù)測(cè)。把該表征碼和預(yù)取指令中包含的記錄著在該預(yù)取指令與數(shù)據(jù)的實(shí)際使用之間的分支路徑的信息進(jìn)行比較。利用該機(jī)制可預(yù)取指令和數(shù)據(jù)二者。
文檔編號(hào)G06F9/42GK1300006SQ0013528
公開(kāi)日2001年6月20日 申請(qǐng)日期2000年12月8日 優(yōu)先權(quán)日1999年12月10日
發(fā)明者托馬斯·R·普扎克, 艾倫·M.·哈特斯坦, 馬克·查尼, 丹尼爾·A·普雷納, 彼得·H.·奧登 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司