diff --git a/DRAMSys/library/src/configuration/Configuration.h b/DRAMSys/library/src/configuration/Configuration.h index 75176ae5..73a31847 100644 --- a/DRAMSys/library/src/configuration/Configuration.h +++ b/DRAMSys/library/src/configuration/Configuration.h @@ -119,6 +119,8 @@ public: void loadSimConfig(Configuration &config, std::string simconfigUri); void loadMemSpec(Configuration &config, std::string memspecUri); void loadTemperatureSimConfig(Configuration &config, std::string simconfigUri); + + int64_t duration = 0; }; #endif // CONFIGURATION_H diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index 789a7a13..016f7c59 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -59,6 +59,8 @@ #include "powerdown/PowerDownManagerStaggered.h" #include "powerdown/PowerDownManagerDummy.h" +#include + using namespace tlm; Controller::Controller(sc_module_name name) : @@ -219,6 +221,8 @@ Controller::~Controller() void Controller::controllerMethod() { + auto begin = std::chrono::high_resolution_clock::now(); + // clear command buffer readyCommands.clear(); @@ -332,6 +336,9 @@ void Controller::controllerMethod() if (timeForNextTrigger != sc_max_time()) controllerEvent.notify(timeForNextTrigger - sc_time_stamp()); + + auto end = std::chrono::high_resolution_clock::now(); + Configuration::getInstance().duration += std::chrono::duration_cast(end - begin).count(); } tlm_sync_enum Controller::nb_transport_fw(tlm_generic_payload &trans, diff --git a/DRAMSys/library/src/simulation/Arbiter.cpp b/DRAMSys/library/src/simulation/Arbiter.cpp index 71137003..cc88b1d5 100644 --- a/DRAMSys/library/src/simulation/Arbiter.cpp +++ b/DRAMSys/library/src/simulation/Arbiter.cpp @@ -39,6 +39,8 @@ #include "../common/AddressDecoder.h" #include "../configuration/Configuration.h" +#include + using namespace tlm; Arbiter::Arbiter(sc_module_name name, std::string pathToAddressMapping) : @@ -125,6 +127,8 @@ unsigned int Arbiter::transport_dbg(int /*id*/, tlm::tlm_generic_payload &trans) void Arbiter::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase) { + auto begin = std::chrono::high_resolution_clock::now(); + unsigned int threadId = DramExtension::getExtension(payload).getThread().ID(); unsigned int channelId = DramExtension::getExtension(payload).getChannel().ID(); @@ -226,6 +230,9 @@ void Arbiter::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase) else SC_REPORT_FATAL(0, "Payload event queue in arbiter was triggered with unknown phase"); + + auto end = std::chrono::high_resolution_clock::now(); + Configuration::getInstance().duration += std::chrono::duration_cast(end - begin).count(); } void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload) diff --git a/DRAMSys/simulator/TracePlayer.cpp b/DRAMSys/simulator/TracePlayer.cpp index 1162963e..028a9c1e 100644 --- a/DRAMSys/simulator/TracePlayer.cpp +++ b/DRAMSys/simulator/TracePlayer.cpp @@ -38,6 +38,8 @@ #include "TracePlayer.h" +#include + using namespace tlm; TracePlayer::TracePlayer(sc_module_name name, TracePlayerListener *listener) : @@ -79,6 +81,8 @@ tlm_sync_enum TracePlayer::nb_transport_bw(tlm_generic_payload &payload, void TracePlayer::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase) { + auto begin = std::chrono::high_resolution_clock::now(); + if (phase == BEGIN_REQ) { sendToTarget(payload, phase, SC_ZERO_TIME); transactionsSent++; @@ -102,6 +106,9 @@ void TracePlayer::peqCallback(tlm_generic_payload &payload, } else { SC_REPORT_FATAL(0, "TracePlayer PEQ was triggered with unknown phase"); } + + auto end = std::chrono::high_resolution_clock::now(); + Configuration::getInstance().duration += std::chrono::duration_cast(end - begin).count(); } void TracePlayer::sendToTarget(tlm_generic_payload &payload, const tlm_phase &phase, const sc_time &delay) diff --git a/DRAMSys/simulator/main.cpp b/DRAMSys/simulator/main.cpp index 7d29c614..222bd867 100644 --- a/DRAMSys/simulator/main.cpp +++ b/DRAMSys/simulator/main.cpp @@ -140,6 +140,17 @@ int sc_main(int argc, char **argv) std::chrono::duration elapsed = finish - start; std::cout << "Simulation took " + std::to_string(elapsed.count()) + " seconds." << std::endl; + int64_t total = std::chrono::duration_cast(finish - start).count(); + int64_t duration = Configuration::getInstance().duration; + + std::cout << "Total: " << total << std::endl; + std::cout << "Non-Kernel: " << duration << std::endl; + std::cout << "Kernel: " << total - duration << std::endl; + + std::cout << "Kernel %: " << ((double)(total - duration)) / total * 100 << std::endl; + std::cout << "Non-Kernel %: " << ((double)duration) / total * 100 << std::endl; + + delete dramSys; for (auto player : players) delete player;