Improve FR-FCFS scheduler.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user