X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3913458ae82f2f5e35f19faa879420b09f4bfa49..c6fc463d75e4daa67ddf9c460cbc473b1aa9d6ba:/src/surf/plugins/host_energy.cpp diff --git a/src/surf/plugins/host_energy.cpp b/src/surf/plugins/host_energy.cpp index 7a3029a10b..13a867db94 100644 --- a/src/surf/plugins/host_energy.cpp +++ b/src/surf/plugins/host_energy.cpp @@ -3,6 +3,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include #include "simgrid/plugins/energy.h" #include "simgrid/simix.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" @@ -19,14 +20,14 @@ The energy consumption of a CPU depends directly of its current load. Specify th follows: \verbatim - - + + \endverbatim The first property means that when your host is up and running, but without anything to do, it will dissipate 100 Watts. -If it's fully loaded, it will dissipate 200 Watts. If its load is at 50%, then it will dissipate 150 Watts. +If only one care is active, it will dissipate 120 Watts. If it's fully loaded, it will dissipate 200 Watts. If its load is at 50%, then it will dissipate 153.33 Watts. The second property means that when your host is turned off, it will dissipate only 10 Watts (please note that these values are arbitrary). @@ -34,7 +35,7 @@ If your CPU is using pstates, then you can provide one consumption interval per \verbatim - + \endverbatim @@ -43,7 +44,7 @@ That host has 3 levels of performance with the following performance: 100 Mflop/ It starts at pstate 0 (ie, at 100 Mflop/s). In this case, you have to specify one interval per pstate in the watt_per_state property. In this example, the idle consumption is 95 Watts, 93 Watts and 90 Watts in each pstate while the CPU burn consumption -are at 200 Watts, 170 Watts, and 150 Watts respectively. +are at 200 Watts, 170 Watts, and 150 Watts respectively. If only one core is active, this machine consumes 120 / 115 / 110 watts. To change the pstate of a given CPU, use the following functions: #MSG_host_get_nb_pstates(), simgrid#s4u#Host#setPstate(), #MSG_host_get_power_peak_at(). @@ -57,8 +58,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_energy, surf, "Logging specific to the SURF namespace simgrid { namespace energy { -class XBT_PRIVATE HostEnergy; - class PowerRange { public: double idle; @@ -286,7 +285,9 @@ static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf: } } -static void onHostStateChange(simgrid::s4u::Host& host) +/* 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) */ +static void onHostChange(simgrid::s4u::Host& host) { if (dynamic_cast(&host)) // Ignore virtual machines return; @@ -307,11 +308,38 @@ static void onHostDestruction(simgrid::s4u::Host& host) XBT_INFO("Total energy of host %s: %f Joules", host.cname(), host_energy->getConsumedEnergy()); } +static void onSimulationEnd() +{ + sg_host_t* host_list = sg_host_list(); + int host_count = sg_host_count(); + double total_energy = 0.0; // Total energy consumption (whole plattform) + double used_hosts_energy = 0.0; // Energy consumed by hosts that computed something + for (int i = 0; i < host_count; i++) { + bool host_was_used = (host_list[i]->extension()->last_updated != 0); + double energy = 0.0; + energy = host_list[i]->extension()->getConsumedEnergy(); + total_energy += energy; + if (host_was_used) + used_hosts_energy += energy; + } + XBT_INFO("Summed energy consumption: %f Joules; used hosts consumed: %f Joules; unused (idle) hosts consumed: %f", + total_energy, used_hosts_energy, total_energy - used_hosts_energy); +} + sg_host_t* host_list = sg_host_list(); + int host_count = sg_host_count(); + double energy = 0.0; + for (int i = 0; i < host_count; i++) { + energy += host_list[i]->extension()->getConsumedEnergy(); + } + XBT_INFO("Summed energy consumption: %f Joules", energy); +} + /* **************************** Public interface *************************** */ +SG_BEGIN_DECL() + /** \ingroup SURF_plugin_energy - * \brief Enable energy plugin - * \details Enable energy plugin to get joules consumption of each cpu. You should call this function before - * #MSG_init(). + * \brief Enable host energy plugin + * \details Enable energy plugin to get joules consumption of each cpu. Call this function before #MSG_init(). */ void sg_host_energy_plugin_init() { @@ -321,8 +349,10 @@ void sg_host_energy_plugin_init() HostEnergy::EXTENSION_ID = simgrid::s4u::Host::extension_create(); simgrid::s4u::Host::onCreation.connect(&onCreation); - simgrid::s4u::Host::onStateChange.connect(&onHostStateChange); + simgrid::s4u::Host::onStateChange.connect(&onHostChange); + simgrid::s4u::Host::onSpeedChange.connect(&onHostChange); simgrid::s4u::Host::onDestruction.connect(&onHostDestruction); + simgrid::s4u::onSimulationEnd.connect(&onSimulationEnd); simgrid::surf::CpuAction::onStateChange.connect(&onActionStateChange); } @@ -351,3 +381,5 @@ double sg_host_get_wattmax_at(sg_host_t host, int pstate) "The Energy plugin is not active. Please call sg_energy_plugin_init() during initialization."); return host->extension()->getWattMaxAt(pstate); } + +SG_END_DECL()