From 965d6740f1b81b32e11f41fcfd8498aee82cd5f6 Mon Sep 17 00:00:00 2001 From: Matthias Jung Date: Tue, 15 Mar 2016 22:51:49 +0100 Subject: [PATCH] test and adjusted some of Felipes changes --- DRAMSys/simulator/src/simulation/Dram.h | 26 +++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/DRAMSys/simulator/src/simulation/Dram.h b/DRAMSys/simulator/src/simulation/Dram.h index dda5b998..c68d4ffe 100644 --- a/DRAMSys/simulator/src/simulation/Dram.h +++ b/DRAMSys/simulator/src/simulation/Dram.h @@ -67,10 +67,10 @@ struct Dram : sc_module // Power Model related bool powerAnalysis = Configuration::getInstance().PowerAnalysis; - sc_time windowSize = sc_time(1000,SC_NS); + sc_time windowSize = sc_time(1000,SC_NS); // TODO: this window size should be configurable by the config file libDRAMPower * DRAMPower; double totalEnergy = 0; - + double sumOfEnergyWindows = 0; // Error Model related: ErrorStorageMode ErrorStoreMode = Configuration::getInstance().ErrorStoreMode; @@ -167,7 +167,10 @@ struct Dram : sc_module memSpec.memArchSpec = memArchSpec; DRAMPower = new libDRAMPower( memSpec, 0 ); - SC_THREAD(powerWindow); + + // Create a thread that is triggered every $windowSize + // to generate a Power over Time plot in the Trace analyzer: + SC_THREAD(powerWindow); } printDebugMessage(string("ErrorStorageMode: ") + EnumToString(ErrorStoreMode)); @@ -193,8 +196,19 @@ struct Dram : sc_module { 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)/windowSize.value())); + printDebugMessage(string("\tAverage Power: \t") + to_string((DRAMPower->getEnergy().total_energy - totalEnergy)/windowSize.value())); + sumOfEnergyWindows += DRAMPower->getEnergy().total_energy - totalEnergy; + totalEnergy = DRAMPower->getEnergy().total_energy; + + // 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; } // Clean up: for (auto e : ememory) { @@ -203,6 +217,8 @@ struct Dram : sc_module //std::cout << "Simulated Memory Size: " << memory.size() << endl; // TODO Aufrauemen } + // This Thread is only triggered when Power Simulation is enabled. + // It estimated the current average power which will be stored in the trace database for visualization purposes. void powerWindow() { double currentAveragePower = 0; @@ -214,7 +230,9 @@ struct Dram : sc_module DRAMPower->calcEnergy(); currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy; currentAveragePower = currentTotalEnergy/windowSize.value(); + // TODO: Store $currentAveragePower in the trace database. totalEnergy = DRAMPower->getEnergy().total_energy; + sumOfEnergyWindows += currentTotalEnergy; printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy)); printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower));