SIMGRID_REGISTER_PLUGIN(host_energy, "Cpu energy consumption.", &sg_host_energy_plugin_init)
-/** @defgroup plugin_host_energy
+/** @defgroup plugin_host_energy plugin_host_energy Plugin Host Energy
@beginrst
This is the energy plugin, enabling to account not only for computation time, but also for the dissipated energy in the
simulated platform.
-To activate this plugin, first call :cpp:func:`sg_host_energy_plugin_init()` before your :cpp:func:`MSG_init()`, and
-then use :cpp:func:`MSG_host_get_consumed_energy()` to retrieve the consumption of a given host.
+To activate this plugin, first call :cpp:func:`sg_host_energy_plugin_init()` before your loading your platform, and
+then use :cpp:func:`sg_host_get_consumed_energy()` to retrieve the consumption of a given host.
When the host is on, this energy consumption naturally depends on both the current CPU load and the host energy profile.
According to our measurements, the consumption is somehow linear in the amount of cores at full speed, with an
As a result, our energy model takes 4 parameters:
- ``Idle`` wattage (i.e., instantaneous consumption in Watt) when your host is up and running, but without anything to
-do.
+ do.
- ``Epsilon`` wattage when all cores are at 0 or epsilon%, but not in Idle state.
- ``AllCores`` wattage when all cores of the host are at 100%.
- ``Off`` wattage when the host is turned off.
*/
int pstate_ = 0;
const int pstate_off_ = -1;
+ double watts_off_ = 0.0; /*< Consumption when the machine is turned off (shutdown) */
+ double total_energy_ = 0.0; /*< Total energy consumed by the host */
+ double last_updated_ = surf_get_clock(); /*< Timestamp of the last energy update event*/
/* Only used to split total energy into unused/used hosts.
* If you want to get this info for something else, rather use the host_load plugin
double get_watt_min_at(int pstate);
double get_watt_max_at(int pstate);
double get_power_range_slope_at(int pstate);
+ double get_last_update_time() { return last_updated_; }
void update();
-
- double watts_off_ = 0.0; /*< Consumption when the machine is turned off (shutdown) */
- double total_energy_ = 0.0; /*< Total energy consumed by the host */
- double last_updated_ = surf_get_clock(); /*< Timestamp of the last energy update event*/
};
simgrid::xbt::Extension<simgrid::s4u::Host, HostEnergy> HostEnergy::EXTENSION_ID;
/* Computes the consumption so far. Called lazily on need. */
void HostEnergy::update()
{
- double start_time = this->last_updated_;
+ double start_time = last_updated_;
double finish_time = surf_get_clock();
//
// We may have start == finish if the past consumption was updated since the simcall was started
// Even in this case, we need to save the pstate for the next call (after this if),
// which may have changed since that recent update.
if (start_time < finish_time) {
- double previous_energy = this->total_energy_;
+ double previous_energy = total_energy_;
double instantaneous_power_consumption = this->get_current_watts_value();
// TODO Trace: Trace energy_this_step from start_time to finish_time in host->getName()
- this->total_energy_ = previous_energy + energy_this_step;
- this->last_updated_ = finish_time;
+ total_energy_ = previous_energy + energy_this_step;
+ last_updated_ = finish_time;
XBT_DEBUG("[update_energy of %s] period=[%.8f-%.8f]; current speed=%.2E flop/s (pstate %i); total consumption "
"before: %.8f J -> added now: %.8f J",
- host_->get_cname(), start_time, finish_time, host_->get_pstate_speed(this->pstate_), this->pstate_,
- previous_energy, energy_this_step);
+ host_->get_cname(), start_time, finish_time, host_->get_pstate_speed(pstate_), pstate_, previous_energy,
+ energy_this_step);
}
/* Save data for the upcoming time interval: whether it's on/off and the pstate if it's on */
- this->pstate_ = host_->is_on() ? host_->get_pstate() : pstate_off_;
+ pstate_ = host_->is_on() ? host_->get_pstate() : pstate_off_;
}
HostEnergy::HostEnergy(simgrid::s4u::Host* ptr) : host_(ptr)
// Get the host_energy extension for the relevant host
HostEnergy* host_energy = host->extension<HostEnergy>();
- if (host_energy->last_updated_ < surf_get_clock())
+ if (host_energy->get_last_update_time() < surf_get_clock())
host_energy->update();
}
}
static void on_simulation_end()
{
- std::vector<simgrid::s4u::Host*> hosts = simgrid::s4u::Engine::get_instance()->get_all_hosts();
-
double total_energy = 0.0; // Total energy consumption (whole platform)
double used_hosts_energy = 0.0; // Energy consumed by hosts that computed something
- for (size_t i = 0; i < hosts.size(); i++) {
- if (dynamic_cast<simgrid::s4u::VirtualMachine*>(hosts[i]) == nullptr) { // Ignore virtual machines
- double energy = hosts[i]->extension<HostEnergy>()->get_consumed_energy();
+ for (simgrid::s4u::Host const* host : simgrid::s4u::Engine::get_instance()->get_all_hosts()) {
+ if (dynamic_cast<const simgrid::s4u::VirtualMachine*>(host) == nullptr) { // Ignore virtual machines
+ double energy = host->extension<HostEnergy>()->get_consumed_energy();
total_energy += energy;
- if (hosts[i]->extension<HostEnergy>()->host_was_used_)
+ if (host->extension<HostEnergy>()->host_was_used_)
used_hosts_energy += energy;
}
}