adressmappings

This commit is contained in:
robert
2014-06-16 17:41:47 +02:00
parent c74b544f3e
commit 4760ec4a5b
8 changed files with 153 additions and 137 deletions

View File

@@ -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());
}
}