X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6e69697a9af6a3491da415b4f8f73f962ed14124..937f2eb5b429c3c03fc989a25fbc26fabd0cf529:/src/plugins/link_energy.cpp diff --git a/src/plugins/link_energy.cpp b/src/plugins/link_energy.cpp index 17aa277f90..8bf16970b4 100644 --- a/src/plugins/link_energy.cpp +++ b/src/plugins/link_energy.cpp @@ -6,11 +6,14 @@ #include "simgrid/plugins/energy.h" #include "simgrid/s4u/Engine.hpp" #include "src/surf/network_interface.hpp" +#include "src/surf/surf_interface.hpp" #include "surf/surf.hpp" #include #include +SIMGRID_REGISTER_PLUGIN(link_energy, "Link energy consumption.", &sg_link_energy_plugin_init) + /** @addtogroup SURF_plugin_energy @@ -19,12 +22,12 @@ The energy consumption of a link depends directly on its current traffic load. Specify that consumption in your platform file as follows: - \verbatim + @verbatim - \endverbatim + @endverbatim The first property means that when your link is switched on, 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. @@ -45,15 +48,15 @@ class LinkEnergy { public: static simgrid::xbt::Extension EXTENSION_ID; - explicit LinkEnergy(simgrid::s4u::Link* ptr); - ~LinkEnergy(); + explicit LinkEnergy(simgrid::s4u::Link* ptr) : link_(ptr), last_updated_(surf_get_clock()) {} + ~LinkEnergy() = default; - void initWattsRangeList(); - double getConsumedEnergy(); + void init_watts_range_list(); + double get_consumed_energy(); void update(); private: - double getPower(); + double get_power(); simgrid::s4u::Link* link_{}; @@ -61,25 +64,21 @@ private: double idle_{0.0}; double busy_{0.0}; - double totalEnergy_{0.0}; - double lastUpdated_{0.0}; /*< Timestamp of the last energy update event*/ + double total_energy_{0.0}; + double last_updated_{0.0}; /*< Timestamp of the last energy update event*/ }; simgrid::xbt::Extension LinkEnergy::EXTENSION_ID; -LinkEnergy::LinkEnergy(simgrid::s4u::Link* ptr) : link_(ptr), lastUpdated_(surf_get_clock()) {} - -LinkEnergy::~LinkEnergy() = default; - void LinkEnergy::update() { - double power = getPower(); + double power = get_power(); double now = surf_get_clock(); - totalEnergy_ += power * (now - lastUpdated_); - lastUpdated_ = now; + total_energy_ += power * (now - last_updated_); + last_updated_ = now; } -void LinkEnergy::initWattsRangeList() +void LinkEnergy::init_watts_range_list() { if (inited_) @@ -104,19 +103,23 @@ void LinkEnergy::initWattsRangeList() /* min_power corresponds to the idle power (link load = 0) */ /* max_power is the power consumed at 100% link load */ - char* idleMsg = bprintf("Invalid idle power value for link%s", this->link_->get_cname()); - char* busyMsg = bprintf("Invalid busy power value for %s", this->link_->get_cname()); + try { + idle_ = std::stod(current_power_values.front()); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid idle power value for link ") + this->link_->get_cname()); + } - idle_ = xbt_str_parse_double((current_power_values.at(0)).c_str(), idleMsg); - busy_ = xbt_str_parse_double((current_power_values.at(1)).c_str(), busyMsg); + try { + busy_ = std::stod(current_power_values.back()); + } catch (std::invalid_argument& ia) { + throw std::invalid_argument(std::string("Invalid busy power value for link ") + this->link_->get_cname()); + } - xbt_free(idleMsg); - xbt_free(busyMsg); update(); } } -double LinkEnergy::getPower() +double LinkEnergy::get_power() { if (!inited_) @@ -130,11 +133,11 @@ double LinkEnergy::getPower() return idle_ + dynamic_power; } -double LinkEnergy::getConsumedEnergy() +double LinkEnergy::get_consumed_energy() { - if (lastUpdated_ < surf_get_clock()) // We need to simcall this as it modifies the environment + if (last_updated_ < surf_get_clock()) // We need to simcall this as it modifies the environment simgrid::simix::simcall(std::bind(&LinkEnergy::update, this)); - return this->totalEnergy_; + return this->total_energy_; } } // namespace plugin } // namespace simgrid @@ -142,8 +145,7 @@ double LinkEnergy::getConsumedEnergy() using simgrid::plugin::LinkEnergy; /* **************************** events callback *************************** */ -static void onCommunicate(simgrid::kernel::resource::NetworkAction* action, simgrid::s4u::Host* src, - simgrid::s4u::Host* dst) +static void on_communicate(simgrid::kernel::resource::NetworkAction* action, simgrid::s4u::Host*, simgrid::s4u::Host*) { XBT_DEBUG("onCommunicate is called"); for (simgrid::kernel::resource::LinkImpl* link : action->links()) { @@ -153,18 +155,18 @@ static void onCommunicate(simgrid::kernel::resource::NetworkAction* action, simg XBT_DEBUG("Update link %s", link->get_cname()); LinkEnergy* link_energy = link->piface_.extension(); - link_energy->initWattsRangeList(); + link_energy->init_watts_range_list(); link_energy->update(); } } -static void onSimulationEnd() +static void on_simulation_end() { std::vector links = simgrid::s4u::Engine::get_instance()->get_all_links(); double total_energy = 0.0; // Total dissipated energy (whole platform) for (const auto link : links) { - double link_energy = link->extension()->getConsumedEnergy(); + double link_energy = link->extension()->get_consumed_energy(); total_energy += link_energy; } @@ -176,9 +178,9 @@ int sg_link_energy_is_inited() { return LinkEnergy::EXTENSION_ID.valid(); } -/** \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 +/** @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(). */ void sg_link_energy_plugin_init() @@ -197,18 +199,19 @@ void sg_link_energy_plugin_init() simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link& link) { if (strcmp(link.get_cname(), "__loopback__")) XBT_INFO("Energy consumption of link '%s': %f Joules", link.get_cname(), - link.extension()->getConsumedEnergy()); + link.extension()->get_consumed_energy()); }); - simgrid::s4u::Link::on_communication_state_change.connect([](simgrid::kernel::resource::NetworkAction* action) { - for (simgrid::kernel::resource::LinkImpl* link : action->links()) { - if (link != nullptr) - link->piface_.extension()->update(); - } - }); + simgrid::s4u::Link::on_communication_state_change.connect( + [](simgrid::kernel::resource::NetworkAction* action, simgrid::kernel::resource::Action::State /* previous */) { + for (simgrid::kernel::resource::LinkImpl* link : action->links()) { + if (link != nullptr) + link->piface_.extension()->update(); + } + }); - simgrid::s4u::Link::on_communicate.connect(&onCommunicate); - simgrid::s4u::on_simulation_end.connect(&onSimulationEnd); + simgrid::s4u::Link::on_communicate.connect(&on_communicate); + simgrid::s4u::on_simulation_end.connect(&on_simulation_end); } /** @ingroup plugin_energy @@ -220,5 +223,5 @@ void sg_link_energy_plugin_init() */ double sg_link_get_consumed_energy(sg_link_t link) { - return link->extension()->getConsumedEnergy(); + return link->extension()->get_consumed_energy(); }