記憶體階層與快取

組相聯/集合關聯快取(set-associative cache)

回到寄物處,但現在每個票號對應的不是一個櫃子,而是一小排(比方說四個)櫃子,你的外套可放進其中任一個。找它只要查那四個(很快),但現在四個號碼相撞的人都能寄外套、沒人被拒。組相聯快取就是這個折衷:每個記憶體塊映射到一「組」,但在組內它可坐在好幾個路(way,槽)中的任一個,給了一些彈性,又不必付出到處搜尋的代價。

一個 n 路組相聯快取把快取分成若干組,每組裝 n 條列(即「路」)。位址照舊切成位移、索引、標籤,但現在索引挑的是一組、而非單一槽。查找時把位址的標籤和那組裡全部 n 個標籤平行比對;只要任一個對上有效的列,就是命中。因為一個區塊能住在它那組的 n 個位置之任一,你現在需要替換策略(常是 LRU 或其近似)來在未命中時選擇淘汰哪一路。直接映射就是 n=1 的情形;全相聯(區塊可放任何地方,整個快取是一大組)則是 n 等於總列數的情形。

相聯度是對付衝突未命中的主要武器:每組有好幾路,兩個映射到同一組的熱區塊就能共存、而非互相淘汰。但代價是實在的——平行比對 n 個標籤需要更多硬體、可能略微拉長命中時間,替換邏輯也增加複雜度。經典結論是邊際遞減:從直接映射到 2 路移除了大部分衝突未命中,2 路到 4 路移除其餘大半,超過 8 路後收穫通常很小。所以真實的 L1 快取常是 4 路或 8 路:相聯度足以馴服衝突,又不至於讓命中時間受損。

在 4 路組相聯快取裡,位址的索引選出一組;那裡的四個標籤被一次比對。在直接映射快取裡撞到同一槽的兩個陣列,現在能佔用同一組的兩個不同路、雙雙常駐——衝突未命中消失。

每個區塊映射到一組、組內有數路;平行標籤比對找到它,緩解衝突未命中。

更高的相聯度並非免費,且邊際遞減:1 路到 2 路到 4 路移除了大多數衝突未命中,但過了約 8 路後,多出的平行標籤比對增加命中時間與功耗、收穫卻很小。相聯度是取捨,不是「愈高一定愈好」的旋鈕。

又稱
n-way set-associative cache組相聯快取集合關聯快取