2

索引和标签位的计算公式是什么

  1. 直接映射缓存
  2. 关联缓存
  3. 设置关联缓存

我目前正在使用此公式进行直接映射:

#define BLOCK_SHIFT 5;
#define CACHE_SIZE 4096;
int index = (address >> BLOCK_SHIFT) & (CACHE_SIZE-1);
/* in the line above we want the "middle bits" that say where the block goes */
long tag = address >> BLOCK_SHIFT; /* the high order bits are the tag */

请告诉我在关联和设置关联缓存中移动了多少位。

4

1 回答 1

1

所以,我认为你的问题的具体答案是“零”,但这仅仅是因为你问错了问题。

是的,因此直接映射的具有给定大小 X 的缓存将简单地使用地址的较低部分 [或其他一些部分] 来形成缓存中的索引。所以 index 是一个介于 0 和 (chace-size-1) 之间的值。换句话说,“地址取模大小”。由于缓存的大小几乎总是 2 n,我们利用了这样一个事实,即这两者都可以使用简单的按位“与”和 (size-1) 来执行,而不是使用除法。

在您的代码中,每个缓存条目(缓存行)都包含一个 32 字节的“块”,因此地址应该被块大小划分(移动)。2 5 = 32。对于恒定的高速缓存行大小,此移位保持恒定。由于您的示例代码没有其他变化,我认为您误解了您应该做什么。

在集合关联缓存中,有多组缓存行可用于同一个索引。因此,我们不是简单地将地址的较低部分作为索引,而是取较低地址的 SMALLER 部分。所以,index = address_of_block & (CACHE_SIZE-1)应该变成address_of_block & ((CACHE_SIZE-1) / ways. 由于我们再次处理 2 n数,我们可以使用旧的“移位而不是除法”技巧 -x / y其中y2 n可以通过x >> n.

所以,现在你只需要弄清楚n你的方法数量是多少。

当然,还要弄清楚在替换缓存中的内容时如何确定使用哪种方法,但这肯定是一个完全不同的问题。

于 2013-05-02T11:36:50.390 回答