缓存未命中和缓存命中

JAN*_*JAN 1 c memory cpu-architecture cpu-cache

给出以下代码:

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];
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

假设:

  • int是4个字节

  • src数组从地址开始0,dst从地址开始64

  • 缓存的大小是32字节,一开始缓存是空的

  • 有一个L1缓存在直接映射下工作,使用直写,写分配

  • 块的大小是16个字节

我试图找出高速缓存未命中的缓存命中dstsrc.

问题 - 填写srcdst数组的表,它们在开头是空的:在运行之前

首先,我将介绍我的教授的解决方案:跑步后

这是我的解决方案,但在某个地方,我犯了一个错误:

假设我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
Run Code Online (Sandbox Code Playgroud)

第二次迭代:

src    dst 
1,2 ->2,1

2,2 ->2,2

3,2 ->2,3

4,2 ->2,4
Run Code Online (Sandbox Code Playgroud)

第三次迭代:

src    dst 
1,3 -> 3,1

2,3 -> 3,2

3,3 -> 3,3

4,3 -> 3,4
Run Code Online (Sandbox Code Playgroud)

第四次迭代:

src    dst 
1,4 -> 4,1

2,4 -> 4,2

3,4 -> 4,3

4,4 -> 4,4
Run Code Online (Sandbox Code Playgroud)

我不明白为什么在桌子上有HITS dst,我知道我错了,有人可以解释为什么上面的解决方案确实有HITS吗?

关心罗恩

Oli*_*rth 5

因为缓存通常被组织成行,每行大小为n个字节.当您访问特定的内存地址时,该地址以及周围的n-1个字节将被读入缓存.