adressmappings
This commit is contained in:
@@ -18,18 +18,18 @@ using namespace std;
|
||||
using namespace core;
|
||||
|
||||
PAR_BS::PAR_BS(const core::BankStates& bankstates, bool useExternalBankstates, unsigned int capsize) :
|
||||
externalBankstates(bankstates), useExternalBankstates(useExternalBankstates), capsize(capsize)
|
||||
externalBankstates(bankstates), useExternalBankstates(useExternalBankstates), capsize(capsize)
|
||||
{
|
||||
if (useExternalBankstates)
|
||||
{
|
||||
batch = new FR_FCFS(externalBankstates, true, false);
|
||||
buffer = new FR_FCFS(externalBankstates, true, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
batch = new FR_FCFS(internalBankstates, true, false);
|
||||
buffer = new FR_FCFS(internalBankstates, true, false);
|
||||
}
|
||||
if (useExternalBankstates)
|
||||
{
|
||||
batch = new FR_FCFS(externalBankstates, true, false);
|
||||
buffer = new FR_FCFS(externalBankstates, true, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
batch = new FR_FCFS(internalBankstates, true, false);
|
||||
buffer = new FR_FCFS(internalBankstates, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
PAR_BS::~PAR_BS()
|
||||
@@ -39,74 +39,75 @@ PAR_BS::~PAR_BS()
|
||||
|
||||
bool PAR_BS::hasTransactionForBank(Bank bank)
|
||||
{
|
||||
return batch->hasTransactionForBank(bank) || buffer->hasTransactionForBank(bank);
|
||||
return batch->hasTransactionForBank(bank) || buffer->hasTransactionForBank(bank);
|
||||
}
|
||||
|
||||
void PAR_BS::schedule(gp* payload)
|
||||
{
|
||||
buffer->schedule(payload);
|
||||
buffer->schedule(payload);
|
||||
}
|
||||
|
||||
gp* PAR_BS::getTransactionForBank(Bank bank)
|
||||
{
|
||||
sc_assert(hasTransactionForBank(bank));
|
||||
sc_assert(hasTransactionForBank(bank));
|
||||
|
||||
if (batch->isEmpty())
|
||||
{
|
||||
formBatch();
|
||||
sc_assert(!batch->isEmpty());
|
||||
}
|
||||
if (batch->isEmpty())
|
||||
{
|
||||
formBatch();
|
||||
cout << "Formed new batch at: " << sc_time_stamp() << std::endl;
|
||||
sc_assert(!batch->isEmpty());
|
||||
}
|
||||
|
||||
//prioritize batch first
|
||||
if (batch->hasTransactionForBank(bank))
|
||||
{
|
||||
return batch->getTransactionForBank(bank);
|
||||
}
|
||||
else
|
||||
{
|
||||
return buffer->getTransactionForBank(bank);
|
||||
}
|
||||
//prioritize batch first
|
||||
if (batch->hasTransactionForBank(bank))
|
||||
{
|
||||
return batch->getTransactionForBank(bank);
|
||||
}
|
||||
else
|
||||
{
|
||||
return buffer->getTransactionForBank(bank);
|
||||
}
|
||||
}
|
||||
|
||||
void PAR_BS::popTransactionForBank(Bank bank, gp* payload)
|
||||
{
|
||||
sc_assert(DramExtension::getExtension(payload).getBank() == bank);
|
||||
buffer->popTransactionForBank(bank, payload);
|
||||
batch->popTransactionForBank(bank, payload);
|
||||
sc_assert(DramExtension::getExtension(payload).getBank() == bank);
|
||||
buffer->popTransactionForBank(bank, payload);
|
||||
batch->popTransactionForBank(bank, payload);
|
||||
|
||||
if (!useExternalBankstates)
|
||||
{
|
||||
internalBankstates.openRowInRowBuffer(bank, DramExtension::getExtension(payload).getRow());
|
||||
}
|
||||
if (!useExternalBankstates)
|
||||
{
|
||||
internalBankstates.openRowInRowBuffer(bank, DramExtension::getExtension(payload).getRow());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void PAR_BS::formBatch()
|
||||
{
|
||||
map<Thread, ThreadLoad> loads;
|
||||
map<Thread, ThreadLoad> loads;
|
||||
|
||||
for (unsigned int b = 0; b < Configuration::getInstance().NumberOfBanks; ++b)
|
||||
{
|
||||
Bank bank(b);
|
||||
for (unsigned int i = 0; i < capsize && buffer->hasTransactionForBank(bank); i++)
|
||||
{
|
||||
gp* payload = buffer->popOldest(bank);
|
||||
loads[DramExtension::getExtension(payload).getThread()].addTransaction(payload);
|
||||
}
|
||||
}
|
||||
for (unsigned int b = 0; b < Configuration::getInstance().NumberOfBanks; ++b)
|
||||
{
|
||||
Bank bank(b);
|
||||
for (unsigned int i = 0; i < capsize && buffer->hasTransactionForBank(bank); i++)
|
||||
{
|
||||
gp* payload = buffer->popOldest(bank);
|
||||
loads[DramExtension::getExtension(payload).getThread()].addTransaction(payload);
|
||||
}
|
||||
}
|
||||
|
||||
vector<ThreadLoad*> sortedLoads;
|
||||
for (auto& threadLoadPair : loads)
|
||||
{
|
||||
sortedLoads.push_back(&threadLoadPair.second);
|
||||
}
|
||||
vector<ThreadLoad*> sortedLoads;
|
||||
for (auto& threadLoadPair : loads)
|
||||
{
|
||||
sortedLoads.push_back(&threadLoadPair.second);
|
||||
}
|
||||
|
||||
sort(sortedLoads.begin(), sortedLoads.end(), LoadPointerComparer());
|
||||
sort(sortedLoads.begin(), sortedLoads.end(), LoadPointerComparer());
|
||||
|
||||
for (auto& load : sortedLoads)
|
||||
{
|
||||
batch->schedule(load->getTransactions());
|
||||
}
|
||||
for (auto& load : sortedLoads)
|
||||
{
|
||||
batch->schedule(load->getTransactions());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user