1
鑑於以下代碼:緩存未命中與高速緩存命中
typedef int array[4][4];
void transpose2(array dst, array src)
{
int i, j;
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
dst[i][j] = src[j][i];
}
}
}
假設:
int值4字節
src
陣列開始於地址0
,dst
開始於地址64
高速緩存的大小是
32
字節,在開始高速緩存爲空有一個L1高速緩存使用下直接映射工作寫通,寫分配
塊的大小爲16個字節
我想弄清楚的dst
和src
緩存失效&緩存命中。
的問題 - 填寫SRC和DST陣列,其中 他們在一開始是空的表格中:Before the run
首先,我將介紹我的教授的解決方案:After the run
這裏是我的解決方案,但什麼地方,我犯了一個錯誤:
假設我跑i
從1 to 4
,而不是從0 to 3
第一次迭代:
src dst
1,1-> 1,1
2,1-> 1,2
3,1-> 1,3
4,1-> 1,4
第二次迭代:
src dst
1,2 ->2,1
2,2 ->2,2
3,2 ->2,3
4,2 ->2,4
第三次迭代:
src dst
1,3 -> 3,1
2,3 -> 3,2
3,3 -> 3,3
4,3 -> 3,4
第四次迭代:
src dst
1,4 -> 4,1
2,4 -> 4,2
3,4 -> 4,3
4,4 -> 4,4
我不明白爲什麼在dst
, 的表格中有HITS,我知道我錯了,有人可以解釋爲什麼在上面的解決方案中確實存在HITS?
問候 羅恩
我還是看不出爲什麼這四個HITS確實屬於他們的索引,你能解釋一下嗎? – ron 2012-04-09 16:17:09
@ron:你在期待什麼? – 2012-04-09 16:21:25
非常簡單,從頭開始:11到11:這是一個錯過,因爲緩存是空的。現在緩存有11,12,13,14。接下來,21到12:緩存已經有12個,那麼這是一個HIT(理解!)。 Cache仍然只有11,12,13,14。接下來,31到13:緩存已經有13個,然後根據我的理解,這是一個HIT,但答案是MISS。爲什麼? – ron 2012-04-09 17:10:48