快取位址分割與平均記憶體存取時間
輸入快取容量、快取行大小與相聯度,即可看出位址如何分割為標籤、索引與偏移,並以位元數和長條圖顯示。本計算器也會由命中時間、失誤率與失誤懲罰計算平均記憶體存取時間(AMAT),讓你了解快取組織方式如何影響效能。
計算結果
位址分割(左側為最高有效位元)
快取容量、快取行大小與相聯度請輸入 2 的冪次,且容量須能被「快取行大小 × 路數」整除。若偏移與索引的位元數合計超過位址寬度,也無法計算分割。
- 快取行數
- –
- 組數
- –
- 標籤
- –
- 索引
- –
- 偏移
- –
- 平均記憶體存取時間(AMAT)
- –
以圖表檢視
其他輸入維持目前的值,只讓選擇的輸入在目前值的 1/4 到 4 倍之間變化時的結果。紅點是目前的值。
將位址分成三個欄位
快取以稱為快取行(區塊)的單位保存主記憶體的資料。快取行數為容量 ÷ 快取行大小,組數為快取行數 ÷ 相聯度。從位址的低位元開始,偏移用來選擇快取行內的位元組,佔 log₂(快取行大小) 位元;索引用來選擇組,佔 log₂(組數) 位元;其餘的高位元則構成標籤。以預設值 32 位元、32 KB、64 B、8 路計算,共有 512 個快取行與 64 組,得到 6 位元偏移、6 位元索引,以及 32 − 6 − 6 = 20 位元的標籤。
改變相聯度會有什麼影響
在容量與快取行大小相同時,相聯度加倍會使組數減半,因此索引少 1 位元、標籤多 1 位元。1 路即為直接映射快取;將路數設為與快取行數相同(預設值下為 512)則成為只有 1 組、索引為 0 位元的全相聯快取。較高的相聯度可減少因位址集中在同一組而造成的衝突失誤,但必須平行比較更多標籤,會增加比較器面積、功耗與命中時間。
平均記憶體存取時間(AMAT)
比較快取時應看平均記憶體存取時間,而非只看失誤率。AMAT = 命中時間 + 失誤率 × 失誤懲罰,以預設值計算為 4 + 0.05 × 100 = 9 週期。由於失誤懲罰很大,即使失誤率只有 5%,平均值也會變成兩倍以上。若以更大或相聯度更高的快取降低失誤率,卻使命中時間增加,就不一定有利,因為每次存取都要付出命中時間。對於多層快取,請將 L1 的失誤懲罰替換為 L2 命中時間 + L2 失誤率 × L2 失誤懲罰。
設計上的運用與注意事項
較大的快取行能利用空間局部性降低失誤率,但每次失誤要搬移更多資料,使失誤懲罰增加,且快取行數減少也會增加衝突;目前多數 CPU 採用 64 B。L1 快取常採用虛擬索引、實體標籤(VIPT)設計,在 TLB 轉換位址的同時讀取組。若要讓索引與偏移落在頁內偏移的範圍內,容量會被限制為頁面大小 × 相聯度,例如 4 KB × 8 路 = 32 KB。標籤寬度也決定了標籤儲存區的大小。
練習記憶體階層題目
- A15位元
- B19位元
- C17位元
查看答案與解析
正確答案:C. 17位元
快取行大小64位元組 = 2⁶,所以偏移量(offset)為6位元。行數為 32 KB ÷ 64 B = 32768 ÷ 64 = 512 = 2⁹,在直接映射中行數就是組數,所以索引(index)為9位元。其餘為標籤,32 − 9 − 6 = 17位元。19位元是改為4路組相聯、索引減少2位元時的值,不適用於直接映射。
- A128
- B512
- C32
查看答案與解析
正確答案:A. 128
行數為 32 KB ÷ 64 B = 512。4路時每組可放入4條快取行,所以組數為 512 ÷ 4 = 128 = 2⁷,索引為7位元,標籤為 32 − 7 − 6 = 19位元。512就是行數本身,是直接映射時的組數。提高相聯度會使組數減少,相對地標籤的位元數增加,比較器也隨之增加。32是把快取行大小的64誤用路數去除所得的值。
- A8個週期
- B6個週期
- C152個週期
查看答案與解析
正確答案:A. 8個週期
平均記憶體存取時間 = 命中時間 + 未命中率 × 未命中代價 = 2 + 0.04 × 150 = 2 + 6 = 8個週期。命中時間在所有存取中都要花費,只有未命中時才額外加上未命中代價。6個週期是只計算未命中的部分而漏加命中時間的值。152個週期是一次未命中的存取所花費的時間,並非平均值。可見即使未命中率僅4%,平均也會變成4倍。
- A4
- B52
- C8
查看答案與解析
正確答案:C. 8
偏移量是 64 = 2⁶,為低位的6位元;索引是組數 64 = 2⁶,為其上的6位元。0x1234 = 4660 除以64,4660 ÷ 64 = 72 餘52,所以快取行編號為72。組編號是快取行編號除以組數的餘數,72 mod 64 = 8。52是除以64的餘數,是表示快取行內位置(偏移量)的值。4只是取出位址十六進位的最後一位數,與組無關。
常見問題
快取行 64 B、位址 32 位元、容量 32 KB 的直接映射快取,標籤有幾位元?
偏移為 log₂64 = 6 位元,32 KB ÷ 64 B = 512 個快取行,因此索引為 9 位元,標籤為 32 − 9 − 6 = 17 位元。若改為 8 路,組數減為 64,索引為 6 位元、標籤為 20 位元。
全相聯快取的索引有幾位元?
0 位元。由於只有 1 組,偏移以外的所有位元都是標籤,且標籤要與每一個快取行比較。在本計算器中將相聯度設為與快取行數相同即可確認。
將失誤率減半與將命中時間縮短 1 週期,哪個效果較大?
以預設值(命中時間 4 週期、失誤率 5%、失誤懲罰 100 週期)計算,失誤率降為 2.5% 時 AMAT 由 9 降至 6.5 週期,而命中時間改為 3 週期則為 8 週期,因此這裡失誤率的影響較大。若失誤懲罰較小,結論可能相反,請用 AMAT 公式比較。