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