diff --git a/Makefile b/Makefile index f12ba0c..c53e19a 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CC = g++ all: sim sim: main.cpp block.cpp set.cpp simulator.cpp - $(CC) main.cpp block.cpp set.cpp simulator.cpp -o sim + $(CC) -std=c++11 main.cpp block.cpp set.cpp simulator.cpp -o sim clean: rm sim diff --git a/main.cpp b/main.cpp index 9a72087..e373753 100644 --- a/main.cpp +++ b/main.cpp @@ -1,9 +1,10 @@ #include #include +#include #include #include "simulator.h" -int main(){ +int main(int argc, char* argv[]){ std::string temp; int machineBits, cacheSize, waySize, blockSize; short setSize; @@ -23,62 +24,71 @@ int main(){ 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; + std::cout << "num_tag_bit: " << tagSize << std::endl; - CacheSim::Simulator FIFOSim(machineBits, setSize, waySize, tagSize, 0); - CacheSim::Simulator LRUSim(machineBits, setSize, waySize, tagSize, 1); + CacheSim::Simulator* Sim; + if(strcmp(argv[1], "FIFO") == 0){ + Sim = new CacheSim::Simulator(machineBits, setSize, waySize, tagSize, 0); + }else if(strcmp(argv[1], "LRU") == 0){ + Sim = new CacheSim::Simulator(machineBits, setSize, waySize, tagSize, 1); + }else{ + std::cout << "Usage: ./sim [ LRU | FIFO]" << std::endl; + return 0; + } std::string action, address; bool status; - std::vector> LRUResult, FIFOResult; + std::vector> Result; 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)); + tuple status = Sim->read(address); + Result.push_back( + std::make_tuple( + action, + address, + std::get<0>(status), + std::get<1>(status), + std::get<2>(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(Result[i])){ 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; + std::cout << "num_total_access: " << allCount << std::endl; + std::cout << "num_hit: " << hitCount << std::endl; + std::cout << "num_miss: " << allCount - hitCount << std::endl; + std::cout << "hit_rate: " << std::fixed << std::setprecision(2) << (double)hitCount/allCount*100 << "%" << std::endl; + std::cout << std::endl << "hit trace:" << std::endl << std::endl; + for(int i=0; i(Result[i])){ + std::cout << std::get<0>(Result[i]) << " " << std::get<1>(Result[i]); + std::cout << " hit "; + std::cout << "set: "; + if(std::get<3>(Result[i]) != 0) + std::cout << "0x" << std::hex << std::get<3>(Result[i]) << " "; + else + std::cout << "0 "; - // LRU - - allCount = 0, hitCount = 0; - std::cout << "LRU Replace Policy:" << std::endl; - for(int i=0; i(Result[i]) != 0) + std::cout << "0x" << std::hex << std::get<4>(Result[i]); + else + std::cout << "0"; + + if(i != Result.size()-1) + std::cout << 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; } diff --git a/set.cpp b/set.cpp index 3cb9aaa..146ac8a 100644 --- a/set.cpp +++ b/set.cpp @@ -18,7 +18,7 @@ Set::Set(short waySize, short tagSize, short replacePolicy){ } } -bool Set::read(vector tag, short offset){ +tuple Set::read(vector tag, short offset){ // HIT 的情況 short baseAccessTime; // 被替換掉的 block ,它的 access time for(int i=0; iwaySize; i++){ @@ -29,17 +29,19 @@ bool Set::read(vector tag, short offset){ this->countAccess(baseAccessTime); // 更新計算所有 way access 的時間點 // cout << "HIT: 在 " << i << " way 找到!" << endl; } - return true; + return std::make_tuple(true, i); } } // MISS 的情況,需要寫入 $ + short writeWay; if(this->emptySize > 0){ for(int i=0; iwaySize; i++){ if(this->blocks[i].getValid() == false){ // cout << "MISS: 在 " << i <<" way 寫入資料" << endl; this->blocks[i].update(tag); // 更新 tag this->blocks[i].access(); + writeWay = i; baseAccessTime = this->waySize; // 每個都要更新 break; } @@ -63,6 +65,7 @@ bool Set::read(vector tag, short offset){ baseAccessTime = this->blocks[maxIndex].getAccessTime(); this->blocks[maxIndex].update(tag); this->blocks[maxIndex].access(); + writeWay = maxIndex; // for(int i=0; iwaySize; i++){ // vector t = this->blocks[i].getTag(); @@ -74,7 +77,7 @@ bool Set::read(vector tag, short offset){ } this->countAccess(baseAccessTime); - return false; + return std::make_tuple(false, writeWay); } void Set::countAccess(short baseAccessTime){ diff --git a/set.h b/set.h index 0a7e6a3..0fd6b60 100644 --- a/set.h +++ b/set.h @@ -1,7 +1,9 @@ #include "block.h" #include +#include using std::vector; +using std::tuple; using CacheSim::Block; namespace CacheSim{ @@ -15,7 +17,7 @@ namespace CacheSim{ public: Set(short waySize, short tagSize, short replacePolicy); - bool read(vector tag, short offset); + tuple read(vector tag, short offset); void countAccess(short baseAccessTime); }; diff --git a/simulator.cpp b/simulator.cpp index a21f662..063a3cc 100644 --- a/simulator.cpp +++ b/simulator.cpp @@ -15,7 +15,7 @@ Simulator::Simulator(int machineBits, short setSize, short waySize, short tagSiz } } -bool Simulator::read(string address){ +tuple Simulator::read(string address){ vector addrBits = this->addressTranslate(address); // for(int i=0; igetValue(addrBits, "offset"); vector tag(addrBits.begin(), addrBits.begin()+this->tagSize); // std::cout<<"更新 index: "<sets[index].read(tag, offset); -} -bool Simulator::write(string address){ - return true; + tuple setResult = this->sets[index].read(tag, offset); + return std::make_tuple( + std::get<0>(setResult), + index, + std::get<1>(setResult) + ); } vector Simulator::addressTranslate(string address){ diff --git a/simulator.h b/simulator.h index 4889216..3f52618 100644 --- a/simulator.h +++ b/simulator.h @@ -1,9 +1,11 @@ #include "set.h" #include +#include #include #include using CacheSim::Set; using std::vector; +using std::tuple; using std::string; namespace CacheSim{ @@ -17,8 +19,7 @@ namespace CacheSim{ vector sets; public: Simulator(int machineBits, short setSize, short waySize, short tagSize, short replacePolicy); - bool read(string address); - bool write(string address); + tuple read(string address); vector addressTranslate(string address); short getValue(vector addrBits, string type); };