Cache Index

在N路組相聯(lián)的cache結(jié)構(gòu)中,如何選擇一個(gè)組(set)是很有重要的一個(gè)問題,最常用的算法是bit selection,這是最簡(jiǎn)單的實(shí)現(xiàn)方式。


在這個(gè)圖中

Set (i) = f(r (i)) = Bit 12~6????即由第6~12位就可以確定它位于哪個(gè)組中。

雖然這是一種高效簡(jiǎn)介的實(shí)現(xiàn)方式,但其最大的問題在于不夠隨機(jī)。曾經(jīng)有人 (參考1)嘗試過使用pseudo-random算法來作為函數(shù)f() ,這種做法實(shí)際上是不可取的,原因在于:第一,設(shè)計(jì)芯片時(shí),很難實(shí)現(xiàn)在短時(shí)間內(nèi)產(chǎn)生一個(gè)隨機(jī)數(shù),即便最常用的LFSR(Liner Feedback Shift Register)機(jī)制也會(huì)有一個(gè)節(jié)拍的延時(shí),而且還不是真正的隨機(jī)數(shù)。第二,由于程序的 空間局部性,他們會(huì)有規(guī)律地使用這些cache,隨機(jī)分配的結(jié)果反而會(huì)影響這種局部性。

實(shí)踐表明(來源2)使用XOR-Mapping機(jī)制的Hash算法在效果上和Pseudo-random,但是實(shí)現(xiàn)起來非常簡(jiǎn)單,只需要簡(jiǎn)單的XOR門電路即可,使用這種算法選擇cache 組時(shí),沖突比Bit selection少。這種算法在容量較大的LLC層使用比較多,在追求HIT time的L1 Cache中,多數(shù)CPU使用還是bit selection。

Bit Selection最大的問題在于選擇組時(shí),沖突很厲害,這使得操作系統(tǒng)在選擇物理內(nèi)存時(shí)需要關(guān)注這個(gè)沖突,因此也產(chǎn)生了和物理內(nèi)存分配相關(guān)的一系列Index感知的分配算法。

Linux使用分頁機(jī)制管理內(nèi)存,大部分情況下使用的都是4KB的頁,應(yīng)用程序需要使用內(nèi)存時(shí),Linux將從空閑的內(nèi)存池中選取一個(gè)未使用的物理頁分配給應(yīng)用程序,不同的分配算法會(huì)選取出不同的物理頁。

Bin Box

大部分情況下,操作系統(tǒng)以4K為單位分割內(nèi)存頁,如下圖所示,4K的邊界將Cache Line Index 分成兩部分,在Page frame 中的部分被稱為Bin index ,在Page offset中的部分被稱為Offset index。因此,內(nèi)存分配算法也相應(yīng)地分成兩種:Bin Index感知的和Offset Index 感知的分配算法。

Bin index優(yōu)化算法的實(shí)現(xiàn)要點(diǎn)是,不同的物理頁在使用cache時(shí),盡量均勻分配到不同的bin box中。如下圖所示,一個(gè)bin中通常含有若干組,每個(gè)組由若干個(gè)數(shù)據(jù)單元構(gòu)成,當(dāng)所有組中的所有數(shù)據(jù)單元都被占用時(shí),新分配的物理頁依然需要使用這個(gè)Bin box,便引發(fā)了cache沖突。也就是說,一個(gè)進(jìn)程使用的虛地址空間雖然連續(xù),但進(jìn)行虛實(shí)轉(zhuǎn)換之后,如果分配器沒有進(jìn)行優(yōu)化,"隨機(jī)"地選取物理頁以之對(duì)應(yīng),如果隨機(jī)函數(shù)選得不好,或者具有一定的規(guī)律性,那么就很容易出現(xiàn)本不應(yīng)該有的沖突。

BSD和Solaris上叫常用的Bin-Index優(yōu)化算法有 Page Coloring、Bin Hopping 、Best Bin和Hierarchical等,這幾種算法均有他自己的優(yōu)缺點(diǎn),Linux沒有使用并不代表它的性能低下。因?yàn)?從某種意義上說,不使用bin-index,也是一種bin-index算法"(參考1)


bin box

Virtual cache

程序每次訪問內(nèi)存都需要進(jìn)行虛實(shí)地址轉(zhuǎn)換,即使是容量小,結(jié)構(gòu)簡(jiǎn)單的cache也必須完成這個(gè)步驟。和miss相比,cache命中的頻度高得多,如果cache直接使用虛擬地址尋址,這樣就可以省去地址轉(zhuǎn)換的步驟,從而提高效率,這樣的cache稱為虛擬cache

幾種Bin-Index算法中,Page Coloring算法是最簡(jiǎn)單的一種,它主要利用了virtual cache不需要染色的原理,因?yàn)樵诙鄶?shù)情況下連續(xù)的virtual page和很少在cache中沖突,因此在分配物理頁時(shí),其低位可以直接使用虛擬地址的低位,從而避免了cache沖突。

使用虛擬cache的問題在于,進(jìn)程切換時(shí),新進(jìn)程的虛擬地址很可能和原進(jìn)程相同,但他們使用的是不同的物理地址,因此每次都需要需要清空Cache,這對(duì)于再切換回來進(jìn)程的影響是相對(duì)嚴(yán)重的,為了解決這個(gè)問題,分配算法往往選擇使用添加進(jìn)程PID一起Hash 或者XOR-Mapping。

Virtual Cache更多的是為了降低Hit time時(shí)使用,L1用得比較多,而L2或L3相對(duì)則用得很少。

Cache通道

現(xiàn)代處理器中,為了提高Cached數(shù)據(jù)帶寬,通常設(shè)置了多個(gè)選路(Way-select)部件以組成多通道cache結(jié)構(gòu),參考Opteron的數(shù)據(jù)Cache 【上圖】。CPU訪問cache時(shí),首先使用set Number訪問組,在兩路組相聯(lián)的結(jié)構(gòu)中,將有兩個(gè)組被選中,之后這些數(shù)據(jù)同時(shí)進(jìn)入選路部件,從兩個(gè)中選取一個(gè)。

多通道的cache中,AGU(Address generation unit)也必須具備產(chǎn)生多套地址的能力,分別抵達(dá)不同的Tag陣列。每多使用一個(gè)通道,就得額外復(fù)制一個(gè)tag陣列,同時(shí)也帶來了額外的同步開銷,通道越多,越容易產(chǎn)生bank沖突,這使得多通道的實(shí)現(xiàn)代價(jià)很大,大部分CPU只在L1使用的多通道,其他層依然是單通道結(jié)構(gòu)。

參考1:《Cache Memory》 Wang Qi, Yang xi等 [Mar. 2010]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容