diff --git a/DRAMSys/simulator/resources/configs/mcconfigs/sms.xml b/DRAMSys/simulator/resources/configs/mcconfigs/sms.xml index 19490a2c..84551d57 100644 --- a/DRAMSys/simulator/resources/configs/mcconfigs/sms.xml +++ b/DRAMSys/simulator/resources/configs/mcconfigs/sms.xml @@ -14,4 +14,5 @@ + \ No newline at end of file diff --git a/DRAMSys/simulator/src/controller/scheduler/SMS.cpp b/DRAMSys/simulator/src/controller/scheduler/SMS.cpp index aab6706e..24022e1c 100644 --- a/DRAMSys/simulator/src/controller/scheduler/SMS.cpp +++ b/DRAMSys/simulator/src/controller/scheduler/SMS.cpp @@ -6,6 +6,7 @@ using namespace std; void SMS::schedule(gp *payload) { Thread thread = DramExtension::getExtension(payload).getThread(); + bool wasEmpty = isRequestBuffersEmpty(); requestBuffers[thread].emplace_back(payload); @@ -16,7 +17,9 @@ void SMS::schedule(gp *payload) inFlightMemRequestCounter[thread]++; cacheMisses[thread]++; - newRequest.notify(SC_ZERO_TIME); + if (wasEmpty) { + newRequest.notify(SC_ZERO_TIME); + } } std::pair SMS::getNextRequest(Bank bank) @@ -228,14 +231,16 @@ bool SMS::isThresholdAgeExceeded(Thread thread, sc_time memClk, std::deque: void SMS::updateMPKCs(sc_time memClk) { if (sc_time_stamp() % (MPKC_RESET_CYCLE * memClk) <= memClk) { // reset for every 10k clk cycles - for (auto& mpkc : MPKCs) { - mpkc.second = 0; + for (auto& cacheMiss : cacheMisses) { + MPKCs[cacheMiss.first] = 0; } + debugManager.printDebugMessage(name(), "Reset MKKCs"); } else { // update MPKC for every thread - for (auto& mpkc : MPKCs) { - mpkc.second = (cacheMisses[mpkc.first] * 1000.0 * memClk) / (sc_time_stamp()); + for (auto& cacheMiss : cacheMisses) { + MPKCs[cacheMiss.first] = (cacheMiss.second * 1000.0 * memClk) / (sc_time_stamp()); } + debugManager.printDebugMessage(name(), "Update MPKCs"); } } @@ -245,11 +250,12 @@ bool SMS::isExceededReqBufferSize(Thread thread) { void SMS::batchFormation(sc_time memClk) { for (auto& requestBuffer : requestBuffers) { - if (!requestBuffer.second.empty() && !readybatches[requestBuffer.first].empty()) { + if (!requestBuffer.second.empty() && readybatches[requestBuffer.first].empty()) { if (MPKCs[requestBuffer.first] < LOW_MPKC || isSystemLightlyLoaded()) { // bypass requests by forming batch with only one request (threshold age is ZERO) readybatches[requestBuffer.first].emplace_back(requestBuffer.second.front()); requestBuffer.second.pop_front(); + debugManager.printDebugMessage(name(), "Bypass requests by forming batch of thread " + to_string(requestBuffer.first.ID())); } else { // forming batch with FIFO size & threshold age constraints auto firstDifferentRowAccessReqIter = requestBuffer.second.begin(); @@ -265,6 +271,7 @@ void SMS::batchFormation(sc_time memClk) { readybatches[requestBuffer.first].emplace_back(requestBuffer.second.front()); requestBuffer.second.pop_front(); } while (requestBuffer.second.begin() != firstDifferentRowAccessReqIter); + debugManager.printDebugMessage(name(), "Deem batch ready - thread " + to_string(requestBuffer.first.ID())); } } } @@ -282,7 +289,7 @@ bool SMS::isRequestBuffersEmpty() { bool SMS::existReadyBatches() { for (auto& readybatch : readybatches) { - if (readybatch.second.empty()) { + if (!readybatch.second.empty()) { return true; } }