From d95f460237374dfef118ef4f520d97c07cc14cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89der=20F=2E=20Zulian?= Date: Thu, 7 Apr 2016 00:24:21 +0200 Subject: [PATCH] Power plots generation fixed. This is the DRAMSys patch related to the following DRAMPower issue: https://github.com/ravenrd/DRAMPower/issues/31 --- DRAMSys/analyzer/scripts/plots.py | 10 ++- .../resources/scripts/createTraceDB.sql | 2 +- DRAMSys/simulator/src/common/TlmRecorder.cpp | 4 +- DRAMSys/simulator/src/common/TlmRecorder.h | 2 +- DRAMSys/simulator/src/simulation/Dram.h | 64 +++++++++---------- 5 files changed, 40 insertions(+), 42 deletions(-) mode change 100644 => 100755 DRAMSys/analyzer/scripts/plots.py diff --git a/DRAMSys/analyzer/scripts/plots.py b/DRAMSys/analyzer/scripts/plots.py old mode 100644 new mode 100755 index 745ad8c2..6d9ddc21 --- a/DRAMSys/analyzer/scripts/plots.py +++ b/DRAMSys/analyzer/scripts/plots.py @@ -28,7 +28,7 @@ def memory_utilisation_window(connection, tracePath): total = cursor.fetchone() windowSize = ceil(float(total[0])/float(steps)) if (windowSize == 0): - windowSize = 1 + windowSize = 1 # print(steps) # All possible cases of data transfers inside a time window queryFull = """ SELECT sum(DataStrobeEnd - DataStrobeBegin) FROM transactions Where DataStrobeBegin > ? and DataStrobeEnd < ?""" # The data transfer begins and ends inside the time window @@ -72,8 +72,6 @@ def memory_utilisation_window(connection, tracePath): name = ntpath.basename(tracePath) basename, extension = os.path.splitext(name) - - OUTPUT_FILE = 'memory_utilization_' + basename + '.pdf' print("Output file is {0}".format(OUTPUT_FILE)) @@ -120,8 +118,8 @@ def power_window(connection, tracePath): power = [0] * steps for i in range(steps): result = cursor.fetchone() - time[i] = int(result[0])/1000 - power[i] = float(result[1]) + time[i] = float(result[0]) * 1000000000 # convertion of seconds to nanoseconds + power[i] = float(result[1]) / 1000000000 # conversion of pW to mW name = ntpath.basename(tracePath) basename, extension = os.path.splitext(name) @@ -156,7 +154,7 @@ def power_window(connection, tracePath): # return "Saved as hist.png" -def generatePlots(pathToTrace): +def generatePlots(pathToTrace): connection = sqlite3.connect(pathToTrace) print("================================") diff --git a/DRAMSys/simulator/resources/scripts/createTraceDB.sql b/DRAMSys/simulator/resources/scripts/createTraceDB.sql index aa236f83..a8bad1fe 100644 --- a/DRAMSys/simulator/resources/scripts/createTraceDB.sql +++ b/DRAMSys/simulator/resources/scripts/createTraceDB.sql @@ -26,7 +26,7 @@ CREATE TABLE GeneralInfo( ); CREATE TABLE Power( - time INTEGER, + time DOUBLE, AveragePower DOUBLE ); diff --git a/DRAMSys/simulator/src/common/TlmRecorder.cpp b/DRAMSys/simulator/src/common/TlmRecorder.cpp index c55b2c19..270f04ea 100644 --- a/DRAMSys/simulator/src/common/TlmRecorder.cpp +++ b/DRAMSys/simulator/src/common/TlmRecorder.cpp @@ -74,10 +74,10 @@ TlmRecorder::~TlmRecorder() closeConnection(); } -void TlmRecorder::recordPower(sc_time time, double averagePower) +void TlmRecorder::recordPower(double timeInSeconds, double averagePower) { if (TlmRecorder::recordingEnabled) { - sqlite3_bind_int64(insertPowerStatement, 1, time.value()); + sqlite3_bind_double(insertPowerStatement, 1, timeInSeconds); sqlite3_bind_double(insertPowerStatement, 2, averagePower); executeSqlStatement(insertPowerStatement); } diff --git a/DRAMSys/simulator/src/common/TlmRecorder.h b/DRAMSys/simulator/src/common/TlmRecorder.h index 1f5e499a..d0c0ad49 100644 --- a/DRAMSys/simulator/src/common/TlmRecorder.h +++ b/DRAMSys/simulator/src/common/TlmRecorder.h @@ -69,7 +69,7 @@ public: void recordTracenames(string traces){this->traces = traces;} void recordPhase(tlm::tlm_generic_payload &trans, tlm::tlm_phase phase, sc_time time); - void recordPower(sc_time time, double averagePower); + void recordPower(double timeInSeconds, double averagePower); void recordDebugMessage(std::string message, sc_time time); void updateDataStrobe(const sc_time& begin, const sc_time& end, tlm::tlm_generic_payload& trans); void closeConnection(); diff --git a/DRAMSys/simulator/src/simulation/Dram.h b/DRAMSys/simulator/src/simulation/Dram.h index ed5152b0..62986456 100644 --- a/DRAMSys/simulator/src/simulation/Dram.h +++ b/DRAMSys/simulator/src/simulation/Dram.h @@ -91,7 +91,7 @@ struct Dram : sc_module if(powerAnalysis == true) { sc_time clk = Configuration::getInstance().memSpec.clk; - + MemArchitectureSpec memArchSpec; memArchSpec.burstLength = Configuration::getInstance().memSpec.BurstLength; memArchSpec.dataRate = Configuration::getInstance().memSpec.DataRate; @@ -164,7 +164,7 @@ struct Dram : sc_module memPowerSpec.vdd2 = Configuration::getInstance().memSpec.vDD2; MemorySpecification memSpec; - memSpec.memTimingSpec = memTimingSpec; + memSpec.memTimingSpec = memTimingSpec; memSpec.memPowerSpec = memPowerSpec; memSpec.memArchSpec = memArchSpec; @@ -194,35 +194,27 @@ struct Dram : sc_module ~Dram() { - if(powerAnalysis == true) - { + if (powerAnalysis == true) { + // Obtain the residual energy which was not covered by previous windows DRAMPower->updateCounters(true); DRAMPower->calcEnergy(); - // Calculate the residual power and energy which was not covered by previous windows... - printDebugMessage(string("\tCurrent Energy: \t") + to_string(DRAMPower->getEnergy().total_energy - totalEnergy)); - printDebugMessage(string("\tAverage Power: \t") + to_string((DRAMPower->getEnergy().total_energy - totalEnergy)/powerWindowSize.value())); + double energy = sumOfEnergyWindows + DRAMPower->getEnergy().total_energy; + double averagePower = energy / sc_time_stamp().to_seconds(); - double currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy; - double currentAveragePower = currentTotalEnergy/powerWindowSize.value(); - sumOfEnergyWindows += currentTotalEnergy; - tlmRecorder->recordPower(sc_time_stamp(),currentAveragePower); - totalEnergy = DRAMPower->getEnergy().total_energy; + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), averagePower); - // Make sure that the summed energy of the windows is the same as the final value provided by DRAMPower: - assert(sumOfEnergyWindows == totalEnergy); - - // Print Final Total Power Values: - cout << name() << string("\tTotal Energy: \t") + to_string(totalEnergy) << endl; - cout << name() << string("\tAverage Power: \t") + to_string(DRAMPower->getPower().average_power) << endl; + // Print Final Total Power Values + cout << name() << string("\tTotal Energy: \t") + to_string(energy) + string("\t[pJ]") << endl; + cout << name() << string("\tAverage Power: \t") + to_string(averagePower) + string("\t[pW]") << endl; } + // Clean up: for (auto e : ememory) { delete e; } - //std::cout << "Simulated Memory Size: " << memory.size() << endl; // TODO Aufrauemen } - + // This Thread is only triggered when Power Simulation is enabled. // It estimates the current average power which will be stored in the trace database for visualization purposes. void powerWindow() @@ -230,22 +222,30 @@ struct Dram : sc_module double currentAveragePower = 0; double currentTotalEnergy = 0; - do - { + do { + unsigned long long c = sc_time_stamp().value() / Configuration::getInstance().memSpec.clk.value(); + + DRAMPower->doCommand(MemCommand::NOP, 0, c); DRAMPower->updateCounters(false); DRAMPower->calcEnergy(); - currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy; - currentAveragePower = currentTotalEnergy/powerWindowSize.value(); - tlmRecorder->recordPower(sc_time_stamp(),currentAveragePower); - totalEnergy = DRAMPower->getEnergy().total_energy; + + currentTotalEnergy = DRAMPower->getEnergy().total_energy; + + assert(currentTotalEnergy != 0); + + DRAMPower->clearCounters(c); + sumOfEnergyWindows += currentTotalEnergy; + // [pW] = [pJ] / [s] (here considering that DRAMPower provides the value always in pJ) + currentAveragePower = currentTotalEnergy / powerWindowSize.to_seconds(); + + tlmRecorder->recordPower(sc_time_stamp().to_seconds(), currentAveragePower); + + printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy) + string("\t[pJ]")); + printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower) + string("\t[pW]")); - printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy)); - printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower)); wait(powerWindowSize); - } - while(true); - + } while(true); } virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& payload, tlm::tlm_phase& phase, sc_time& delay) @@ -510,7 +510,7 @@ struct Dram : sc_module void setTlmRecorder(TlmRecorder *rec) { - tlmRecorder = rec; + tlmRecorder = rec; } };