在一個共同的高速緩存地址我有三個領域:緩存設置和標籤
Tag | Set | Offset
的程序,以解決虛擬地址轉換成高速緩存條目應確定哪個組包含我們要搜索的數據,然後使用標籤(虛擬地址的一部分)爲多路緩存消除歧義(每組可能包含多個條目)
我的問題是:如何確定一個集合?誰向我們保證,通過僅使用虛擬地址的一部分作爲標籤,我們可以唯一確定兩個相似值之間的緩存命中?
在一個共同的高速緩存地址我有三個領域:緩存設置和標籤
Tag | Set | Offset
的程序,以解決虛擬地址轉換成高速緩存條目應確定哪個組包含我們要搜索的數據,然後使用標籤(虛擬地址的一部分)爲多路緩存消除歧義(每組可能包含多個條目)
我的問題是:如何確定一個集合?誰向我們保證,通過僅使用虛擬地址的一部分作爲標籤,我們可以唯一確定兩個相似值之間的緩存命中?
地址中的位被分爲3組:
tag | set index | Block offset
t bits | s bits | b bits
如果在緩存中塊的大小是B
字節,那麼你就需要b = (log2 B) bits
指定塊偏移。
如果高速緩存有S個集合,則s = (log2 S)
位用於集合索引。如果高速緩存完全關聯,則只有一個集合,即S = 1
和s = 0
,這意味着沒有位將用於集合索引。
其餘比特用於使用t = NUM_BITS - s - b
標籤可以計算t
這將保證任何地址可以被映射到相應的緩存行,只是在看高速緩存行的valid bit
,將確認是否我們有沒有在緩存中的地址。請注意,高速緩存行大小通常會大於字大小,以利用程序中空間數據局部性的增益。
當在緩存中沒有找到請求的地址時,我們需要計算將被帶入緩存的數據塊的起始地址。
範圍的大小始終等於緩存塊的大小。起始地址是通過清零地址的塊偏移位來計算的。結束地址是通過對地址的塊偏移位使用全部1s
來計算的。
根據高速緩存關聯性和驅逐方案(LRU
vs LFU
),決定並填充將存儲該新數據塊的集合內的行。