From 2c8d14323ac5b227883d9599ea2b7591c494134a Mon Sep 17 00:00:00 2001 From: Ting-Jun Wang Date: Sat, 22 Jan 2022 17:10:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Simulator=20=E5=8F=AF=E9=81=B8=E6=93=87?= =?UTF-8?q?=20Replace=20Policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 61 +++++++++++++++++++++++++++++++++++++------------ set.cpp | 63 +++++++++++++++++++++++++++------------------------ set.h | 3 ++- simulator.cpp | 15 ++++++------ simulator.h | 3 ++- 5 files changed, 92 insertions(+), 53 deletions(-) diff --git a/main.cpp b/main.cpp index 4548282..9a72087 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "simulator.h" int main(){ @@ -14,38 +15,70 @@ int main(){ std::cin >> temp >> temp >> blockSize; setSize = cacheSize * 1024 / blockSize / waySize; - std::cout << setSize << " sets" << std::endl << std::endl; offsetSize = log2(blockSize); indexSize = log2(setSize); tagSize = machineBits - offsetSize - indexSize; - std::cout << "offset: " << offsetSize << std::endl; - std::cout << "index : " << indexSize << std::endl; - std::cout << "tag : " << tagSize << std::endl; + 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 sim(machineBits, setSize, waySize, tagSize); + CacheSim::Simulator FIFOSim(machineBits, setSize, waySize, tagSize, 0); + CacheSim::Simulator LRUSim(machineBits, setSize, waySize, tagSize, 1); std::string action, address; bool status; - std::vector> result; + std::vector> LRUResult, FIFOResult; while(std::cin >> action >> address){ - std::cout << "action: "<< action << " address: " << address << std::endl; - status = sim.read(address); - result.push_back(std::make_pair(address, status)); - std::cout << std::endl << std::endl; + // 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; - for(int i=0; iwaySize = waySize; this->emptySize = waySize; + this->replacePolicy = replacePolicy; for(int i=0; iblocks.push_back(Block(tagSize)); @@ -22,10 +23,12 @@ bool Set::read(vector tag, short offset){ short baseAccessTime; // 被替換掉的 block ,它的 access time for(int i=0; iwaySize; i++){ if(this->blocks[i].getValid() && this->blocks[i].getTag() == tag){ // valid bit == true 且 tag 相同 - baseAccessTime= this->blocks[i].getAccessTime(); - this->blocks[i].access(); - this->countAccess(baseAccessTime); // 更新計算所有 way access 的時間點 - cout << "HIT: 在 " << i << " way 找到!" << endl; + if(this->replacePolicy == 1){ + baseAccessTime= this->blocks[i].getAccessTime(); + this->blocks[i].access(); + this->countAccess(baseAccessTime); // 更新計算所有 way access 的時間點 + // cout << "HIT: 在 " << i << " way 找到!" << endl; + } return true; } } @@ -34,7 +37,7 @@ bool Set::read(vector tag, short offset){ if(this->emptySize > 0){ for(int i=0; iwaySize; i++){ if(this->blocks[i].getValid() == false){ - cout << "MISS: 在 " << i <<" way 寫入資料" << endl; + // cout << "MISS: 在 " << i <<" way 寫入資料" << endl; this->blocks[i].update(tag); // 更新 tag this->blocks[i].access(); baseAccessTime = this->waySize; // 每個都要更新 @@ -56,18 +59,18 @@ bool Set::read(vector tag, short offset){ } // update - cout << "MISS: way 滿了,找到 " << maxIndex << " 在 " << maxTime << " 前更新" << endl; + // cout << "MISS: way 滿了,找到 " << maxIndex << " 在 " << maxTime << " 前更新" << endl; baseAccessTime = this->blocks[maxIndex].getAccessTime(); this->blocks[maxIndex].update(tag); this->blocks[maxIndex].access(); - for(int i=0; iwaySize; i++){ - vector t = this->blocks[i].getTag(); - for(int j=0; jwaySize; i++){ + // vector t = this->blocks[i].getTag(); + // for(int j=0; jcountAccess(baseAccessTime); @@ -80,22 +83,22 @@ void Set::countAccess(short baseAccessTime){ this->blocks[i].countAccess(); } } - for(int i=0; i<20; i++){ - cout << "=" ; - } - cout << "way 狀態"; - for(int i=0; i<20; i++){ - cout << "="; - } - cout<waySize; i++){ + // cout << this->blocks[i].getAccessTime() << " "; + // } + // cout< blocks; public: - Set(short waySize, short tagSize); + Set(short waySize, short tagSize, short replacePolicy); bool read(vector tag, short offset); void countAccess(short baseAccessTime); diff --git a/simulator.cpp b/simulator.cpp index a148a02..a21f662 100644 --- a/simulator.cpp +++ b/simulator.cpp @@ -5,25 +5,26 @@ using CacheSim::Simulator; using std::stringstream; using std::bitset; -Simulator::Simulator(int machineBits, short setSize, short waySize, short tagSize){ +Simulator::Simulator(int machineBits, short setSize, short waySize, short tagSize, short replacePolicy){ this->setSize = setSize; this->tagSize = tagSize; this->machineBits = machineBits; + this->replacePolicy = replacePolicy; for(int i=0; isets.push_back(Set(waySize, tagSize)); + this->sets.push_back(Set(waySize, tagSize, replacePolicy)); } } bool Simulator::read(string address){ vector addrBits = this->addressTranslate(address); - for(int i=0; igetValue(addrBits, "index"); short offset = this->getValue(addrBits, "offset"); vector tag(addrBits.begin(), addrBits.begin()+this->tagSize); - std::cout<<"更新 index: "<sets[index].read(tag, offset); } diff --git a/simulator.h b/simulator.h index 9f70614..4889216 100644 --- a/simulator.h +++ b/simulator.h @@ -10,12 +10,13 @@ namespace CacheSim{ class Simulator { private: + short replacePolicy; short setSize; short tagSize; int machineBits; vector sets; public: - Simulator(int machineBits, short setSize, short waySize, short tagSize); + Simulator(int machineBits, short setSize, short waySize, short tagSize, short replacePolicy); bool read(string address); bool write(string address); vector addressTranslate(string address);