如何计算标签的位大小,CPU缓存的索引字段?

时间:2011-11-21 16:26:48

标签: tags indexing bit-manipulation cpu-cache

我正在编写一个CPU缓存模拟器,它将以字节为单位的缓存,每个缓存行的长度以字节为单位,以及缓存中的集合/组

我写了大部分内容,但是我一直在努力工作几个小时就是弄清楚我需要向左/右移动多少位来提取标记索引给定地址的字段。

例如,如果地址 48 ,我需要确定标记和索引。

这是我提取标签的方法,但我很确定它是不正确的。

int extractTag(int address, int sets){

    int bits = exp2(sets); // number of bits to shift: 2^sets

    unsigned int tag;
    int tag = address >> (32 - bits);    

    return tag;
}

1 个答案:

答案 0 :(得分:1)

假设您有BLOCK_SIZE行的SETS组。地址可以拆分为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;
}