Time 0-100: Pstate 0 was used
Time 100: Pstate 1 is now used
The energy plugin used Pstate 1 at point 100 to compute the energy
consumed from time 0 to time 100. Of course, pstate 0 needs to be used
but the plugin had no way to keep track of that.
This patch fixes that
simgrid::s4u::Host* host = nullptr;
std::vector<PowerRange>
power_range_watts_list; /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
simgrid::s4u::Host* host = nullptr;
std::vector<PowerRange>
power_range_watts_list; /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
+
+ /* We need to keep track of what pstate has been used, as we will sometimes
+ * be notified only *after* a pstate has been used (but we need to update the energy consumption
+ * with the old pstate!)
+ */
+ int pstate = 0;
+
public:
double watts_off = 0.0; /*< Consumption when the machine is turned off (shutdown) */
double total_energy = 0.0; /*< Total energy consumed by the host */
public:
double watts_off = 0.0; /*< Consumption when the machine is turned off (shutdown) */
double total_energy = 0.0; /*< Total energy consumed by the host */
this->total_energy = previous_energy + energy_this_step;
this->last_updated = finish_time;
this->total_energy = previous_energy + energy_this_step;
this->last_updated = finish_time;
+ this->pstate = host->pstate();
XBT_DEBUG(
"[update_energy of %s] period=[%.2f-%.2f]; current power peak=%.0E flop/s; consumption change: %.2f J -> %.2f J",
host->cname(), start_time, finish_time, host->pimpl_cpu->speed_.peak, previous_energy, energy_this_step);
XBT_DEBUG(
"[update_energy of %s] period=[%.2f-%.2f]; current power peak=%.0E flop/s; consumption change: %.2f J -> %.2f J",
host->cname(), start_time, finish_time, host->pimpl_cpu->speed_.peak, previous_energy, energy_this_step);
/* min_power corresponds to the power consumed when only one core is active */
/* max_power is the power consumed at 100% cpu load */
/* min_power corresponds to the power consumed when only one core is active */
/* max_power is the power consumed at 100% cpu load */
- auto range = power_range_watts_list.at(host->pstate());
+ auto range = power_range_watts_list.at(this->pstate);
double current_power = 0;
double min_power = 0;
double max_power = 0;
double current_power = 0;
double min_power = 0;
double max_power = 0;
-/* This callback is fired either when the host change its state (on/off) or its speed
- * (because the user changed the pstate, or because of external trace events) */
+/* This callback is fired either when the host changes its state (on/off) ("onStateChange") or its speed
+ * (because the user changed the pstate, or because of external trace events) ("onSpeedChange") */
static void onHostChange(simgrid::s4u::Host& host)
{
if (dynamic_cast<simgrid::s4u::VirtualMachine*>(&host)) // Ignore virtual machines
static void onHostChange(simgrid::s4u::Host& host)
{
if (dynamic_cast<simgrid::s4u::VirtualMachine*>(&host)) // Ignore virtual machines
HostEnergy* host_energy = host.extension<HostEnergy>();
HostEnergy* host_energy = host.extension<HostEnergy>();
- if (host_energy->last_updated < surf_get_clock())
- host_energy->update();
}
static void onHostDestruction(simgrid::s4u::Host& host)
}
static void onHostDestruction(simgrid::s4u::Host& host)