X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2a6382661d9ccbe7198decb53b042e715998a4c4..b372d23d3d8818b4547ef207f43b45709298a002:/src/plugins/host_energy.cpp diff --git a/src/plugins/host_energy.cpp b/src/plugins/host_energy.cpp index 9d35a37408..a09a39f538 100644 --- a/src/plugins/host_energy.cpp +++ b/src/plugins/host_energy.cpp @@ -137,6 +137,9 @@ class HostEnergy { */ 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 @@ -153,17 +156,14 @@ public: ~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 HostEnergy::EXTENSION_ID; @@ -171,7 +171,7 @@ simgrid::xbt::Extension 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 @@ -180,7 +180,7 @@ void HostEnergy::update() // 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(); @@ -188,17 +188,17 @@ void HostEnergy::update() // 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) @@ -228,28 +228,28 @@ 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()); @@ -292,7 +292,7 @@ double HostEnergy::get_current_watts_value() * * 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()); @@ -350,7 +350,7 @@ void HostEnergy::init_watts_range_list() 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 '") + @@ -481,9 +481,9 @@ static void on_action_state_change(simgrid::kernel::resource::CpuAction const& a host = vm->get_pm(); // Get the host_energy extension for the relevant host - HostEnergy* host_energy = host->extension(); + auto* host_energy = host->extension(); - if (host_energy->last_updated_ < surf_get_clock()) + if (host_energy->get_last_update_time() < surf_get_clock()) host_energy->update(); } } @@ -496,7 +496,7 @@ static void on_host_change(simgrid::s4u::Host const& host) if (dynamic_cast(&host)) // Ignore virtual machines return; - HostEnergy* host_energy = host.extension(); + auto* host_energy = host.extension(); host_energy->update(); } @@ -512,15 +512,13 @@ static void on_host_destruction(simgrid::s4u::Host const& host) static void on_simulation_end() { - std::vector 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(hosts[i]) == nullptr) { // Ignore virtual machines - double energy = hosts[i]->extension()->get_consumed_energy(); + for (simgrid::s4u::Host const* host : simgrid::s4u::Engine::get_instance()->get_all_hosts()) { + if (host && dynamic_cast(host) == nullptr) { // Ignore virtual machines + double energy = host->extension()->get_consumed_energy(); total_energy += energy; - if (hosts[i]->extension()->host_was_used_) + if (host->extension()->host_was_used_) used_hosts_energy += energy; } } @@ -553,7 +551,7 @@ void sg_host_energy_plugin_init() // 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(host);