1

给定代码:

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字节,一开始缓存是空的

假设我有一个32字节大小的缓存,在直写、写入分配和 LRU 下,使用 2way 集关联方法,其中每个块都是8字节:

当我从内存中读取时,我每次从内存中获取多少字节?

是吗48

我很确定的是缓存有 4 个单元或行,每行有 8 个字节。这是正确的吗?

2way部分有点令人困惑,我认为每种方式都有4字节,对吧?如果我错了,请纠正我...

然后当我从内存中“取”一个块时,我只是不完全理解有多少字节!!?

提前致谢

罗恩

4

2 回答 2

3

缓存方式(也称为关联性)不会影响传输发生时传输的数据量;块大小块大小。

关联性只是衡量缓存中有多少个可能的位置可以存储来自内存的给定块。所以:

  • 对于直接映射缓存(关联性=1),内存地址xyz始终映射到相同的缓存位置。
  • 对于双向缓存,xyz可以映射到两个缓存位置中的任何一个。
  • 对于全关联缓存,xyz可以映射到缓存中的任何位置

我真的没有在这里说任何没有在例如维基百科上解释过的东西:http ://en.wikipedia.org/wiki/CPU_cache#Associativity 。

于 2012-04-12T17:04:51.050 回答
0

当 CPU 从不在高速缓存中的块中引用(加载或存储)一个字时,该块被请求到内存中。因此,使用提供的参数,每次缓存未命中都涉及从内存到缓存的 8 字节传输。

与术语相关,您的缓存有 4 个条目、容器或缓存行(32 字节/8 字节/块)。由于它是 2 路关联的,因此有 2 组 2 个条目。偶数地址的块映射到集合 0,而奇数地址的块映射到集合 1。

块地址是通过移动字地址 log2(block_size) 位(缓存中的 3 位)获得的。例如:

  • 地址 64 属于块 8
  • 地址 72 属于块 9
于 2013-04-09T21:04:22.440 回答