*/
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
~HostEnergy();
double get_current_watts_value();
- double get_current_watts_value(double cpu_load);
+ double get_current_watts_value(double cpu_load) const;
double get_consumed_energy();
- double get_watt_idle_at(int pstate);
- double get_watt_min_at(int pstate);
- double get_watt_max_at(int pstate);
- double get_power_range_slope_at(int pstate);
+ double get_watt_idle_at(int pstate) const;
+ double get_watt_min_at(int pstate) const;
+ double get_watt_max_at(int pstate) const;
+ double get_power_range_slope_at(int pstate) const;
+ double get_last_update_time() const { 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)
HostEnergy::~HostEnergy() = default;
-double HostEnergy::get_watt_idle_at(int pstate)
+double HostEnergy::get_watt_idle_at(int pstate) const
{
xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
host_->get_cname());
return power_range_watts_list_[pstate].idle_;
}
-double HostEnergy::get_watt_min_at(int pstate)
+double HostEnergy::get_watt_min_at(int pstate) const
{
xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
host_->get_cname());
return power_range_watts_list_[pstate].epsilon_;
}
-double HostEnergy::get_watt_max_at(int pstate)
+double HostEnergy::get_watt_max_at(int pstate) const
{
xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
host_->get_cname());
return power_range_watts_list_[pstate].max_;
}
-double HostEnergy::get_power_range_slope_at(int pstate)
+double HostEnergy::get_power_range_slope_at(int pstate) const
{
xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
host_->get_cname());
*
* Whether the host is ON or OFF is not taken into account.
*/
-double HostEnergy::get_current_watts_value(double cpu_load)
+double HostEnergy::get_current_watts_value(double cpu_load) const
{
xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
host_->get_cname());
host_->get_pstate_count());
// XBT_ATTRIB_DEPRECATED_v328: putting this macro name here so that we find it during the deprecation cleanups
- std::string msg = std::string("DEPRECATION WARNING: Property 'watt_per_state' will only work until v3.28.\n");
+ std::string msg = "DEPRECATION WARNING: Property 'watt_per_state' will only work until v3.28.\n";
msg += std::string("The old syntax 'Idle:OneCore:AllCores' must be converted into 'Idle:Epsilon:AllCores' to "
"properly model the consumption of non-whole tasks on mono-core hosts. Here are the values to "
"use for host '") +
host = vm->get_pm();
// Get the host_energy extension for the relevant host
- HostEnergy* host_energy = host->extension<HostEnergy>();
+ auto* 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();
}
}
if (dynamic_cast<simgrid::s4u::VirtualMachine const*>(&host)) // Ignore virtual machines
return;
- HostEnergy* host_energy = host.extension<HostEnergy>();
+ auto* host_energy = host.extension<HostEnergy>();
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 (host && 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;
}
}
// that the next trigger would be the 2nd compute, hence ignoring the idle time
// during the recv call. By updating at the beginning of a compute, we can
// fix that. (If the cpu is not idle, this is not required.)
- simgrid::s4u::Exec::on_start.connect([](simgrid::s4u::Actor const&, simgrid::s4u::Exec const& activity) {
+ simgrid::s4u::Exec::on_start.connect([](simgrid::s4u::Exec const& activity) {
if (activity.get_host_number() == 1) { // We only run on one host
simgrid::s4u::Host* host = activity.get_host();
const simgrid::s4u::VirtualMachine* vm = dynamic_cast<simgrid::s4u::VirtualMachine*>(host);