中计算索引和标记位的公式是什么
我目前正在使用此公式进行直接映射:
#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 */
请告诉我在关联和设置关联缓存中移位了多少位。
答案 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
的用途。
当然,弄清楚如何确定在替换缓存中的内容时使用哪种方法,但这肯定是一个完全不同的问题。