假设您有一组 BLOCK_SIZE 行。可以在 tag:index:offset 中拆分地址,其中 log2(BLOCK_SIZE) 位用于偏移,log2(SETS) 用于索引,其余用于标记。
您可以像这样计算 log2:
int ilog2 (int x)
{
int result = 0;
while (x != 0) {
result++;
x = x >> 1;
}
return result;
}
因此,您最终得到:
int extract_tag (int address, int sets, int block_size)
{
int offset_bits = ilog2(block_size);
int index_bits = ilog2(sets);
int tag = address >> (index_bits + offset_bits);
return tag;
}
int extract_index (int address, int sets, int block_size)
{
int offset_bits = ilog2(block_size);
int index_bits = ilog2(sets);
int index = (address >> offset_bits) & ((1 << index_bits) - 1);
return index;
}
int extract_offset (int address, int sets, int block_size)
{
int offset_bits = ilog2(block_size);
int offset = address & ((1 << offset_bits) - 1);
return offset;
}