Реализация полностью ассоциативного кэша

Я не понимаю, почему мой код для полностью ассоциативного кеша не соответствует предоставленным мне файлам трассировки.

Параметры: каждая строка кэша — 32 байта, а общий размер кэша — 16 КБ.

Мои реализации для набора ассоциативных кэшей 2, 4, 8 и 16 работают отлично (с использованием политики замены, которая использовалась наименее недавно). Но для полной ассоциативности, которую также можно просто описать как набор ассоциативных чисел 32, это ОЧЕНЬ близко к файлу трассировки, но не совсем. Честно говоря, я не знаю, как отладить это, так как там огромное количество шагов (по крайней мере, так, как я это сделал).

Вот соответствующие части моего кода (извините за неэффективность)

//Fully Associative
    int **fullyAssoc;

    fullyAssoc = new int*[64]; //where fullyAssoc[0][index] is way 0, fullyAssoc[2][index] is way 1 etc..

    int **LRU32;
    LRU32 = new int*[32];

    for (int i = 0; i < 64; ++i){ //Initialize all entries in fullyAssoc to 0
            fullyAssoc[i] = new int[16 * CACHE_LINE / 32];
    }
    for (int i = 0; i < 16; i++){ //Initialize LRU array
            LRU32[0][i] = 0;
            LRU32[1][i] = 1;
            LRU32[2][i] = 2;
            LRU32[3][i] = 3;
            LRU32[4][i] = 4;
            LRU32[5][i] = 5;
            LRU32[6][i] = 6;
            LRU32[7][i] = 7;
            LRU32[8][i] = 8;
            LRU32[9][i] = 9;
            LRU32[10][i] = 10;
            LRU32[11][i] = 11;
            LRU32[12][i] = 12;
            LRU32[13][i] = 13;
            LRU32[14][i] = 14;
            LRU32[15][i] = 15;
            LRU32[16][i] = 16;
            LRU32[17][i] = 17;
            LRU32[18][i] = 18;
            LRU32[19][i] = 19;
            LRU32[20][i] = 20;
            LRU32[21][i] = 21;
            LRU32[22][i] = 22;
            LRU32[23][i] = 23;
            LRU32[24][i] = 24;
            LRU32[25][i] = 25;
            LRU32[26][i] = 26;
            LRU32[27][i] = 27;
            LRU32[28][i] = 28;
            LRU32[29][i] = 29;
            LRU32[30][i] = 30;
            LRU32[31][i] = 31;
    }
    int fullyAssocLRU = 0;
    int memCount = 0;

    while(getline(fileIn, line)){
            stringstream s(line);
            s >> instruction >> hex >> address;

            int indexFull;
            int tagFull;
            unsigned long long address, addressFull;
            address = address >> 5; //Byte offset
            addressFull = address;

            indexFull = addressFull % 16;
            tagFull = addressFull >> 4;

    if (assocCache(fullyAssoc, indexFull, 32, tagFull, LRU32) == 1){
                    fullyAssocLRU++;
    }

}

void LRU_update(int **lru, int index, int way, int ways){
    int temp = 0;
    int temp2[ways];
    int temp_index = 0;
    int i = 0;
    while(i < ways){
            if (lru[i][index] == way/2){
                    temp = lru[i][index];
                    i++;
                    continue;
            }
            else{
                    temp2[temp_index] = lru[i][index];
                    temp_index++;
            }
            i++;
    }
    for (int j = 0; j < ways - 1; j++){
            lru[j][index] = temp2[j];
    }
    lru[ways - 1][index] = temp;

}

bool assocCache(int **block, int index, int ways, int tag, int **lru){
    bool retVal = false;
    for(int i = 0; i < 2*ways; i = i + 2){
            if (block[i][index] == 0){
                    block[i][index] = 1;
                    block[i+1][index] = tag;
                    LRU_update(lru, index, i, ways);
                    return retVal;
            }
            else{
                    if (block[i+1][index] == tag){
                            retVal = true;
                            LRU_update(lru, index, i, ways);
                            return retVal;
                    }
                    else{
                            continue;
                    }
            }

    }
    int head = 2 * lru[0][index];
    block[head][index] = 1;
    block[head+1][index] = tag;
    LRU_update(lru, index, head, ways);

    return retVal;

}

Файлы трассировки должны быть:

837589,1122102; 932528,1122102; 972661,1122102; 1005547,1122102; //For direct mapped
993999,1122102; 999852,1122102; 999315,1122102; 1000092,1122102; //For set associative
1000500,1122102; //For fully associative (LRU)

Мой вывод:

837589,1122102; 932528,1122102; 972661,1122102; 1005547,1122102;
939999,1122102; 999852,1122102; 999315,1122102; 1000092,1122102; 
1000228,1122102; 

Как видите, для полностью ассоциативного результата всего 272 отклонения от правильного вывода. Почему он должен быть выключен при переключении с 16 каналов на 32 канала?


person Homerdough    schedule 29.11.2014    source источник


Ответы (1)


Ах, я ошибочно считаю, что полностью ассоциативный кеш для 32-строчного кеша размером 16 КБ имеет 32 способа, хотя на самом деле это 512 способов.

person Homerdough    schedule 29.11.2014
comment
Вы можете удалить вопрос… Кроме того, этот кеш является частью программы как таковой или это имитация схемы? Это больше похоже на вопрос о схемотехнике, который не по теме. - person Potatoswatter; 29.11.2014