我對如何在雙向關聯緩存上訪問數據感到困惑。訪問和更新具有相同標記和偏移位的雙向關聯緩存
例如,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)獲取數據?
同樣,當我需要用相同的索引和標記位更新緩存時,如何確定兩個數組中的哪些數據應該踢出?
我在想它與偏移位有關,但我不太清楚如何使用偏移位或它們在緩存數組中表示或映射到的位置。
我對於替換和訪問仍然有點困惑。假設我有一個空的緩存。首先,我嘗試訪問'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
@Sugihara:因爲索引和標籤匹配而命中。它訪問同一緩存行的不同部分。將緩存組織成行可以利用空間局部性,而不僅僅是時間局部性。 –