X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/700d4eee4a8f298501562f8a55686b371763d0ed..c52513a95d2f503e125b425e37fabaf11c046e9c:/src/surf/plugins/host_energy.cpp diff --git a/src/surf/plugins/host_energy.cpp b/src/surf/plugins/host_energy.cpp index 47b3f50d2e..17fd032048 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 */ @@ -104,7 +111,7 @@ void HostEnergy::update() double start_time = this->last_updated; double finish_time = surf_get_clock(); double cpu_load; - double current_speed = host->pimpl_cpu->getPstateSpeedCurrent(); + double current_speed = host->speed(); if (current_speed <= 0) // Some users declare a pstate of speed 0 flops (e.g., to model boot time). // We consider that the machine is then fully loaded. That's arbitrary but it avoids a NaN @@ -136,9 +143,11 @@ void HostEnergy::update() double energy_this_step = instantaneous_consumption * (finish_time - start_time); + //TODO Trace: Trace energy_this_step from start_time to finish_time in host->name() + 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 +187,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; @@ -268,6 +277,9 @@ static void onCreation(simgrid::s4u::Host& host) { if (dynamic_cast(&host)) // Ignore virtual machines return; + + //TODO Trace: set to zero the energy variable associated to host->name() + host.extension_set(new HostEnergy(&host)); } @@ -275,24 +287,24 @@ static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf: { for (simgrid::surf::Cpu* cpu : action->cpus()) { simgrid::s4u::Host* host = cpu->getHost(); - if (host == nullptr) - continue; + if (host != nullptr) { - // If it's a VM, take the corresponding PM - simgrid::s4u::VirtualMachine* vm = dynamic_cast(host); - if (vm) // If it's a VM, take the corresponding PM - host = vm->pimpl_vm_->getPm(); + // If it's a VM, take the corresponding PM + simgrid::s4u::VirtualMachine* vm = dynamic_cast(host); + if (vm) // If it's a VM, take the corresponding PM + host = vm->pimpl_vm_->getPm(); - // Get the host_energy extension for the relevant host - HostEnergy* host_energy = host->extension(); + // Get the host_energy extension for the relevant host + HostEnergy* host_energy = host->extension(); - if (host_energy->last_updated < surf_get_clock()) - host_energy->update(); + if (host_energy->last_updated < surf_get_clock()) + host_energy->update(); + } } } -/* 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 +312,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)