LibDRAMPower Update

This commit is contained in:
Felipe S. Prado
2016-10-24 20:06:23 +02:00
parent 5a5e170e77
commit d039e4fc19
2 changed files with 10 additions and 42 deletions

View File

@@ -524,8 +524,8 @@ double errorModel::getTemperature()
if (thermalSim == true && powerAnalysis == true) {
// TODO
// check if this is best way to request information to DRAMPower.
DRAMPower->updateCounters(true);
DRAMPower->calcEnergy();
unsigned long long clk_cycles = sc_time_stamp().value() / Configuration::getInstance().memSpec.clk.value();
DRAMPower->calcWindowEnergy(clk_cycles);
float average_power = (float)DRAMPower->getPower().average_power;
temperature = TemperatureController::getInstance().getTemperature(this->myChannel, average_power);
} else {

View File

@@ -76,7 +76,6 @@ struct Dram : sc_module
bool powerAnalysis = Configuration::getInstance().PowerAnalysis;
sc_time powerWindowSize = Configuration::getInstance().memSpec.clk*Configuration::getInstance().WindowSize;
libDRAMPower *DRAMPower;
double sumOfEnergyWindows = 0.0;
// Bandwidth realted:
unsigned long long int numberOfTransactionsServed;
@@ -217,18 +216,13 @@ struct Dram : sc_module
{
if (powerAnalysis == true) {
// Obtain the residual energy which was not covered by previous windows
DRAMPower->updateCounters(true);
DRAMPower->calcEnergy();
double totalEnergy = sumOfEnergyWindows + DRAMPower->getEnergy().total_energy * Configuration::getInstance().NumberOfDevicesOnDIMM;
// The energy is given in [pJ] and divided by [s] resulting in [pW] then converted to [mW]
double averagePower = (totalEnergy/ sc_time_stamp().to_seconds()) / 1e9;
tlmRecorder->recordPower(sc_time_stamp().to_seconds(), DRAMPower->getPower().average_power * Configuration::getInstance().NumberOfDevicesOnDIMM);
tlmRecorder->recordPower(sc_time_stamp().to_seconds(), DRAMPower->getPower().window_average_power * Configuration::getInstance().NumberOfDevicesOnDIMM);
// Print the final total energy and the average power for the simulation
cout << name() << string("\tTotal Energy: \t") << fixed <<std::setprecision( 2 )<< totalEnergy << string(" pJ") << endl;
cout << name() << string("\tAverage Power: \t") << fixed <<std::setprecision( 2 )<< averagePower<< string(" mW") << endl;
cout << name() << string("\tTotal Energy: \t") << fixed <<std::setprecision( 2 )<< DRAMPower->getEnergy().total_energy * Configuration::getInstance().NumberOfDevicesOnDIMM << string(" pJ") << endl;
cout << name() << string("\tAverage Power: \t") << fixed <<std::setprecision( 2 )<< DRAMPower->getPower().average_power * Configuration::getInstance().NumberOfDevicesOnDIMM<< string(" mW") << endl;
}
// Bandwidth:
@@ -265,8 +259,6 @@ struct Dram : sc_module
// It estimates the current average power which will be stored in the trace database for visualization purposes.
void powerWindow()
{
double currentAveragePower = 0;
double currentTotalEnergy = 0;
unsigned long long clk_cycles = 0;
do {
@@ -275,41 +267,17 @@ struct Dram : sc_module
clk_cycles = sc_time_stamp().value() / Configuration::getInstance().memSpec.clk.value();
DRAMPower->doCommand(MemCommand::NOP, 0, clk_cycles);
DRAMPower->updateCounters(false);
DRAMPower->calcEnergy();
currentTotalEnergy = DRAMPower->getEnergy().total_energy * Configuration::getInstance().NumberOfDevicesOnDIMM;
currentAveragePower = DRAMPower->getPower().average_power * Configuration::getInstance().NumberOfDevicesOnDIMM;
DRAMPower->clearCounters(clk_cycles);
DRAMPower->calcWindowEnergy(clk_cycles);
// During operation the energy should never be zero since the device is always consuming
assert(!is_equal(currentTotalEnergy, 0.0));
// Accumulate the energy since we are clearing the library
// counters.
//
// Here we use double values. The double type ensures 15 decimal
// digits to represent a number. It does not matter if the digits
// are before or after the comma. Thus we only have rounding for
// numbers represented with more than 15 decimal digits.
//
// In more technical terms:
// An IEEE double has 53 significant bits (see also DBL_MANT_DIG
// in <cfloat>). That is approximately 15.95 decimal digits
// (log10(2^53)). The implementation sets the number of digits
// (DBL_DIG) to 15, not 16, because it has to round down.
//
sumOfEnergyWindows += currentTotalEnergy;
assert(!is_equal(DRAMPower->getEnergy().window_energy, 0.0));
// Store the time (in seconds) and the current average power (in mW) into the database
tlmRecorder->recordPower(sc_time_stamp().to_seconds(), currentAveragePower);
tlmRecorder->recordPower(sc_time_stamp().to_seconds(), DRAMPower->getPower().window_average_power * Configuration::getInstance().NumberOfDevicesOnDIMM);
// Here considering that DRAMPower provides the energy in pJ and the power in mW
printDebugMessage(string("\tCurrent Energy: \t") + to_string(currentTotalEnergy) + string("\t[pJ]"));
printDebugMessage(string("\tAverage Power: \t") + to_string(currentAveragePower) + string("\t[mW]"));
printDebugMessage(string("\tWindow Energy: \t") + to_string(DRAMPower->getEnergy().window_energy * Configuration::getInstance().NumberOfDevicesOnDIMM) + string("\t[pJ]"));
printDebugMessage(string("\tWindow Average Power: \t") + to_string(DRAMPower->getPower().window_average_power * Configuration::getInstance().NumberOfDevicesOnDIMM) + string("\t[mW]"));
} while(true);
}