/* 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 <simgrid/s4u/engine.hpp>
#include "simgrid/plugins/energy.h"
#include "simgrid/simix.hpp"
#include "src/plugins/vm/VirtualMachineImpl.hpp"
follows:
\verbatim
-<host id="HostA" power="100.0Mf" >
- <prop id="watt_per_state" value="100.0:200.0" />
+<host id="HostA" power="100.0Mf" cores="8">
+ <prop id="watt_per_state" value="100.0:120.0:200.0" />
<prop id="watt_off" value="10" />
</host>
\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).
\verbatim
<host id="HostB" power="100.0Mf,50.0Mf,20.0Mf" pstate="0" >
- <prop id="watt_per_state" value="95.0:200.0, 93.0:170.0, 90.0:150.0" />
+ <prop id="watt_per_state" value="95.0:120.0:200.0, 93.0:115.0:170.0, 90.0:110.0:150.0" />
<prop id="watt_off" value="10" />
</host>
\endverbatim
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().
namespace simgrid {
namespace energy {
-class XBT_PRIVATE HostEnergy;
-
class PowerRange {
public:
double idle;
}
}
-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<simgrid::s4u::VirtualMachine*>(&host)) // Ignore virtual machines
return;
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<HostEnergy>()->last_updated != 0);
+ double energy = 0.0;
+ energy = host_list[i]->extension<HostEnergy>()->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<HostEnergy>()->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()
{
HostEnergy::EXTENSION_ID = simgrid::s4u::Host::extension_create<HostEnergy>();
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);
}
"The Energy plugin is not active. Please call sg_energy_plugin_init() during initialization.");
return host->extension<HostEnergy>()->getWattMaxAt(pstate);
}
+
+SG_END_DECL()