From 2097351050cd35bdae5585a56f7cade83341d230 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Fri, 25 Sep 2020 11:35:34 +0200 Subject: [PATCH] Reuse payload extensions. --- DRAMSys/library/src/common/AddressDecoder.cpp | 62 +++++++------- DRAMSys/library/src/common/TlmRecorder.cpp | 2 +- DRAMSys/library/src/common/dramExtensions.cpp | 83 ++++++++++++++++--- DRAMSys/library/src/common/dramExtensions.h | 29 ++++--- .../library/src/controller/BankMachine.cpp | 2 + .../refresh/RefreshManagerRankwise.cpp | 6 +- DRAMSys/library/src/simulation/Arbiter.cpp | 16 ++-- DRAMSys/simulator/MemoryManager.cpp | 14 +++- DRAMSys/simulator/MemoryManager.h | 4 +- 9 files changed, 148 insertions(+), 70 deletions(-) diff --git a/DRAMSys/library/src/common/AddressDecoder.cpp b/DRAMSys/library/src/common/AddressDecoder.cpp index 83ac46f8..b6c9cdd4 100644 --- a/DRAMSys/library/src/common/AddressDecoder.cpp +++ b/DRAMSys/library/src/common/AddressDecoder.cpp @@ -55,13 +55,13 @@ unsigned int AddressDecoder::getUnsignedAttrFromJson(nlohmann::json obj, std::st else { SC_REPORT_FATAL("AddressDecoder", ("Attribute " + strName + " is not a number.").c_str()); - return (unsigned)(-1); + return static_cast(-1); } } else { SC_REPORT_FATAL("AddressDecoder", ("Attribute " + strName + " is empty or not found.").c_str()); - return (unsigned)(-1); + return static_cast(-1); } } @@ -124,15 +124,15 @@ AddressDecoder::AddressDecoder(std::string pathToAddressMapping) vColumnBits = getAttrToVectorFromJson(mapping,"COLUMN_BIT"); vByteBits = getAttrToVectorFromJson(mapping,"BYTE_BIT"); - uint64_t channels = (uint64_t)(pow(2.0, vChannelBits.size()) + 0.5); - uint64_t ranks = (uint64_t)(pow(2.0, vRankBits.size()) + 0.5); - uint64_t bankgroups = (uint64_t)(pow(2.0, vBankGroupBits.size()) + 0.5); - uint64_t banks = (uint64_t)(pow(2.0, vBankBits.size()) + 0.5); - uint64_t rows = (uint64_t)(pow(2.0, vRowBits.size()) + 0.5); - uint64_t columns = (uint64_t)(pow(2.0, vColumnBits.size()) + 0.5); - uint64_t bytes = (uint64_t)(pow(2.0, vByteBits.size()) + 0.5); + unsigned channels = static_cast(pow(2.0, vChannelBits.size()) + 0.5); + unsigned ranks = static_cast(pow(2.0, vRankBits.size()) + 0.5); + unsigned bankgroups = static_cast(pow(2.0, vBankGroupBits.size()) + 0.5); + unsigned banks = static_cast(pow(2.0, vBankBits.size()) + 0.5); + unsigned rows = static_cast(pow(2.0, vRowBits.size()) + 0.5); + unsigned columns = static_cast(pow(2.0, vColumnBits.size()) + 0.5); + unsigned bytes = static_cast(pow(2.0, vByteBits.size()) + 0.5); - maximumAddress = bytes * columns * rows * banks * bankgroups * ranks * channels - 1; + maximumAddress = static_cast(bytes) * columns * rows * banks * bankgroups * ranks * channels - 1; banksPerGroup = banks; banks = banksPerGroup * bankgroups * ranks; @@ -201,78 +201,78 @@ void AddressDecoder::print() std::cout << "Used Address Mapping:" << std::endl; std::cout << std::endl; - for (int it = vChannelBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vChannelBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vChannelBits[it]); + uint64_t addressBits = (UINT64_C(1) << vChannelBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vChannelBits[it]) + if (it2.first == vChannelBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " Ch " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; } - for (int it = vRankBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vRankBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vRankBits[it]); + uint64_t addressBits = (UINT64_C(1) << vRankBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vRankBits[it]) + if (it2.first == vRankBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " Ra " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; } - for (int it = vBankGroupBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vBankGroupBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vBankGroupBits[it]); + uint64_t addressBits = (UINT64_C(1) << vBankGroupBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vBankGroupBits[it]) + if (it2.first == vBankGroupBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " Bg " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; } - for (int it = vBankBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vBankBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vBankBits[it]); + uint64_t addressBits = (UINT64_C(1) << vBankBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vBankBits[it]) + if (it2.first == vBankBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " Ba " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; } - for (int it = vRowBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vRowBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vRowBits[it]); + uint64_t addressBits = (UINT64_C(1) << vRowBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vRowBits[it]) + if (it2.first == vRowBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " Ro " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; } - for (int it = vColumnBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vColumnBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vColumnBits[it]); + uint64_t addressBits = (UINT64_C(1) << vColumnBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vColumnBits[it]) + if (it2.first == vColumnBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " Co " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; } - for (int it = vByteBits.size() - 1; it >= 0; it--) + for (int it = static_cast(vByteBits.size() - 1); it >= 0; it--) { - uint64_t addressBits = (UINT64_C(1) << vByteBits[it]); + uint64_t addressBits = (UINT64_C(1) << vByteBits[static_cast::size_type>(it)]); for (auto it2 : vXor) { - if (it2.first == vByteBits[it]) + if (it2.first == vByteBits[static_cast::size_type>(it)]) addressBits |= (UINT64_C(1) << it2.second); } std::cout << " By " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl; diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index 59805638..660fd461 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -150,7 +150,7 @@ void TlmRecorder::introduceTransactionSystem(tlm_generic_payload &trans) currentTransactionsInSystem[&trans].timeOfGeneration = SC_ZERO_TIME; else currentTransactionsInSystem[&trans].timeOfGeneration = - GenerationExtension::getExtension(&trans).TimeOfGeneration(); + GenerationExtension::getTimeOfGeneration(trans); PRINTDEBUGMESSAGE(name, "New transaction #" + std::to_string(id) + " generation time " + currentTransactionsInSystem[&trans].timeOfGeneration.to_string()); diff --git a/DRAMSys/library/src/common/dramExtensions.cpp b/DRAMSys/library/src/common/dramExtensions.cpp index abd34d62..93a9bbad 100644 --- a/DRAMSys/library/src/common/dramExtensions.cpp +++ b/DRAMSys/library/src/common/dramExtensions.cpp @@ -46,23 +46,60 @@ DramExtension::DramExtension() : thread(0), channel(0), rank(0), bankgroup(0), bank(0), row(0), column(0), burstlength(0), payloadID(0) {} -DramExtension::DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup, - const Bank &bank, const Row &row, const Column &column, +DramExtension::DramExtension(Thread thread, Rank rank, BankGroup bankgroup, + Bank bank, Row row, Column column, unsigned int burstlength, uint64_t payloadID) : thread(thread), channel(0), rank(rank), bankgroup(bankgroup), bank(bank), row(row), column(column), burstlength(burstlength), payloadID(payloadID) {} -DramExtension::DramExtension(const Thread &thread, const Channel &channel, const Rank &rank, - const BankGroup &bankgroup, const Bank &bank, const Row &row, - const Column &column, unsigned int burstlength, uint64_t payloadID) : +DramExtension::DramExtension(Thread thread, Channel channel, Rank rank, + BankGroup bankgroup, Bank bank, Row row, + Column column, unsigned int burstlength, uint64_t payloadID) : thread(thread), channel(channel), rank(rank), bankgroup(bankgroup), bank(bank), row(row), column(column), burstlength(burstlength), payloadID(payloadID) {} +void DramExtension::setExtension(tlm::tlm_generic_payload *payload, + Thread thread, Channel channel, Rank rank, + BankGroup bankgroup, Bank bank, Row row, + Column column, unsigned int burstlength, uint64_t payloadID) +{ + DramExtension *extension = nullptr; + payload->get_extension(extension); + + if (extension != nullptr) + { + extension->thread = thread; + extension->channel = channel; + extension->rank = rank; + extension->bankgroup = bankgroup; + extension->bank = bank; + extension->row = row; + extension->column = column; + extension->burstlength = burstlength; + extension->payloadID = payloadID; + } + else + { + extension = new DramExtension(thread, channel, rank, bankgroup, + bank, row, column, burstlength, payloadID); + payload->set_auto_extension(extension); + } +} + +void DramExtension::setExtension(tlm::tlm_generic_payload &payload, + Thread thread, Channel channel, Rank rank, + BankGroup bankgroup, Bank bank, Row row, + Column column, unsigned int burstlength, uint64_t payloadID) +{ + setExtension(&payload, thread, channel, rank, bankgroup, + bank, row, column, burstlength, payloadID); +} + DramExtension &DramExtension::getExtension(const tlm_generic_payload *payload) { - DramExtension *result = NULL; + DramExtension *result = nullptr; payload->get_extension(result); - sc_assert(result != NULL); + sc_assert(result != nullptr); return *result; } @@ -232,17 +269,43 @@ void GenerationExtension::copy_from(const tlm_extension_base &ext) } +void GenerationExtension::setExtension(tlm::tlm_generic_payload *payload, sc_time timeOfGeneration) +{ + GenerationExtension *extension = nullptr; + payload->get_extension(extension); + + if (extension != nullptr) + { + extension->timeOfGeneration = timeOfGeneration; + } + else + { + extension = new GenerationExtension(timeOfGeneration); + payload->set_auto_extension(extension); + } +} + +void GenerationExtension::setExtension(tlm::tlm_generic_payload &payload, sc_time timeOfGeneration) +{ + GenerationExtension::setExtension(&payload, timeOfGeneration); +} + GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload *payload) { - GenerationExtension *result = NULL; + GenerationExtension *result = nullptr; payload->get_extension(result); - sc_assert(result != NULL); + sc_assert(result != nullptr); return *result; } +GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload &payload) +{ + return GenerationExtension::getExtension(&payload); +} + sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload *payload) { - return GenerationExtension::getExtension(payload).TimeOfGeneration(); + return GenerationExtension::getExtension(payload).timeOfGeneration; } sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload &payload) diff --git a/DRAMSys/library/src/common/dramExtensions.h b/DRAMSys/library/src/common/dramExtensions.h index e88543b6..1c33454d 100644 --- a/DRAMSys/library/src/common/dramExtensions.h +++ b/DRAMSys/library/src/common/dramExtensions.h @@ -163,16 +163,25 @@ class DramExtension : public tlm::tlm_extension { public: DramExtension(); - DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup, - const Bank &bank, const Row &row, const Column &column, + DramExtension(Thread thread, Rank rank, BankGroup bankgroup, + Bank bank, Row row, Column column, unsigned int burstlength, uint64_t payloadID); - DramExtension(const Thread &thread, const Channel &channel, const Rank &rank, - const BankGroup &bankgroup, const Bank &bank, const Row &row, - const Column &column, unsigned int burstlength, uint64_t payloadID); + DramExtension(Thread thread, Channel channel, Rank rank, + BankGroup bankgroup, Bank bank, Row row, + Column column, unsigned int burstlength, uint64_t payloadID); virtual tlm::tlm_extension_base *clone() const; virtual void copy_from(const tlm::tlm_extension_base &ext); + static void setExtension(tlm::tlm_generic_payload *payload, + Thread thread, Channel channel, Rank rank, + BankGroup bankgroup, Bank bank, Row row, + Column column, unsigned int burstlength, uint64_t payloadID); + static void setExtension(tlm::tlm_generic_payload &payload, + Thread thread, Channel channel, Rank rank, + BankGroup bankgroup, Bank bank, Row row, + Column column, unsigned int burstlength, uint64_t payloadID); + static DramExtension &getExtension(const tlm::tlm_generic_payload *payload); static DramExtension &getExtension(const tlm::tlm_generic_payload &payload); @@ -229,12 +238,10 @@ public: : timeOfGeneration(timeOfGeneration) {} virtual tlm::tlm_extension_base *clone() const; virtual void copy_from(const tlm::tlm_extension_base &ext); - static GenerationExtension - &getExtension(const tlm::tlm_generic_payload *payload); - sc_time TimeOfGeneration() const - { - return timeOfGeneration; - } + static void setExtension(tlm::tlm_generic_payload *payload, sc_time timeOfGeneration); + static void setExtension(tlm::tlm_generic_payload &payload, sc_time timeOfGeneration); + static GenerationExtension &getExtension(const tlm::tlm_generic_payload *payload); + static GenerationExtension &getExtension(const tlm::tlm_generic_payload &payload); static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload *payload); static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload &payload); diff --git a/DRAMSys/library/src/controller/BankMachine.cpp b/DRAMSys/library/src/controller/BankMachine.cpp index e9fc8394..fb7e3e8c 100644 --- a/DRAMSys/library/src/controller/BankMachine.cpp +++ b/DRAMSys/library/src/controller/BankMachine.cpp @@ -78,6 +78,8 @@ void BankMachine::updateState(Command command) case Command::PDXA: case Command::PDXP: sleeping = false; break; + default: + break; } } diff --git a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp index 6626a0b9..dd68bb2b 100644 --- a/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp +++ b/DRAMSys/library/src/controller/refresh/RefreshManagerRankwise.cpp @@ -48,8 +48,8 @@ RefreshManagerRankwise::RefreshManagerRankwise(std::vector &bankM timeForNextTrigger = memSpec->getRefreshIntervalAB(); setUpDummy(refreshPayload, 0, rank); - maxPostponed = config.refreshMaxPostponed; - maxPulledin = -config.refreshMaxPulledin; + maxPostponed = static_cast(config.refreshMaxPostponed); + maxPulledin = -static_cast(config.refreshMaxPulledin); } CommandTuple::Type RefreshManagerRankwise::getNextCommand() @@ -183,5 +183,7 @@ void RefreshManagerRankwise::updateState(Command command) case Command::PDXA: case Command::PDXP: sleeping = false; break; + default: + break; } } diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index 71137003..b25f3c2f 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -230,16 +230,14 @@ void Arbiter::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase) void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload) { - // Append Generation Extension - GenerationExtension *genExtension = new GenerationExtension(sc_time_stamp()); - payload.set_auto_extension(genExtension); + // Set Generation Extension and DRAM Extension + GenerationExtension::setExtension(&payload, sc_time_stamp()); unsigned int burstlength = payload.get_streaming_width(); DecodedAddress decodedAddress = addressDecoder->decodeAddress(payload.get_address()); - DramExtension *extension = new DramExtension(Thread(socketId), - Channel(decodedAddress.channel), Rank(decodedAddress.rank), - BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank), - Row(decodedAddress.row), Column(decodedAddress.column), - burstlength, nextPayloadID[decodedAddress.channel]++); - payload.set_auto_extension(extension); + DramExtension::setExtension(payload, Thread(socketId), + Channel(decodedAddress.channel), Rank(decodedAddress.rank), + BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank), + Row(decodedAddress.row), Column(decodedAddress.column), + burstlength, nextPayloadID[decodedAddress.channel]++); } diff --git a/DRAMSys/simulator/MemoryManager.cpp b/DRAMSys/simulator/MemoryManager.cpp index 331883a3..24ef8d12 100644 --- a/DRAMSys/simulator/MemoryManager.cpp +++ b/DRAMSys/simulator/MemoryManager.cpp @@ -46,8 +46,12 @@ MemoryManager::MemoryManager() MemoryManager::~MemoryManager() { - for (tlm_generic_payload *payload : freePayloads) { + for (tlm_generic_payload *payload : freePayloads) + { + // Delete data buffer delete[] payload->get_data_ptr(); + // Delete all extensions + payload->reset(); delete payload; numberOfFrees++; } @@ -59,7 +63,8 @@ MemoryManager::~MemoryManager() tlm_generic_payload *MemoryManager::allocate() { - if (freePayloads.empty()) { + if (freePayloads.empty()) + { numberOfAllocations++; tlm_generic_payload *payload = new tlm_generic_payload(this); @@ -70,7 +75,9 @@ tlm_generic_payload *MemoryManager::allocate() payload->set_data_ptr(data); return payload; - } else { + } + else + { tlm_generic_payload *result = freePayloads.back(); freePayloads.pop_back(); return result; @@ -79,7 +86,6 @@ tlm_generic_payload *MemoryManager::allocate() void MemoryManager::free(tlm_generic_payload *payload) { - payload->reset(); // clears all extensions freePayloads.push_back(payload); } diff --git a/DRAMSys/simulator/MemoryManager.h b/DRAMSys/simulator/MemoryManager.h index f7bdd32f..397ed40d 100644 --- a/DRAMSys/simulator/MemoryManager.h +++ b/DRAMSys/simulator/MemoryManager.h @@ -49,8 +49,8 @@ public: virtual void free(tlm::tlm_generic_payload *payload); private: - unsigned int numberOfAllocations; - unsigned int numberOfFrees; + uint64_t numberOfAllocations; + uint64_t numberOfFrees; std::vector freePayloads; };