2012-04-09 167 views
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陣列開始於地址0dst開始於地址64

  • 高速緩存的大小是32字節,在開始高速緩存爲空

  • 有一個L1高速緩存使用下直接映射工作寫通,寫分配

  • 塊的大小爲16個字節

我想弄清楚的dstsrc緩存失效&緩存命中。

的問題 - 填寫SRCDST陣列,其中 他們在一開始是空的表格中:Before the run

首先,我將介紹我的教授的解決方案:After the run

這裏是我的解決方案,但什麼地方,我犯了一個錯誤:

假設我跑i1 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?

問候 羅恩

回答

5

因爲高速緩存通常被組織成線,各尺寸Ñ字節。當你訪問一個特定的內存地址時,該地址以及周圍的n-1字節被讀入高速緩存。

+0

我還是看不出爲什麼這四個HITS確實屬於他們的索引,你能解釋一下嗎? – ron 2012-04-09 16:17:09

+0

@ron:你在期待什麼? – 2012-04-09 16:21:25

+0

非常簡單,從頭開始: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

相關問題