2012-04-09 168 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

相关问题