Я пишу программу кеширования на 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)