緩存存儲數據,通常是在如數據陣列SRAM,但也有開銷。我不特別喜歡術語「數據位大小」和「開銷位大小」,因爲(a)存在不是存儲位單元的開銷,並且(b)並非所有的位單元都是同樣昂貴的。但現在讓我們繼續討論這些條款。
我的看法是,「開銷位大小」大概是指需要存儲,以訪問緩存標記的位數。通常這些存儲在不同的數組中,即與數據數組分開的標記數組。比較數據位的數量。
這裏有三個簡單的例子:
考慮一個32 KIB(千字節)的高速緩存,64 B(字節)的高速緩存行。通常,我們會讓地址的0-5位爲緩存行偏移量。
32 KIB /(64 B /線)=> 2 ^(5 + 10)/ 2^6 => 2^9 => 512的高速緩存行。
--- ++例1:直接映射
讓我們想象一下,這是一個直接映射緩存。然後,我們可以將接下來的9位(地址的位6-14)作爲「索引」存入緩存行數組中。
到目前爲止這麼好。現在,爲了找出標籤,我們需要知道完整的地址寬度。我們假設它是64位(儘管大多數「64位」機器僅在2012年實現了40或48位)。爲了區分高速緩存行和映射到高速緩存中相同條目的其他高速緩存行,我們需要將地址的剩餘位(位15-63,49位)存儲爲標記。
訪問這樣一個直接映射的緩存然後通過提取索引,讀取帶有該索引的標籤和數據,將讀出的標籤與我們正在查找的地址的標籤進行比較,如果它們是聲明如果不匹配,那麼匹配和錯過,等等。開銷:每64B(512位)數據有49位標籤。
總計: *標記或「開銷」:512 * 49位 *數據位:512 * 512 = 32KiB = 256 Kib(千比特)。
--- ++示例2:8路組相聯
現在讓我們想象一下,緩存8路關聯。這意味着512行將被劃分爲512/8 = 64個集合,每行包含8行。
高速緩存行內的偏移量仍位0-5。
但是,我們現在只需要6位作爲索引來確定設置數量。位6-11。
標籤需要全部剩餘的位,位12-63,52位總數。
因此,8路聯合緩存的標籤開銷是512位數據的52位標籤。
總計: *標記:512個* 52比特* 數據:512 KIB
比較爲直接映射標記的49位。 8路組相關基本上將log2(8)個位移動到標籤中;一般而言,N路組相關移動將(log2(N))位移入標籤。
--- ++實施例3:全關聯
這是從直接映射頻譜的遠端。每個高速緩存行仍然有512位數據,但現在整個64位地址(除了6位偏移量)都是標記。完全關聯的58位標籤,8路的52位,直接映射的49位。
但記得我說過我不喜歡「頭頂位」這個詞?完全關聯的高速緩存中的標籤位通常必須不僅僅是普通的存儲位,而且還必須具有比較器 - 基本上是異或門。這種「CAM(內容可尋址存儲器)」位通常比普通位更昂貴。
--- +結論
所以,我覺得這是你的老師想要什麼:數據位與標記位的簡單比較。這是開銷的下限。
從直接映射到N路集關聯到完全關聯的頻譜提供了一個例子。但是緩存設計的其他方面會影響開銷。例如:
依此類推。
至於教程網站:
--- +爲什麼這對於程序員在stackoverflow?
這主要是一個硬件話題。
但是,程序員調整代碼需要理解像這樣的東西,以獲得最佳性能。
學習的最好方法是詢問方向而不是答案 – 2012-07-05 19:43:52