一種緩存系統(tǒng)和方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī),通訊及集成電路領(lǐng)域。
【背景技術(shù)】
[0002]通常數(shù)據(jù)緩存的作用是將更低級(jí)存儲(chǔ)器中的部分?jǐn)?shù)據(jù)內(nèi)容復(fù)制在其中,使這些內(nèi)容能被更高級(jí)存儲(chǔ)器或處理器核快速存取,以保證流水線的持續(xù)運(yùn)行。當(dāng)前的高性能計(jì)算機(jī)/微處理器等多數(shù)使用獨(dú)立的數(shù)據(jù)緩存以避免指令與數(shù)據(jù)共用同一通道的馮?諾依曼瓶頸。隨著多指令發(fā)射技術(shù)的廣泛應(yīng)用,單數(shù)個(gè)的數(shù)據(jù)緩存也將更經(jīng)常地成為限制處理器功能提聞的瓶頸。
[0003]在現(xiàn)有技術(shù)中,數(shù)據(jù)緩存結(jié)構(gòu)由數(shù)據(jù)存儲(chǔ)器和標(biāo)簽存儲(chǔ)器構(gòu)成。數(shù)據(jù)存儲(chǔ)器和標(biāo)簽存儲(chǔ)器每行對(duì)應(yīng),數(shù)據(jù)存儲(chǔ)器重存儲(chǔ)數(shù)據(jù),標(biāo)簽存儲(chǔ)器中存儲(chǔ)數(shù)據(jù)地址的標(biāo)簽,即數(shù)據(jù)地址中的高位。現(xiàn)行數(shù)據(jù)緩存的尋址都基于以下方式,用地址中的索引段(index)尋址讀出標(biāo)簽存儲(chǔ)器中的標(biāo)簽與地址中的標(biāo)簽段進(jìn)行匹配;用地址中索引段與塊內(nèi)位移段共同尋址讀出緩存中的內(nèi)容。在現(xiàn)有技術(shù)中,存儲(chǔ)器相鄰存儲(chǔ)行對(duì)應(yīng)的的索引段尋址地址是連續(xù)的,而存儲(chǔ)在對(duì)應(yīng)的標(biāo)簽存儲(chǔ)器中的標(biāo)簽可以是不連續(xù)的。從編譯器的角度看,正在執(zhí)行的目標(biāo)程序在它自己的邏輯地址空間內(nèi)運(yùn)行,每個(gè)程序值在這個(gè)地址空間中有一個(gè)地址。一個(gè)目標(biāo)程序在邏輯地址空間的運(yùn)行時(shí)刻映像包含數(shù)據(jù)區(qū)和代碼區(qū)。數(shù)據(jù)區(qū)又包含靜態(tài)區(qū)、堆區(qū)、空閑內(nèi)存和棧區(qū)。棧區(qū)用來存放稱為活動(dòng)記錄的數(shù)據(jù)結(jié)構(gòu),這些活動(dòng)記錄在函數(shù)調(diào)用過程中生成。通常靜態(tài)區(qū)與堆區(qū)從地址空間的低區(qū)從底向頂生長(zhǎng),棧區(qū)從地址空間的高區(qū)從頂向底生長(zhǎng),兩者之間并不重疊,由空閑內(nèi)存分隔。
[0004]通常處理器內(nèi)的寄存器資源有限,過程調(diào)用時(shí)經(jīng)常需要將寄存器原有的內(nèi)容換出到存儲(chǔ)器。過程調(diào)用結(jié)束時(shí),調(diào)用者使用的任何寄存器都必須恢復(fù)到過程調(diào)用前所存儲(chǔ)的值。將原來?yè)Q出到存儲(chǔ)器的內(nèi)容寫回到寄存器。
[0005]在現(xiàn)有技術(shù)中,換出/寫回寄存器的最理想的數(shù)據(jù)結(jié)構(gòu)是棧。棧是一種后進(jìn)先出的隊(duì)列。棧需要一個(gè)指針指向棧中最新分配的地址,以指示下一個(gè)過程放置換出寄存器的位置,或是寄存器舊值的存放位置。將數(shù)據(jù)放入棧中稱為壓棧,從棧中移除數(shù)據(jù)稱為出棧。按照慣例,?!霸鲩L(zhǎng)”是按照地址從高到低的順序進(jìn)行的。這表明將值壓棧時(shí),棧指針值減?。欢党鰲r(shí),棧長(zhǎng)度縮短,棧指針增大;也就是說棧內(nèi)地址是連續(xù)的。
[0006]正是由于棧內(nèi)地址是連續(xù)的,而存儲(chǔ)在標(biāo)簽存儲(chǔ)器中的標(biāo)簽又是不連續(xù)的,所以這就給緩存的查找和替換帶來很大的困擾,已成為是制約現(xiàn)代處理器性能提升的最嚴(yán)重瓶頸。
[0007]本發(fā)明提出的方法與系統(tǒng)裝置能直接解決上述或其他的一個(gè)或多個(gè)困難。
【發(fā)明內(nèi)容】
[0008]本發(fā)明提出了一種將數(shù)據(jù)地址空間細(xì)分的方法,使得可以由復(fù)數(shù)個(gè)同一層次的數(shù)據(jù)緩存并行向處理器提供數(shù)據(jù)以緩解數(shù)據(jù)訪問瓶頸。其特征在于將緩存分為棧緩存,用于存儲(chǔ)程序運(yùn)行時(shí)存儲(chǔ)在棧區(qū)域中的數(shù)據(jù);非棧緩存,用于存儲(chǔ)程序運(yùn)行時(shí)的其他數(shù)據(jù);當(dāng)處理器核執(zhí)行的數(shù)據(jù)訪問指令對(duì)應(yīng)的數(shù)據(jù)位于棧區(qū)域中時(shí),直接訪問棧緩存。
[0009]可選的,在所述方法中,根據(jù)所述數(shù)據(jù)訪問指令數(shù)據(jù)地址判斷對(duì)應(yīng)的數(shù)據(jù)位于棧區(qū)域中,還是位于非棧區(qū)域中;或根據(jù)所述數(shù)據(jù)訪問指令中的基地址寄存器號(hào)判斷對(duì)應(yīng)的數(shù)據(jù)位于棧區(qū)域中,還是位于非棧區(qū)域中。
[0010]可選的,在所述方法中,大于或等于棧寄存器值的數(shù)據(jù)地址位于棧區(qū)域中。
[0011]可選的,在所述方法中,用棧緩存中地址連續(xù)的存儲(chǔ)空間存儲(chǔ)棧區(qū)域中數(shù)據(jù)地址連續(xù)的數(shù)據(jù)。
[0012]可選的,在所述方法中,用循環(huán)緩沖實(shí)現(xiàn)所述棧緩存。
[0013]可選的,在所述方法中,還包括:棧頂指針,指向所述棧緩存中位于棧頂位置的數(shù)據(jù);棧底指針,所述棧底指針與所述棧頂指針保持一定距離,且兩者之間的數(shù)據(jù)就是存儲(chǔ)在所述棧緩存中的有效數(shù)據(jù)。
[0014]可選的,在所述方法中,當(dāng)棧頂值改變時(shí),通過對(duì)原棧頂值和新棧頂值相減,判斷出棧頂指針移動(dòng)方向。
[0015]可選的,在所述方法中,由多個(gè)所述棧緩存結(jié)構(gòu)組成多層的棧緩存;其中:最高層次的棧緩存的棧頂指針值由處理器核產(chǎn)生的棧頂值決定;其他層次的棧緩存的棧頂指針值由更高一層次的棧緩存的棧底指針值決定。
[0016]可選的,在所述方法中,各個(gè)層次的棧緩存中的循環(huán)緩沖共同組成一個(gè)大的循環(huán)緩沖,所述循環(huán)緩沖跨越了不同的緩存層次。
[0017]可選的,在所述方法中,當(dāng)較高層次棧緩存已滿或接近滿時(shí),將其棧底指針指向的至少一個(gè)數(shù)據(jù)存儲(chǔ)到更低層次棧緩存中與其棧頂指針指位置相鄰的尚未存儲(chǔ)有效數(shù)據(jù)的存儲(chǔ)位置,并相應(yīng)移動(dòng)所述較高層次棧緩存的棧底指針及所述更低層次棧緩存的棧頂指針。
[0018]可選的,在所述方法中,當(dāng)較高層次棧緩存已空或接近空,且在更低層次棧緩存中有數(shù)據(jù)時(shí),將所述更低層次棧緩存中棧頂指針指向的至少一個(gè)數(shù)據(jù)取回存儲(chǔ)到所述較高層次棧緩存中棧底指針指向位置相鄰的尚未存儲(chǔ)有效數(shù)據(jù)的存儲(chǔ)位置,并相應(yīng)移動(dòng)所述較高層次棧緩存的棧底指針及所述更低層次棧緩存的棧頂指針。
[0019]可選的,在所述方法中,棧緩存中預(yù)留若干個(gè)存儲(chǔ)單元作為預(yù)留部分;新的數(shù)據(jù)可以被寫入棧緩存的預(yù)留部分,但必須保證預(yù)留部分大于等于預(yù)設(shè)的最小容量;所述最小容量值為零或正數(shù);若因新數(shù)據(jù)的寫入導(dǎo)致預(yù)留部分小于所述最小容量,則將其棧底指針指向的至少一個(gè)數(shù)據(jù)存儲(chǔ)到更低層次棧緩存中與其棧頂指針指位置相鄰的尚未存儲(chǔ)有效數(shù)據(jù)的存儲(chǔ)位置,并相應(yīng)移動(dòng)所述棧緩存的棧底指針及所述更低層次棧緩存的棧頂指針。
[0020]可選的,在所述方法中,當(dāng)支持多個(gè)線程同時(shí)運(yùn)行時(shí),將所述預(yù)留部分對(duì)應(yīng)的存儲(chǔ)單元的號(hào)碼存儲(chǔ)在保留池中;若有新數(shù)據(jù)寫入,則由保留池分配一個(gè)存儲(chǔ)單元號(hào)碼供存儲(chǔ)數(shù)據(jù);若有數(shù)據(jù)被從棧中取出不再存儲(chǔ),則將對(duì)應(yīng)的存儲(chǔ)單元號(hào)碼送回保留池。
[0021]可選的,在所述方法中,當(dāng)正在進(jìn)行棧操作的一個(gè)線程的棧頂指針下移需要更多的存儲(chǔ)塊,而保留池中已沒有預(yù)留的存儲(chǔ)塊時(shí),控制其他線程移動(dòng)棧底指針釋放存儲(chǔ)塊以供所述線程棧頂指針使用。
[0022]可選的,在所述方法中,每個(gè)存儲(chǔ)單元或每組存儲(chǔ)單元有相應(yīng)的數(shù)據(jù)地址;將所有所述數(shù)據(jù)地址與處理器核送出的數(shù)據(jù)地址同時(shí)匹配,可以找到處理器核送出的數(shù)據(jù)地址對(duì)應(yīng)的一個(gè)存儲(chǔ)單元,或一組存儲(chǔ)單元并在該組存儲(chǔ)單元中找到相應(yīng)的存儲(chǔ)單元。
[0023]可選的,在所述方法中,記錄棧頂值以及棧頂值對(duì)應(yīng)的一個(gè)存儲(chǔ)單元或一組存儲(chǔ)單元的號(hào)碼;將處理器核送出的數(shù)據(jù)地址與所述棧頂值相減,得到所述數(shù)據(jù)地址與棧頂值之間的差值;根據(jù)所述差值按地址連續(xù)的順序從棧緩存中找到該數(shù)據(jù)地址對(duì)應(yīng)的一個(gè)存儲(chǔ)單元,或一組存儲(chǔ)單元并在該組存儲(chǔ)單元中找到相應(yīng)的存儲(chǔ)單元。
[0024]本發(fā)明還提出了一種緩存系統(tǒng),其特征在于包括棧緩存和非棧緩存;其中棧緩存只存儲(chǔ)程序運(yùn)行時(shí)存儲(chǔ)在棧區(qū)域中的數(shù)據(jù);當(dāng)處理器核執(zhí)行的數(shù)據(jù)訪問指令對(duì)應(yīng)的數(shù)據(jù)位于棧區(qū)域中時(shí),直接訪問棧緩存。
[0025]可選的,在所述系統(tǒng)中,所述棧緩存中地址連續(xù)的存儲(chǔ)單元存儲(chǔ)棧區(qū)域中數(shù)據(jù)地址連續(xù)的數(shù)據(jù)。
[0026]可選的,在所述系統(tǒng)中,所述棧緩存由循環(huán)緩沖構(gòu)成。
[0027]可選的,在所述系統(tǒng)中,所述棧緩存還包括一個(gè)棧頂寄存器,用于存儲(chǔ)所述棧緩存中棧頂值對(duì)應(yīng)的位置;可以根據(jù)所述棧頂寄存器值以及存儲(chǔ)在所述棧緩存中的有效數(shù)據(jù)量推算出棧底指針對(duì)應(yīng)的位置。
[0028]可選的,在所述系統(tǒng)中,還包括一個(gè)減法器,當(dāng)棧頂值改變時(shí),根據(jù)所述減法器對(duì)原棧頂值和新棧頂值相減得到的結(jié)果判斷棧頂指針移動(dòng)方向。
[0029]可選的,在所述系統(tǒng)中,由多個(gè)所述棧緩存組成多層次的棧緩存系統(tǒng);其中:最高層次的棧緩存的棧頂指針值由處理器核產(chǎn)生的棧頂值決定;其他層次的棧緩存的棧頂指針值由更高一層次的棧緩存的棧底指針值決定。
[0030]可選的,在所述系統(tǒng)中,當(dāng)較高層次棧緩存已滿或接近滿時(shí),將其棧底指針指向的至少一個(gè)數(shù)據(jù)存儲(chǔ)到更低層次棧緩存中與其棧頂指針指位置相鄰的尚未存儲(chǔ)有效數(shù)據(jù)的存儲(chǔ)位置,并相應(yīng)移動(dòng)所述較高層次棧緩存的棧底指針及所述更低層次棧緩存的棧頂指針。
[0031]可選的,在所述系統(tǒng)中,當(dāng)較高層次棧緩存已空或接近空,且在更低層次棧緩存中有數(shù)據(jù)時(shí),將所述更低層次棧緩存中棧頂指針指向的至少一個(gè)數(shù)據(jù)取回存儲(chǔ)到所述較高層次棧緩存中棧底指針指向位置相鄰的尚未存儲(chǔ)有效數(shù)據(jù)的存儲(chǔ)位置,并相應(yīng)移動(dòng)所述較高層次棧緩存的棧底指針及所述更低層次棧緩存的棧頂旨針。
[0032]可選的,在所述系統(tǒng)中,預(yù)留若干個(gè)存儲(chǔ)單元作為預(yù)留部分;新的數(shù)據(jù)可以被寫入棧緩存的預(yù)留部分,但必須保證預(yù)留部分大于等于預(yù)設(shè)的最小容量;所述最小容量值為零或正數(shù);若因新數(shù)據(jù)的寫入導(dǎo)致預(yù)留部分小于所述最小容量,則將其棧底指針指向的至少一個(gè)數(shù)據(jù)存儲(chǔ)到更低層次棧緩存中與其棧頂指針指位置相鄰的尚未存儲(chǔ)有效數(shù)據(jù)的存儲(chǔ)單元,并相應(yīng)移動(dòng)所述棧緩存的棧底指針及所述更低層次棧緩存的棧頂指針。
[0033]可選的,在所述系統(tǒng)中,還包括一個(gè)保留池;當(dāng)支持多個(gè)線程同時(shí)運(yùn)行時(shí),將所述預(yù)留部分對(duì)應(yīng)的存儲(chǔ)單元的號(hào)碼存儲(chǔ)在保留池中;若有新數(shù)據(jù)寫入,則由保留池分配一個(gè)存儲(chǔ)單元號(hào)碼供存儲(chǔ)數(shù)據(jù);若有數(shù)據(jù)被從棧中取出不再存儲(chǔ),則將對(duì)應(yīng)的存儲(chǔ)單元號(hào)碼送回保留池。
[0034]可選的,在所述系統(tǒng)中,每個(gè)存儲(chǔ)單元或每組存儲(chǔ)單元還包括:地址寄存器,用于存儲(chǔ)該存儲(chǔ)單元或該組存儲(chǔ)單元的數(shù)據(jù)地址;比較器,用于將所述地址寄存器中的數(shù)據(jù)地址與處理器核送出的數(shù)據(jù)地址進(jìn)行比較;通過所有比較器的同時(shí)匹配,可以找到處理器核送出的數(shù)據(jù)地址對(duì)應(yīng)的一個(gè)存儲(chǔ)單元,或一組存儲(chǔ)單元并在該組存儲(chǔ)單元中找到相應(yīng)的存儲(chǔ)單元。
[0035]可選的,在所述系統(tǒng)中,還包括:棧頂值寄存器,用于記錄棧頂值;棧頂指針寄存器,用于記錄棧頂值對(duì)應(yīng)的一個(gè)存儲(chǔ)單元或一組存儲(chǔ)單元的號(hào)碼;地址減法器,用于將處理器核送出的數(shù)據(jù)地址與所述棧頂值相減,得到所述數(shù)據(jù)地址與棧頂值之間的差值;根據(jù)所述差值按地址連續(xù)的順序從棧緩存中找到該數(shù)據(jù)地址對(duì)應(yīng)的一個(gè)存儲(chǔ)單元,或一組存儲(chǔ)單元并在該組存儲(chǔ)單元中找到相應(yīng)的存儲(chǔ)單元。
[0036]對(duì)于本領(lǐng)域?qū)I(yè)人士,還可以在本發(fā)明的說明、權(quán)利要求和附圖的啟發(fā)下,理解、領(lǐng)會(huì)本發(fā)明所包含其他方面內(nèi)容。
[0037]有益.效果
[0038]本發(fā)明所述的緩存系統(tǒng)和方法提供了獨(dú)立的棧緩存和非棧緩存,分別用于存放棧區(qū)域中和非棧區(qū)域中的數(shù)據(jù),增加了緩存的數(shù)據(jù)讀寫端口,提高了數(shù)據(jù)吞吐率,也能使進(jìn)行數(shù)據(jù)訪問時(shí)的功耗減少。
[0039]本發(fā)明所述的棧緩存采用循環(huán)緩沖,在處理器核執(zhí)行數(shù)據(jù)訪問指令前,提前在棧緩存中分配數(shù)據(jù)存儲(chǔ)單元,使得該數(shù)據(jù)訪問指令對(duì)應(yīng)的數(shù)據(jù)在棧緩存中一定命中。
[00