85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
#include <iostream>
|
|
#include <math.h>
|
|
#include <iomanip>
|
|
#include "simulator.h"
|
|
|
|
int main(){
|
|
std::string temp;
|
|
int machineBits, cacheSize, waySize, blockSize;
|
|
short setSize;
|
|
short offsetSize, tagSize, indexSize;
|
|
|
|
std::cin >> temp >> temp >> machineBits;
|
|
std::cin >> temp >> temp >> cacheSize;
|
|
std::cin >> temp >> waySize;
|
|
std::cin >> temp >> temp >> blockSize;
|
|
|
|
setSize = cacheSize * 1024 / blockSize / waySize;
|
|
|
|
offsetSize = log2(blockSize);
|
|
indexSize = log2(setSize);
|
|
tagSize = machineBits - offsetSize - indexSize;
|
|
|
|
std::cout << "num_set: " << setSize << std::endl;
|
|
std::cout << "num_block_offset_bit: " << offsetSize << std::endl;
|
|
std::cout << "num_index_bit: " << indexSize << std::endl;
|
|
std::cout << "num_tag_bit: " << tagSize << std::endl << std::endl;
|
|
|
|
CacheSim::Simulator FIFOSim(machineBits, setSize, waySize, tagSize, 0);
|
|
CacheSim::Simulator LRUSim(machineBits, setSize, waySize, tagSize, 1);
|
|
|
|
std::string action, address;
|
|
bool status;
|
|
std::vector<std::pair<std::string, bool>> LRUResult, FIFOResult;
|
|
while(std::cin >> action >> address){
|
|
// std::cout << "action: "<< action << " address: " << address << std::endl;
|
|
status = FIFOSim.read(address);
|
|
FIFOResult.push_back(std::make_pair(address, status));
|
|
|
|
status = LRUSim.read(address);
|
|
LRUResult.push_back(std::make_pair(address, status));
|
|
// std::cout << std::endl << std::endl;
|
|
}
|
|
// FIFO
|
|
|
|
int allCount = 0, hitCount = 0;
|
|
|
|
std::cout << "FIFO Replace Policy:" << std::endl;
|
|
for(int i=0; i<FIFOResult.size(); i++){
|
|
std::cout << " " << std::setw(6) << std::setfill('0') << FIFOResult[i].first << "... ";
|
|
allCount++;
|
|
if(FIFOResult[i].second){
|
|
hitCount++;
|
|
std::cout << "HIT" << std::endl;
|
|
}else{
|
|
std::cout << "MISS" << std::endl;
|
|
}
|
|
}
|
|
std::cout << std::endl;
|
|
std::cout << " Hit rate: " << (double)hitCount/allCount*100 << "%" << std::endl;
|
|
std::cout << " Miss rate: " << 100 - (double)hitCount/allCount*100 << "%" << std::endl << std::endl;
|
|
|
|
|
|
|
|
// LRU
|
|
|
|
allCount = 0, hitCount = 0;
|
|
std::cout << "LRU Replace Policy:" << std::endl;
|
|
for(int i=0; i<LRUResult.size(); i++){
|
|
std::cout << " " << LRUResult[i].first << "... ";
|
|
allCount++;
|
|
if(LRUResult[i].second){
|
|
hitCount++;
|
|
std::cout << "HIT" << std::endl;
|
|
}else{
|
|
std::cout << "MISS" << std::endl;
|
|
}
|
|
}
|
|
|
|
std::cout << "num_total_access: " << setSize << std::endl;
|
|
|
|
std::cout << std::endl;
|
|
std::cout << " Hit rate: " << (double)hitCount/allCount*100 << "%" << std::endl;
|
|
std::cout << " Miss rate: " << 100 - (double)hitCount/allCount*100 << "%" << std::endl;
|
|
}
|