高速缓存模拟中的位移位

Bit Shifting in Cache Simulation

本文关键字:模拟 高速缓存      更新时间:2023-10-16

中索引位和标记位的计算公式是什么?
  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 */

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

所以,我认为你的问题的具体答案是"零",但那只是因为你问错了问题。

正确,所以一个给定大小X的缓存,直接映射,将简单地使用地址的下部[或其他部分]来形成缓存的索引。所以index是一个介于0和(chace-size-1)之间的值。换句话说,"地址模大小"。由于缓存的大小几乎总是2n,我们利用了这样一个事实,即这两个都可以使用简单的按位"and"和(size-1)来执行,而不是使用divide。

在你的代码中,每个缓存条目(cache-line)持有一个32字节的"BLOCK",所以地址应该被块大小划分(移动)。25 = 32。对于固定缓存行大小,此移位保持不变。由于示例代码中没有其他变化,我认为您误解了应该做什么。

在集合关联缓存中,有多组缓存行可以用于同一个索引。所以我们不是简单地取地址的下半部分作为索引,而是取地址下半部分的小数部分。那么index = address_of_block & (CACHE_SIZE-1)就变成了address_of_block & ((CACHE_SIZE-1) / ways。由于我们再次处理2n数字,我们可以使用旧的"移位而不是除"技巧- x / y,其中y是2n可以由x >> n完成。

所以,现在你只需要找出n是多少种方法。

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