【问题标题】:How to calculate the size in bits of tag, index field for a CPU cache?如何计算 CPU 缓存的标记位、索引字段的大小?
【发布时间】:2011-11-21 16:26:47
【问题描述】:

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

我已经写了大部分内容,但是几个小时以来我一直在苦苦挣扎的是要弄清楚我需要向左/向右移动多少位才能提取 标签index 给定地址的字段。

例如给定地址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;
}

【问题讨论】:

    标签: tags indexing bit-manipulation cpu-cache


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 2014-06-23
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2018-09-26
      • 2015-05-14
      • 2014-08-01
      • 1970-01-01
      相关资源
      最近更新 更多