Improve FR-FCFS scheduler.

This commit is contained in:
Lukas Steiner
2020-09-18 15:01:24 +02:00
parent a20c5074d0
commit d6cb1de320
2 changed files with 13 additions and 15 deletions

View File

@@ -41,9 +41,13 @@ using namespace tlm;
SchedulerFrFcfs::SchedulerFrFcfs()
{
buffer = std::vector<std::list<tlm_generic_payload *>>
buffer = std::vector<std::vector<tlm_generic_payload *>>
(Configuration::getInstance().memSpec->numberOfBanks);
requestBufferSize = Configuration::getInstance().requestBufferSize;
lastRequest = std::vector<std::vector<tlm::tlm_generic_payload *>::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);
}

View File

@@ -53,9 +53,10 @@ public:
virtual bool hasFurtherRowHit(Bank, Row) override;
virtual bool hasFurtherRequest(Bank) override;
private:
std::vector<std::list<tlm::tlm_generic_payload *>> buffer;
std::vector<std::vector<tlm::tlm_generic_payload *>> buffer;
unsigned requestBufferSize;
unsigned lastBankID;
std::vector<std::vector<tlm::tlm_generic_payload *>::iterator> lastRequest;
};
#endif // SCHEDULERFRFCFS_H