From: Christian Heinrich Date: Fri, 10 Mar 2017 13:38:33 +0000 (+0100) Subject: [ENERGY] Energy wasn't computed correctly when pstates are changed X-Git-Tag: v3_15~156 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f53de8e7017c7b01248f73cd38ac1d88bee5cc67?ds=sidebyside [ENERGY] Energy wasn't computed correctly when pstates are changed 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 --- diff --git a/src/surf/plugins/host_energy.cpp b/src/surf/plugins/host_energy.cpp index 47b3f50d2e..a604f3c4a8 100644 --- a/src/surf/plugins/host_energy.cpp +++ b/src/surf/plugins/host_energy.cpp @@ -90,6 +90,13 @@ private: simgrid::s4u::Host* host = nullptr; std::vector 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 */ @@ -138,7 +145,7 @@ void HostEnergy::update() 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); @@ -178,7 +185,7 @@ double HostEnergy::getCurrentWattsValue(double 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; @@ -291,8 +298,8 @@ static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf: } } -/* 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(&host)) // Ignore virtual machines @@ -300,8 +307,7 @@ static void onHostChange(simgrid::s4u::Host& host) HostEnergy* host_energy = host.extension(); - if (host_energy->last_updated < surf_get_clock()) - host_energy->update(); + host_energy->update(); } static void onHostDestruction(simgrid::s4u::Host& host)