Размер тега блока кеша - PullRequest
       7

Размер тега блока кеша

0 голосов
/ 04 декабря 2018

Я пишу программу кеширования на C на Linux, используя gcc в качестве компилятора, и я по большей части закончил.Только несколько тестовых случаев идут не так (некоторые вещи из тысяч адресов, которые должны попасть, отсутствуют).Я указываю свойства кеша в командной строке.Я подозреваю, что ошибка в моем коде связана с тегом (если что-то не попадает, тогда их теги не совпадают, когда они должны быть).Итак, мой вопрос: правильно ли я вычисляю тег?

//setting sizes of bits
int offsetSize = log2(lineSize);
int indexSize = 0;
if (strcmp(associativity,"direct") == 0){//direct associativity
  indexSize = log2(numLines);
}else if (assocNum == numLines){//fully associative
  indexSize = 0;
}else{//set associative
  indexSize = log2(assocNum);
}

address = (int) strtol(readAddress,&eptr,16);
unsigned long long int mask = 0;

//get the offset Bits
mask = (1 << offsetSize) - 1;
offsetBits = address & mask;

//get the index bits
mask = (1 << (indexSize)) - 1;
mask = mask << offsetSize;
indexBits = (address & mask) >> offsetSize;

//get tag bits
tagBits = address >> (offsetSize+indexSize);

Используемые адреса, как правило, 48 бит, поэтому адрес и маска переменных имеют тип unsigned long long int.Я думаю, что проблема у меня заключается в том, что я беру все старшие биты адреса, когда я должен брать только маленький набор бит с большого адреса.

Например: у меня есть 32строки кэша в ассоциативном кеше с 4 путями с размером блока 4.

offsetSize = log2 (4) = 2

indexSize = log2 (4) = 2

Мой код в настоящее время принимает верхние биты адреса независимо от размера адреса, минус последние 4 бита.Должен ли я взять только верхние 28 бит?(tagSize = (8 * 4) -3-2)

1 Ответ

0 голосов
/ 05 декабря 2018

Мой код в настоящее время принимает верхние биты адреса независимо от размера адреса, минус последние 4 бита.Должен ли я брать только верхние 28 бит?

Тег должен содержать все старшие биты, чтобы тег можно было использовать для определения, является ли он попаданием в кеш или нет.

Если адреса 48-битные и разделены на 3 поля, у вас будет 2-битное поле «смещение в строке кэша», 2-битное поле «index in cache» и 44-битное «верхнее»биты, которые должны храниться в поле «тег».Если вы храните только 28 битов в теге, то вы получаете попадания в кеш, когда вы должны получить пропуски в кеше (потому что запись в кеше содержит данные для другого адреса, где совпадало 28 бит).

Обратите внимание, что вы можете / должны думать о «ассоциативности» как о количестве наборов строк кэша, которые работают параллельно (где прямое сопоставление просто «ассоциативность = 1», а полностью ассоциативное просто «ассоциативность = total_cache_size / cache_line_size»)).Ассоциативность не оказывает прямого влияния на размер индекса (для размера индекса имеет значение только размер наборов строк кэша), и ваша проблема, вероятно, связана с indexSize = log2(assocNum); (что не имеет смысла).

Другими словами:

    if( direct_mapped ) {
        associativity = 1;
    } else {
        max_associativity = total_cache_size / cache_line_size;
        if( fully_associative || (associativity > max_associativity) ) {
            associativity = max_associativity;
        }
    }

    set_size = total_cache_size / associativity;
    number_of_lines_in_set = set_size / cache_line_size;

    offset_size = log2(cache_line_size);
    index_size = log2(number_of_lines_in_set);
    tag_size = address_size - index_size - offsetSize;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...