2016-08-15 48 views
0

我對如何在雙向關聯緩存上訪問數據感到困惑。訪問和更新具有相同標記和偏移位的雙向關聯緩存

例如,C = ABS

C = 32KB 
A = 2 
B = 32bits 
S = 256 

offset = lg(B) = 5 
index = lg(S) = 8 
tag = 32 - offset - index = 19 

說我有,我有以下地址

tag     | index | offset 
1000 0000 0000 0000 000|0 0000 000|1 0000 
1000 0000 0000 0000 000|0 0000 000|0 0000 
1000 0000 0000 0000 000|0 0000 000|1 1010 

和我的緩存看起來像

index valid dirty tag  data   valid dirty tag  data 
0:  1  0  0x80... some data1  1  0  0x80... some data2 
1:   .          . 
2:   .          . 
3:   .          . 

如何確定的當索引和標籤位相同時,兩個緩存陣列I應該從(data1 vs data2)獲取數據?

同樣,當我需要用相同的索引和標記位更新緩存時,如何確定兩個數組中的哪些數據應該踢出?

我在想它與偏移位有關,但我不太清楚如何使用偏移位或它們在緩存數組中表示或映射到的位置。

回答

1

當索引和標記位相同時,如何確定兩個緩存陣列中的哪一個應從(data1 vs data2)中獲取數據?

你的緩存怎麼會進入這個狀態?具有相同索引和標籤的訪問將被命中,而不是分配第二個條目。

由於homonym or synonym problems caused by virtual indexing (or tagging)可能發生兩次(具有不同索引或標記)的高速緩存中相同的物理內存線,但在正確設計的高速緩存中這種情況是不可能的。


我怎麼確定哪些數據的兩個數組中我應該踢出來的時候我需要更新具有相同索引和標記位緩存?

在這種情況下,您不會驅逐;這是一個緩存命中。

索引選擇一組標籤。這2個標籤(在你的情況下)與地址的標籤位相匹配。如果一個匹配,這是一個打擊。如果沒有,這是一個小姐。


所以用相同的索引,但不同的標籤的訪問是當你需要退出的現有生產線之一。 The usual replacement policy is LRU。實現這一點的一種方法是讓集合中的位置顯着。每次訪問某行時,其標籤都會移至MRU位置。當必須從該組中驅逐一條線時,LRU位置被驅逐。這將是最近訪問過的行。

通常情況下,新添加的行進入MRU位置,但自適應地添加到LRU位置可以避免在循環巨陣時清除有價值的數據。請參閱this blog post about Intel IvyBridge's adaptive L3 replacement policy進行一些巧妙的實驗性測試,以調查硬件行爲和一些很好的解釋。


我想它有一個行內的偏移位

不,偏移位選擇字節做。打/小姐/替換不關心這一點。緩存訪問硬件使用偏移量和大小來選擇在找到右行之後要讀取或更新的字節範圍。

+0

我對於替換和訪問仍然有點困惑。假設我有一個空的緩存。首先,我嘗試訪問'1000 0000 0000 0000 000 0000 0000 | 1 0000',這是無效的,所以我在索引0處寫入cache-array1。然後嘗試訪問'1000 0000 0000 0000 000 | 0 0000 000 | 0 0000',根據你應該是一個命中,因爲標籤和索引是相同的,但我很困惑,因爲這兩個不同的地址訪問內存不同的數據。所以我應該寫入我的cache-array2?或者正確的行爲應該是什麼? – Sugihara

+0

@Sugihara:因爲索引和標籤匹配而命中。它訪問同一緩存行的不同部分。將緩存組織成行可以利用空間局部性,而不僅僅是時間局部性。 –