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 行の SETS グループがあるとします。アドレスは、オフセットに log2(BLOCK_SIZE) ビット、インデックスに log2(SETS) ビット、タグに残りを使用して、tag:index:offset に分割できます。

次のように 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 に答える