Power plots generation fixed.
This is the DRAMSys patch related to the following DRAMPower issue: https://github.com/ravenrd/DRAMPower/issues/31
This commit is contained in:
10
DRAMSys/analyzer/scripts/plots.py
Normal file → Executable file
10
DRAMSys/analyzer/scripts/plots.py
Normal file → Executable file
@@ -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("================================")
|
||||
|
||||
@@ -26,7 +26,7 @@ CREATE TABLE GeneralInfo(
|
||||
);
|
||||
|
||||
CREATE TABLE Power(
|
||||
time INTEGER,
|
||||
time DOUBLE,
|
||||
AveragePower DOUBLE
|
||||
);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user