From d6cb1de320b36257e60144a513beaf9a96b87700 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Fri, 18 Sep 2020 15:01:24 +0200 Subject: [PATCH] Improve FR-FCFS scheduler. --- .../controller/scheduler/SchedulerFrFcfs.cpp | 25 ++++++++----------- .../controller/scheduler/SchedulerFrFcfs.h | 3 ++- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp index 48ecad08..b29bcb73 100644 --- a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp +++ b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp @@ -41,9 +41,13 @@ using namespace tlm; SchedulerFrFcfs::SchedulerFrFcfs() { - buffer = std::vector> + buffer = std::vector> (Configuration::getInstance().memSpec->numberOfBanks); requestBufferSize = Configuration::getInstance().requestBufferSize; + lastRequest = std::vector::iterator> + (Configuration::getInstance().memSpec->numberOfBanks); + for (auto it : buffer) + it.reserve(requestBufferSize); } bool SchedulerFrFcfs::hasBufferSpace() @@ -63,15 +67,7 @@ void SchedulerFrFcfs::storeRequest(tlm_generic_payload *payload) void SchedulerFrFcfs::removeRequest(tlm_generic_payload *payload) { unsigned bankID = DramExtension::getBank(payload).ID(); - for (auto it = buffer[bankID].begin(); it != buffer[bankID].end(); it++) - { - if (*it == payload) - { - buffer[bankID].erase(it); - return; - } - } - SC_REPORT_FATAL("SchedulerFrFcfs", "removeRequest failed!"); + buffer[bankID].erase(lastRequest[bankID]); } tlm_generic_payload *SchedulerFrFcfs::getNextRequest(BankMachine *bankMachine) @@ -86,10 +82,14 @@ tlm_generic_payload *SchedulerFrFcfs::getNextRequest(BankMachine *bankMachine) for (auto it = buffer[bankID].begin(); it != buffer[bankID].end(); it++) { if (DramExtension::getRow(*it) == openRow) + { + lastRequest[bankID] = it; return *it; + } } } // No row hit found or bank precharged + lastRequest[bankID] = buffer[bankID].begin(); return buffer[bankID].front(); } return nullptr; @@ -112,8 +112,5 @@ bool SchedulerFrFcfs::hasFurtherRowHit(Bank bank, Row row) bool SchedulerFrFcfs::hasFurtherRequest(Bank bank) { - if (buffer[bank.ID()].size() >= 2) - return true; - else - return false; + return (buffer[bank.ID()].size() >= 2); } diff --git a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.h b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.h index 5d5347a4..b8174752 100644 --- a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.h +++ b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.h @@ -53,9 +53,10 @@ public: virtual bool hasFurtherRowHit(Bank, Row) override; virtual bool hasFurtherRequest(Bank) override; private: - std::vector> buffer; + std::vector> buffer; unsigned requestBufferSize; unsigned lastBankID; + std::vector::iterator> lastRequest; }; #endif // SCHEDULERFRFCFS_H