1

我正在编写一个 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;
}
4

1 回答 1

1

假设您有一组 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;
}
于 2012-02-04T13:40:55.320 回答