缓存模拟中的位移

时间:2013-05-02 10:55:55

标签: c++ caching memory simulation

中计算索引和标记位的公式是什么
  1. 直接映射缓存
  2. 关联缓存
  3. 设置关联缓存
  4. 我目前正在使用此公式进行直接映射:

    #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 */
    

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

1 个答案:

答案 0 :(得分:1)

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

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

在您的代码中,每个缓存条目(缓存行)都保持32字节的“BLOCK”,因此地址应按块大小分割(移位)。 2 5 = 32.对于恒定的缓存行大小,此移位保持不变。由于您的示例代码没有其他变化,我认为您误解了您应该做的事情。

在组关联缓存中,有多组缓存行可用于同一索引。因此,我们不是简单地将地址的下半部分作为索引,而是采用较低地址的SMALLER部分。因此,index = address_of_block & (CACHE_SIZE-1)应该变为address_of_block & ((CACHE_SIZE-1) / ways。由于我们再次处理2 n 数字,我们可以使用旧的“shift而不是divide”技巧 - x / y其中y是2 n 可以由x >> n完成。

所以,现在你只需要弄清楚n的用途。

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