專利名稱:減少軟件數(shù)據(jù)預(yù)取的開銷的機制的制作方法
發(fā)明
背景技術(shù):
領(lǐng)域本發(fā)明涉及預(yù)取數(shù)據(jù)的方法,并且具體來說,涉及在循環(huán)內(nèi)進(jìn)行預(yù)取的方法。
背景領(lǐng)域目前可獲得的處理器運行的時鐘速度比起與之關(guān)聯(lián)的存儲器運行的時鐘速度高很多。存儲器系統(tǒng)的功能是掩蔽存儲器與處理器之間的速度差別,并且持續(xù)為處理器的執(zhí)行資源提供數(shù)據(jù)。因此,存儲器系統(tǒng)通常除了主存儲器外還包括一個高速緩存的分層結(jié)構(gòu),例如L0、L1、L2….。利用大多數(shù)程序代碼顯示出來的空間和時間的局部性,這些高速緩存保存有處理器可能請求的數(shù)據(jù)。例如,因為程序試圖訪問鄰近的存儲單元(空間的局部性),則數(shù)據(jù)被加載到被稱為“高速緩存行”的分塊的高速緩存中。相似地,最近沒有被用過的數(shù)據(jù)被優(yōu)選地從高速緩存中趕出,因為當(dāng)數(shù)據(jù)最近被訪問過,那么該數(shù)據(jù)更有可能被訪問(時間的局部性)。
在高速緩存中存儲數(shù)據(jù)的優(yōu)點源自高速緩存相對小的尺寸和其所附帶的較高的存取速度。他們是能夠給處理器迅速提供數(shù)據(jù)的快速存儲器結(jié)構(gòu)。高速緩存的存儲容量通常從L0增大到L2等,以及下面分層結(jié)構(gòu)中的后繼高速緩存所需返回數(shù)據(jù)到處理器的時間也是如此。數(shù)據(jù)請求通過高速緩存結(jié)構(gòu)進(jìn)行傳播,它從最小的、最快的結(jié)構(gòu)開始,直到數(shù)據(jù)被定位或耗盡所有的高速緩存。在后一種情況時,從主存儲器返回被請求的數(shù)據(jù)。
盡管存儲器系統(tǒng)設(shè)計有進(jìn)步,但是某些類型的編程結(jié)構(gòu)仍然使其給處理器提供數(shù)據(jù)的能力經(jīng)受相當(dāng)?shù)目简?。例如,從循環(huán)訪問大量數(shù)據(jù)的代碼段可能迅速產(chǎn)生許多高速緩存未命中。每一個高速緩存未命中需要一個長執(zhí)行時間的訪問以便對來自較高層高速緩存或主存儲器的目標(biāo)數(shù)據(jù)進(jìn)行檢索。這些訪問可能會大大降低計算機系統(tǒng)的性能。
預(yù)取是一種眾所周知的用來掩蔽主存儲器向低層高速緩存(那些最接近處理器的執(zhí)行資源)移動數(shù)據(jù)相關(guān)聯(lián)的執(zhí)行時間的技術(shù)。在遠(yuǎn)遠(yuǎn)提前于選中的目標(biāo)所需時間之前發(fā)布一個預(yù)取指令。這使得該訪問與其它操作相重疊,把該訪問執(zhí)行時間隱藏在這些操作之后。但是,預(yù)取指令要以花費他們自己的潛在性能為代價。預(yù)取請求在處理器存儲器通道中增加了通信量,這會增大加載的執(zhí)行時間。對于那些在連續(xù)循環(huán)迭代期間從多個數(shù)組加載數(shù)據(jù)的循環(huán),這些問題會愈發(fā)嚴(yán)重。在執(zhí)行相應(yīng)的加載時,這樣的循環(huán)會定期發(fā)布預(yù)取請求以確保低層高速緩存可以獲得數(shù)組數(shù)據(jù)。如下所述,簡單地在每一個循環(huán)發(fā)布請求會產(chǎn)生不必要的,即冗余的存儲器數(shù)據(jù)量并且在相對短的時間間隔內(nèi)聚集(bunch)預(yù)取。
預(yù)取返回一行數(shù)據(jù),其中包括高速緩存的一個或多個被請求地址。每個高速緩存行通常包括充足的數(shù)據(jù)以提供給數(shù)組項進(jìn)行多循環(huán)迭代。作為結(jié)果,不必在每一次循環(huán)迭代時發(fā)布預(yù)取。另外,在短的時間間隔內(nèi)生成太多預(yù)取請求會降低系統(tǒng)性能。每個預(yù)取請求會消耗處理器存儲器通信通道中的帶寬,增加要求讀取以及使用該通道的其它操作的執(zhí)行時間。另外,在循環(huán)內(nèi)部對多數(shù)組進(jìn)行處理的情況下,給每一個數(shù)組提供預(yù)取操作。對這些預(yù)取的高速緩存未命中傾向同時發(fā)生,這些活動的群發(fā)進(jìn)一步加重了存儲器子系統(tǒng)的負(fù)擔(dān)。處理這些問題的一個方法是循環(huán)展開(loop unrolling)。
下面示出了一個循環(huán)實例的一部分。該循環(huán)在每個循環(huán)迭代時加載和處理來自5個數(shù)組A、B、C、D、和E的數(shù)據(jù)。
Orig_LooploadA(I)loadB(I)loadC(I)loadD(I)loadE(I)...
branch Orig_Loop
圖1表示根據(jù)其修改的以便采用預(yù)取的循環(huán)(I)。這里,假設(shè)每一個數(shù)組項是8字節(jié)并且每一個高速緩存行返回64字節(jié),在這種情況下,只需對一個數(shù)組每8次循環(huán)迭代發(fā)布一個預(yù)取。在圖1中這通過將循環(huán)(I)展開8次,以及通過利用連續(xù)的數(shù)組項的指令組對每個數(shù)組發(fā)布一個預(yù)取請求來完成。采用這種方式展開循環(huán),將循環(huán)的每一次迭代所消耗的數(shù)據(jù)量調(diào)整到等于由每個預(yù)取所提供的數(shù)據(jù)量,消除了冗余的預(yù)取。另一方面,循環(huán)展開可以顯著擴大程序在存儲器中的覆蓋區(qū)(footprint)(尺寸),并且它不能對被淹沒存儲器通道的預(yù)取活動的群發(fā)進(jìn)行尋址。
消除冗余預(yù)取的另一種方法是對預(yù)取進(jìn)行預(yù)測,計算連續(xù)迭代的預(yù)測值選通和關(guān)閉恰當(dāng)?shù)念A(yù)取。實施判定計算所必需的指令擴大了代碼容量并且,依賴于待定條件,可能會延緩循環(huán)。
本發(fā)明闡述這些和其它與從循環(huán)實施預(yù)取相關(guān)的問題。
發(fā)明概述本發(fā)明減少了開銷指令并且改進(jìn)了對軟件數(shù)據(jù)預(yù)取的調(diào)度。采用寄存器循環(huán)移位將預(yù)取分發(fā)到所選的循環(huán)迭代中,減少了在任意給定循環(huán)中發(fā)布的預(yù)取的數(shù)目。它對程序從循環(huán)中訪問大量數(shù)據(jù)的情況特別有用。
根據(jù)本發(fā)明,數(shù)據(jù)在循環(huán)中被由寄存器中的值進(jìn)行參數(shù)化的預(yù)取操作預(yù)取。通過將新值循環(huán)移位到寄存器中來調(diào)整被預(yù)取操作選中的數(shù)據(jù)。
對于一個本發(fā)明的實施例,對預(yù)取操作進(jìn)行參數(shù)化的寄存器是指示將要被預(yù)取的地址的循環(huán)移位寄存器。將一個新值循環(huán)移位到該寄存器中為隨后的循環(huán)迭代改變了預(yù)取目標(biāo)。對于本發(fā)明的另一個實施例,該寄存器是循環(huán)移位預(yù)測寄存器,該寄存器根據(jù)其存儲的當(dāng)前判定值激活或去激活預(yù)取操作。將一個新值循環(huán)移位到該寄存器中為下一次的循環(huán)迭代激活或去激活預(yù)取操作。
附圖簡述對本發(fā)明的理解可以參照以下附圖進(jìn)行,圖中采用相同的數(shù)字表示相同的部分。這些附圖是用來展示本發(fā)明所選的實施例而不是企圖限定本發(fā)明的范圍。
圖1表示已根據(jù)常規(guī)方法展開以實施從循環(huán)中預(yù)取的循環(huán)。
圖2是可以實施本發(fā)明的系統(tǒng)的實施例的方框圖。
圖3是根據(jù)本發(fā)明對從循環(huán)中預(yù)取進(jìn)行處理的的方法流程圖。
發(fā)明詳述以下討論給出了許多具體細(xì)節(jié)以便為本發(fā)明提供一個全面的了解。但是,那些從本公開中獲益的本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)注意到本發(fā)明可以不具備這些具體細(xì)節(jié)而進(jìn)行實施。另外,并沒有對許多眾所周知的方法、過程、部件、和電路進(jìn)行詳細(xì)描述以便將注意力集中在本發(fā)明的特點上。
本發(fā)明通過減少指令開銷和改進(jìn)軟件數(shù)據(jù)預(yù)取的調(diào)度支持有效的預(yù)取。它對在循環(huán)操作時實施數(shù)據(jù)預(yù)取特別有用。根據(jù)本發(fā)明的方法允許在由高速緩存行容量和所請求的數(shù)據(jù)容量確定的間隔的循環(huán)內(nèi)發(fā)布預(yù)取而不是由循環(huán)迭代間隔確定的間隔。它們這樣做不用擴大代碼量或在循環(huán)內(nèi)增加高代價的計算(指令開銷)。更確切地說,存儲在從一組循環(huán)移位寄存器中選定的寄存器的數(shù)值對循環(huán)內(nèi)的預(yù)取操作進(jìn)行參數(shù)化(parameterize)。通過在循環(huán)的每一次迭代時將一個新值循環(huán)移位到所選的寄存器中來對預(yù)取進(jìn)行調(diào)整。
對于一個實施例,寄存器值指示由預(yù)取操作選定的地址。在循環(huán)向多數(shù)組加載的地方,選定一個預(yù)取指令以便為循環(huán)的每一次迭代時的不同數(shù)組預(yù)取數(shù)據(jù)。循環(huán)移位寄存器的容量由循環(huán)中的數(shù)組的數(shù)目確定以便預(yù)取數(shù)據(jù)。根據(jù)將要預(yù)取的數(shù)組的數(shù)目、它們的數(shù)據(jù)項(跨距)和高速緩存行尺寸,可以對每一次循環(huán)迭代優(yōu)選采用多于一個預(yù)取指令。除了對每個數(shù)組控制預(yù)取頻率之外,對多數(shù)組預(yù)取指令的重用減小了存儲器中程序代碼的覆蓋區(qū)。
對于另一個實施例,寄存器是預(yù)測寄存器并且根據(jù)它所擁有的值來選通和關(guān)閉預(yù)取指令。如果循環(huán)包括了從中加載數(shù)據(jù)的單數(shù)組,那么通過對循環(huán)移位寄存器進(jìn)行適當(dāng)初始化可以為所選的循環(huán)迭代激活預(yù)取指令。這消除了在高速緩存行對多循環(huán)迭代返回充分?jǐn)?shù)據(jù)時可能會產(chǎn)生的冗余預(yù)取請求。如果循環(huán)包括多數(shù)組,那么多預(yù)取指令可以由相關(guān)聯(lián)的預(yù)測寄存器進(jìn)行參數(shù)化。寄存器循環(huán)移位確定為各次循環(huán)迭代的哪一個數(shù)組啟動了哪一個預(yù)取指令。
從本公開中獲益的本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)認(rèn)識到該示例性的實施例可以被修改和組合以適應(yīng)在具體的計算機系統(tǒng)中可獲得的資源和程序代碼的特征。
本發(fā)明可以在為寄存器循環(huán)移位提供支持的系統(tǒng)中被實施。為了討論的目的,寄存器循環(huán)移位是指實施寄存器重命名的方法。在寄存器循環(huán)移位中,存儲在特定的一組寄存器中的值在該組寄存器內(nèi)進(jìn)行循環(huán)移位。循環(huán)移位通常受指令進(jìn)行控制,如循環(huán)轉(zhuǎn)移指令。例如,當(dāng)循環(huán)轉(zhuǎn)移指令觸發(fā)循環(huán)的下一個迭代時,存儲在寄存器r(n)中的值在當(dāng)前循環(huán)迭代中被移位到寄存器r(n+1)中。例如,在加利福尼亞Santa Clara的Intel公司出版的IA-64應(yīng)用指令組結(jié)構(gòu)指南中對循環(huán)移位進(jìn)行了描述。更加詳細(xì)的描述可以在Rau,B.R.,Lee,M.,Tirumalai,P.,and Schlansker,M.S.Register的“軟件管道循環(huán)的分配”(Allocation For Software Pipelined Loops),SIGNPLAN’92編程語言設(shè)計和實現(xiàn)研討會論文集(proceedings of the SIGNPLAN’92Conference on programming Language Des ign and Implementation),(舊金山1992)中獲得。
可獲得的進(jìn)行循環(huán)移位的寄存器的數(shù)量和類型可以隨寄存器的類型的不同而發(fā)生變化。例如,Intel的IA-64指令組結(jié)構(gòu)(ISA)提供64種循環(huán)移位判定寄存器,96種循環(huán)移位浮點寄存器,和一些通用的循環(huán)移位寄存器。在IA-64 ISA中,128種通用寄存器中多達(dá)96種寄存器可以被定義為循環(huán)移位類型。循環(huán)移位通用寄存器被定義為8的倍數(shù)。
圖2是可以實施本發(fā)明的系統(tǒng)200的實施例的方框圖。系統(tǒng)200包括處理器202和通過系統(tǒng)總線280和存儲器總線284與系統(tǒng)邏輯290耦合的主存儲器270。系統(tǒng)200通常還包括圖形系統(tǒng)和也與系統(tǒng)邏輯290通訊的外設(shè)(沒有示出)。
公開的處理器202的實施例包括執(zhí)行資源210、第一高速緩存(L0)220、第二高速緩存(L1)230、第三高速緩存(L2)、高速緩存控制器250、和總線控制器260。處理器202通常還包括其它用來檢索和處理指令以及當(dāng)指令退役時更新其結(jié)構(gòu)狀態(tài)的邏輯元件(沒有示出)??偩€控制器260管理處理器202與主存儲器270之間的數(shù)據(jù)流。L2高速緩存240可位于不同于處理器202的芯片上,在這種情況下,總線控制器260也可以管理L2高速緩存240與處理器202之間的數(shù)據(jù)流。本發(fā)明不依賴于存儲器或處理器系統(tǒng)的詳細(xì)結(jié)構(gòu)。
L0高速緩存220、L1高速緩存230、L2高速緩存240、和主存儲器270構(gòu)成一個執(zhí)行資源210提供數(shù)據(jù)和指令的存儲器分層結(jié)構(gòu)。該指令在數(shù)據(jù)(操作數(shù))上操作,從寄存器堆214提供這些數(shù)據(jù)或者這些數(shù)據(jù)被旁路到來自存儲器分層結(jié)構(gòu)若干部分的執(zhí)行資源210。預(yù)測寄存器堆218可以有條件地用來執(zhí)行程序中所選的指令。操作數(shù)數(shù)據(jù)分別地通過加載和存儲操作被來回傳送。加載操作在特定的存儲器地址對存儲器分層結(jié)構(gòu)進(jìn)行數(shù)據(jù)搜尋,并且從發(fā)現(xiàn)被請求數(shù)據(jù)的分層結(jié)構(gòu)的第一層返回數(shù)據(jù)到寄存器堆214。存儲從寄存器堆214中的寄存器向存儲器分層結(jié)構(gòu)的一層或多層寫數(shù)據(jù)。
對于本發(fā)明,通過寄存器重命名單元216可以對寄存器堆214、218的部分進(jìn)行循環(huán)移位。當(dāng)執(zhí)行資源210實施一個根據(jù)本發(fā)明管理的預(yù)取的循環(huán)時,通過對寄存器的循環(huán)移位將預(yù)取操作導(dǎo)向存儲器270的數(shù)據(jù)區(qū)274中的不同位置。這些預(yù)取操作將數(shù)組數(shù)據(jù)移到一個或多個低層高速緩存220、230,此處,它們可以在到達(dá)相應(yīng)的循環(huán)迭代時被循環(huán)中的加載指令快速訪問。對數(shù)據(jù)的預(yù)取、加載、和處理指令在執(zhí)行期間通常存儲在存儲器270的指令區(qū)域278。它們可以從非易失性存儲器結(jié)構(gòu)(硬盤、軟盤、CD等)提供給主存儲器。
本發(fā)明的實施例通過特定的代碼段被展示出來并且具有如下的理解從本公開中獲益的本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)認(rèn)識到這些代碼段的各種變化處于本發(fā)明的精神實質(zhì)范圍內(nèi)。
通過以下的代碼段展示出本發(fā)明的一個實施例(II)r41=address of E(1+X)r42=address of D(1+X)r43=address of C(1+X)r44=address of B(1+X)r45=address of A(1+X)LoopPrefetch[r45]R40=r45+INCR…..
load A(J)load B(J)
load C(J)load D(J)load E(J)……..
J=J+1Branch LoopA、B、C、D、和E代表數(shù)組,它們的數(shù)組項被相應(yīng)的加載指令從代碼段(II)的循環(huán)部分內(nèi)訪問。當(dāng)適當(dāng)?shù)貙︻A(yù)取進(jìn)行同步時,可以在低層高速緩存中獲得被這些加載選中的數(shù)組項,并且能夠以低訪問執(zhí)行時間提供給處理器的執(zhí)行資源,例如,一個或二個循環(huán)周期。在代碼段(II)中,這通過選擇適當(dāng)?shù)闹到o地址偏差,X,和地址增量,INCR來完成。
在開放循環(huán)中,在該當(dāng)前循環(huán)迭代運行在數(shù)組項(J)上時,該預(yù)取選定數(shù)組項(J+X)。這里,X代表數(shù)組項的數(shù)目,由該數(shù)目選定的數(shù)組項跟隨該當(dāng)前的數(shù)組項。實際上,X表示當(dāng)執(zhí)行選定J+X的加載時確保元J+X必然在高速緩存中所必需的前置時間。X的值依賴于實施代碼段(II)的每一次迭代所需的周期數(shù)目,和從主存儲器返回數(shù)據(jù)的執(zhí)行時間。例如,如果代碼段(II)在10個時鐘周期內(nèi)完成了一次迭代并且用了100個時鐘周期從存儲器返回一個高速緩存行,那么該循環(huán)中的當(dāng)前迭代應(yīng)該選定的元超前該循環(huán)中的當(dāng)前迭代中的元至少10個項。
對于代碼段(II)的每一次迭代,預(yù)取指令選定r45中被指定的一個地址。這里,r45是指向物理寄存器中的值的虛擬寄存器標(biāo)示符。物理寄存器與虛擬寄存器標(biāo)示符之間的通信由寄存器重命名算法提供,在該情況下寄存器重命名算法是寄存器循環(huán)移位。對于代碼段(II),r41-r45被分別初始化到數(shù)組E-A中的數(shù)組項的地址。當(dāng)執(zhí)行循環(huán)轉(zhuǎn)移指令時,這些寄存器中的值在循環(huán)的每一次迭代被循環(huán)移位。寄存器循環(huán)移位對在代碼段(II)的每一次迭代時施加預(yù)取指令的數(shù)組進(jìn)行調(diào)整。這消除了分離各數(shù)組的預(yù)取指令的需要和與被轉(zhuǎn)移的預(yù)取相關(guān)聯(lián)的帶寬問題。它還允許調(diào)整對具體數(shù)組的發(fā)布預(yù)取的頻率以便反映出由預(yù)取返回的高速緩存行的容量和該數(shù)組的跨距。
賦值指令,r40=r45+INCR為其下一次預(yù)取遞增該數(shù)組的目標(biāo)地址并且將其返回到循環(huán)移位寄存器組中的起始寄存器中。在代碼段(II)中,該預(yù)取每5次迭代選定給定數(shù)組的一個數(shù)組項--該循環(huán)迭代數(shù)目是將遞增的數(shù)組地址從r40移回到r45所必需的。作為結(jié)果,預(yù)取在5次連續(xù)迭代時選定數(shù)組項A、B、C、D、和E,然后在第6次迭代從數(shù)組A開始重復(fù)該循環(huán)。
賦值指令中的遞增值依賴于以下參數(shù)在每次預(yù)取時返回的高速緩存行的容量(L);行讀取之間的迭代數(shù)目,即請求預(yù)取的數(shù)組的數(shù)目(N);以及數(shù)組項的尺寸(跨距)(M)。該高速緩存行容量被跨距除得到由單行讀取提供數(shù)據(jù)的迭代的數(shù)目。例如,高速緩存行是64字節(jié)(L=64),5個數(shù)組需要數(shù)據(jù)(N),以及每個數(shù)組項是8字節(jié)(M=8)INCR=N*L/M對于上述實例,INCR=5*64/8=40某些ISA,例如IA-64ISA,提供自動遞增的由指定值預(yù)取的地址的預(yù)取指令,例如預(yù)取[目標(biāo)地址]、地址遞增。對于這些ISA,預(yù)取和賦值指令可以由一個自動遞增prefetch指令和一個MOV指令代替。例如,循環(huán)(IIa)中的前二個指令可以由prefetch[r45]、40和movr40=r45代替。
表1示出了預(yù)取數(shù)組A的循環(huán)(II)的迭代、啟動預(yù)取時A的當(dāng)前數(shù)組項、將要被預(yù)取的數(shù)組項的地址、和被預(yù)取返回的數(shù)組的數(shù)組項。表中的條目適合X=20的情況。
代碼段(II)中被具體化的方法不產(chǎn)生冗余的預(yù)取。例如,在第10第25,第35和第50迭代啟動的預(yù)取選定與第5,第20,第30和第45迭代啟動的預(yù)取相同的高速緩存行。當(dāng)在高速緩存行中被返回的數(shù)組項的數(shù)目與預(yù)取之間的迭代數(shù)目不成比例關(guān)系時產(chǎn)生冗余的預(yù)取。但是該冗余水平比在每一次迭代都啟動預(yù)取得到的冗余水平要低得多。另外,處理器可以包括邏輯電路來確認(rèn)和消除冗余的預(yù)取。
本發(fā)明的另一個實施例由以下的代碼段示出(III)p41=truep42=falsep43=falsep44=falsep45=falsep46=falsep47=falsep48=falser4=address of A(1+X)r5=address of B(1+X)r6=address of C(1+X)r7=address of D(1+X)r8=address of E(1+X)(IIIa)Loop(p41)prefetch[r4],64(p42)prefetch[r5],64(p43)prefetch[r6],64(p44)prefetch[r7],64(p45)prefetch[r8],64
p40=p48loadA(J)loadB(J)loadC(J)loadD(J)loadE(J)...
J=J+1Branch Loop在進(jìn)入循環(huán)(IIIa)之前,對一組循環(huán)移位判定寄存器p41-p48進(jìn)行初始化使得至少一個判定代表邏輯真值。另外,將一組非循環(huán)移位寄存器r4-r8中的每一個寄存器為數(shù)組A-E中的一個數(shù)組初始化到一個預(yù)取地址。這里,X代表相對于該數(shù)組的第一地址的偏差。如前面實施例中,在執(zhí)行加載選定之前,它被選擇為返回到高速緩存的預(yù)取數(shù)據(jù)提供充足的時間。
循環(huán)(IIIa)包括一個針對每個數(shù)組的判定的預(yù)取指令。當(dāng)判定寄存器在連續(xù)循環(huán)迭代期間循環(huán)移位時,真判定值移到連續(xù)的判定寄存器。在每次迭代時,由當(dāng)前擁有真值的判定寄存器選通的預(yù)取指令被激活。其它預(yù)取指令被去激活(被預(yù)測關(guān)閉)。在寄存器組中的8個判定寄存器當(dāng)中,只有5個選通的預(yù)取指令。最后3個是虛指令它允許對數(shù)組的預(yù)取頻率與高速緩存行容量和數(shù)組跨距同步。對于該公開的實施例,利用將真判定值經(jīng)過8個循環(huán)移位寄存器進(jìn)行循環(huán)移位,每8次迭代激活一個預(yù)取。這使得預(yù)取(8)之間的迭代數(shù)目等于由高速緩存行(8)返回的數(shù)組項的數(shù)目,消除了冗余的預(yù)取。
對于該公開的實施例,被激活的預(yù)取指令在相應(yīng)的寄存器中自動以64字節(jié)遞增地址,例如,8個數(shù)組項。對于其它的實施例,如代碼段(II)中通過簡單的預(yù)取指令(不具備自動遞增能力的預(yù)取指令),和一個賦值指令(r4=r4+64)可以完成同樣的操作。
跟隨被判定的預(yù)取,賦值指令,p40=p48將判定寄存器組中的最后的判定寄存器中的值循環(huán)移回到可以通過該判定寄存器組重新開始循環(huán)的位置?;贗A-64ISA的代碼段(III)的實施例可以利用下面的比較指令實施賦值(p48)comp.eq.unc p40,p0=r0,r0.
該IA-64ISA還允許利用單一指令pr.rot=0×20000000000實施判定初始化,它將P41初始化到真,將其它判定寄存器初始化到假。
圖3是一幅根據(jù)本發(fā)明的執(zhí)行從循環(huán)中的軟件預(yù)取的方法300的流程圖。在進(jìn)入方法300中的循環(huán)部分之前,將一組循環(huán)移位寄存器初始化310。例如,如代碼段(II)所示,循環(huán)移位通用寄存器可以由數(shù)組的第一地址進(jìn)行初始化。另一種方法,如代碼段(III)所示,循環(huán)移位判定寄存器可以通過邏輯值真或者假進(jìn)行初始化,以激活所選的預(yù)取指令。在這種情況下,非循環(huán)移位通用寄存器被初始化到數(shù)組的第一預(yù)取地址。
初始化310之后,開始了方法300的循環(huán)的部分。為通過循環(huán)移位寄存器組指定的數(shù)組預(yù)取高速緩存行320。對于公開的實施例,這可以通過由一個或多個循環(huán)移位寄存器參數(shù)化的預(yù)取指令來完成。對于代碼段(II),目標(biāo)地址是該參數(shù)并且指明該目標(biāo)地址的通用寄存器對預(yù)取進(jìn)行參數(shù)化。對于代碼段(III),與預(yù)取指令相關(guān)的判定是參數(shù),并且擁有這些值的判定寄存器對它們的相關(guān)的預(yù)取進(jìn)行參數(shù)化。在每一種情況下,改變指定寄存器中的值也就改變了由預(yù)取操作選定的數(shù)組。跟隨預(yù)取320,進(jìn)行了預(yù)取的數(shù)組地址被調(diào)整指向包含將要為數(shù)組進(jìn)行預(yù)取的下一個組元的高速緩存行330。
在循環(huán)的每一次迭代期間,執(zhí)行循環(huán)本體中的任意指令,例如加載指令以及在被加載的值上操作的任意指令340。盡管它們在圖中顯示在預(yù)取320和調(diào)整330之后,但是它們在方法300中的順序并不重要。剩下的指令可以在預(yù)取和調(diào)整當(dāng)前數(shù)組地址之前、之后、或同時被執(zhí)行。在每一次循環(huán)迭代時,查驗終止條件350并且如果該條件被滿足則終止循環(huán)370。如果還有另外的迭代,則對寄存器進(jìn)行循環(huán)移位以便為下一次迭代更新預(yù)取指令360,并且重復(fù)該循環(huán)。根據(jù)所采用的計算機系統(tǒng),恰好滿足循環(huán)條件時,寄存器可以被循環(huán)移位。
所以通過減少冗余預(yù)取和在整個多循環(huán)迭代期間分配預(yù)取活動,本發(fā)明支持從循環(huán)中有效的預(yù)取。這不用擴大循環(huán)的代碼容量或者增加指令開銷就可以完成。對一組循環(huán)移位寄存器進(jìn)行初始化,并且利用一組循環(huán)移位寄存器對循環(huán)中的一個或多個預(yù)取指令進(jìn)行參數(shù)化。當(dāng)寄存器在循環(huán)的連續(xù)迭代期間進(jìn)行循環(huán)移位時,對預(yù)取指令的操作,例如,目標(biāo)地址、激活/NOP狀態(tài)進(jìn)行調(diào)整。本發(fā)明可以有益地應(yīng)用于從循環(huán)中實施預(yù)取指令的任何代碼中。
公開的實施例是用來展示本發(fā)明一般特點。從本公開中獲益的計算機軟件領(lǐng)域的技術(shù)人員應(yīng)當(dāng)認(rèn)識到對這些實施例的修改和改變沒有偏離本發(fā)明的構(gòu)思。本發(fā)明僅受所附權(quán)利要求的限制。
權(quán)利要求
1.一種用于預(yù)取數(shù)據(jù)的方法,包括對被指示數(shù)組的預(yù)取操作進(jìn)行初始化;為一個或者多個數(shù)組加載數(shù)據(jù),包括被指示的數(shù)組;以及執(zhí)行寄存器循環(huán)以指示新數(shù)組。
2.權(quán)利要求1的方法,其中對預(yù)取操作的初始化包括對由指定的循環(huán)寄存器指示的數(shù)組的預(yù)取操作進(jìn)行初始化。
3.權(quán)利要求2的方法,其中執(zhí)行寄存器循環(huán)包括在指定的循環(huán)寄存器中遞增一個值以指向一個被指示數(shù)組的新的數(shù)組項;并且將一個與新數(shù)組相關(guān)聯(lián)的地址循環(huán)到循環(huán)寄存器中。
4.權(quán)利要求1的方法,還包括對多循環(huán)寄存器初始化以指向所選的在進(jìn)入循環(huán)之前的對應(yīng)的多數(shù)組中的數(shù)組項。
5.權(quán)利要求1的方法,其中對預(yù)取操作的初始化包括對與被指示數(shù)組相關(guān)的預(yù)取操作的初始化。
6.權(quán)利要求5的方法,其中預(yù)取操作通過一個擁有特定邏輯值的循環(huán)預(yù)測寄存器與被指示的數(shù)組相關(guān)聯(lián)。
7.權(quán)利要求6的方法,其中執(zhí)行寄存器循環(huán)包括將特定的邏輯值循環(huán)到一個與新數(shù)組相關(guān)聯(lián)的預(yù)測寄存器中。
8.一種從多個數(shù)組預(yù)取數(shù)組項的方法,該方法包括為通過預(yù)取參數(shù)指定的數(shù)組的數(shù)組項發(fā)布預(yù)??;從多個數(shù)組中的每一個加載數(shù)據(jù);并且調(diào)整預(yù)取參數(shù)。
9.權(quán)利要求8的方法,其中該預(yù)取參數(shù)被存儲在一個選通與數(shù)組相關(guān)聯(lián)的預(yù)取的循環(huán)預(yù)測寄存器中,以及發(fā)布預(yù)取包括在該預(yù)測寄存器擁有一個特定邏輯值時發(fā)布預(yù)取。
10.權(quán)利要求9的方法,其中對預(yù)取參數(shù)的調(diào)整包括通過寄存器循環(huán)將邏輯值移到該預(yù)測寄存器中。
11.權(quán)利要求8的方法,其中該預(yù)取參數(shù)是一個存儲在指定循環(huán)寄存器中的數(shù)組地址,以及發(fā)布預(yù)取包括將該預(yù)取發(fā)布到由該地址指示的數(shù)組的數(shù)組項。
12.權(quán)利要求11的方法,其中調(diào)整該預(yù)取參數(shù)包括將與其它數(shù)組相關(guān)聯(lián)的地址循環(huán)到指定的循環(huán)寄存器中。
13.一種機器可讀介質(zhì),其上存儲可以被處理器執(zhí)行的指令以實施一種方法包括發(fā)布一個被寄存器參數(shù)化的預(yù)取操作;調(diào)節(jié)一個被預(yù)取操作選定的地址;并且將新值循環(huán)到該寄存器中。
14.一種計算機系統(tǒng),包括一個執(zhí)行指令的處理器;以及一個存儲了指令的存儲器,該指令可以被該處理器執(zhí)行以實施一種方法包括發(fā)布一個被寄存器參數(shù)化的預(yù)取操作;調(diào)整被該預(yù)取操作選定的地址;并且將新值循環(huán)到該寄存器中。
全文摘要
本發(fā)明提供了一種用以從循環(huán)內(nèi)有效地預(yù)取數(shù)組數(shù)據(jù)的機制。一組循環(huán)移位寄存器中的一個寄存器對預(yù)取指令進(jìn)行參數(shù)化。在每一次循環(huán)迭代時,根據(jù)該參數(shù)化的預(yù)取指令實施預(yù)取,并且對被該預(yù)取指令選中的地址進(jìn)行調(diào)整。針對每一次循環(huán)迭代都要對寄存器進(jìn)行循環(huán)移位,并且相應(yīng)地對由循環(huán)移位寄存器參數(shù)化的預(yù)取指令進(jìn)行調(diào)整。針對給定數(shù)組的預(yù)取之間的迭代數(shù)目由循環(huán)移位寄存器組中的組元數(shù)目確定。
文檔編號G06F9/32GK1353832SQ00808209
公開日2002年6月12日 申請日期2000年5月12日 優(yōu)先權(quán)日1999年5月28日
發(fā)明者G·B·多施, K·穆圖庫馬 申請人:英特爾公司