【问题标题】:2way cache associative ? how many bytes do I read from memory?2路缓存关联?我从内存中读取多少字节?
【发布时间】:2012-04-12 17:01:49
【问题描述】:

给定代码:

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

假设我有一个大小为32 bytes 的缓存,在 write through、write allocate & LRU 下,使用 2way set associative 方法,其中每个块是8 bytes:

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

4 还是 8

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

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

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

提前致谢

罗恩

【问题讨论】:

  • 这是作业还是只是自学/好奇心? 32 字节缓存不存在。
  • @Mysticial:这不是作业,这是我下周考试前的练习。

标签: c caching memory memory-management


【解决方案1】:

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

关联性只是衡量缓存中可以存储给定内存块的可能位置的数量。所以:

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

我真的没有在这里说任何尚未解释的内容,例如维基百科:http://en.wikipedia.org/wiki/CPU_cache#Associativity.

【讨论】:

  • 那么你的意思是每次迭代,我占用 8 个字节?
  • @ron:这取决于有多少命中和未命中。将传输 8、16 或 24 个字节。
  • 缓存的每个单元格,有两种方式吗?每种方式都有4个字节?谢谢。
  • @ron:路数是缓存本身的属性,而不是每个块的属性。块不细分为方式。
  • 对不起,奥利,但我失去了你。我只是想描绘缓存的外观。正如我目前看到的那样,缓存有 4 个单元,每个单元有 8 个字节(因此总共 32 个字节),并且缓存的每个单元最多可以有两个位置,每个位置是 4 个字节。如果我错了,请纠正我。
【解决方案2】:

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

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

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

  • 地址 64 属于块 8
  • 地址 72 属于块 9

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多