X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/55a08c7439db5b0335a5b26e40b3a46e1e03d3e8..4b0fa756ae6e58a74c374a519389ecb9e8b6a4d9:/src/plugins/link_energy_wifi.cpp diff --git a/src/plugins/link_energy_wifi.cpp b/src/plugins/link_energy_wifi.cpp index f31afecc8a..b924517949 100644 --- a/src/plugins/link_energy_wifi.cpp +++ b/src/plugins/link_energy_wifi.cpp @@ -17,10 +17,11 @@ #include #include +#include SIMGRID_REGISTER_PLUGIN(link_energy_wifi, "Energy wifi test", &sg_wifi_energy_plugin_init); /** @degroup plugin_link_energy_wifi Plugin WiFi energy - * + * * This is the WiFi energy plugin, accounting for the dissipated energy of WiFi links. */ @@ -29,9 +30,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy_wifi, surf, "Logging specific to the namespace simgrid { namespace plugin { -//class __attribute__ ((visibility("hidden")))LinkEnergyWifi { -class LinkEnergyWifi { - +class XBT_PRIVATE LinkEnergyWifi { public: static simgrid::xbt::Extension EXTENSION_ID; @@ -44,11 +43,11 @@ public: * Update the energy consumed by link_ when transmissions start or end */ void update(const simgrid::kernel::resource::NetworkAction &); - + /** * Update the energy consumed when link_ is destroyed */ - void updateDestroy(); + void update_destroy(); /** * Fetches energy consumption values from the platform file. @@ -60,26 +59,30 @@ public: */ void init_watts_range_list(); - double getConsumedEnergy(void) { return eDyn_ + eStat_; } - double getEdyn(void) {return eDyn_; } - double getEstat(void) {return eStat_; } - double getDurTxRx(void){return durTxRx;} - double getDurIdle(void){return durIdle;} - - void setpIdle(double value) { pIdle_ = value; } - void setpTx(double value) { pTx_ = value; } - void setpRx(double value) { pRx_ = value; } - void setpSleep(double value) { pSleep_ = value; } - - + double get_consumed_energy(void) const { return eDyn_ + eStat_; } + /** Get the dynamic part of the energy for this link */ + double get_energy_dynamic(void) const { return eDyn_; } + double get_energy_static(void) const { return eStat_; } + double get_duration_comm(void) const { return dur_TxRx_; } + double get_duration_idle(void) const { return dur_idle_; } + + /** Set the power consumed by this link while idle */ + void set_power_idle(double value) { pIdle_ = value; } + /** Set the power consumed by this link while transmitting */ + void set_power_tx(double value) { pTx_ = value; } + /** Set the power consumed by this link while receiving */ + void set_power_rx(double value) { pRx_ = value; } + /** Set the power consumed by this link while sleeping */ + void set_power_sleep(double value) { pSleep_ = value; } + private: // associative array keeping size of data already sent for a given flow (required for interleaved actions) - std::map> flowTmp{}; + std::map> flowTmp{}; // WiFi link the plugin instance is attached to s4u::Link* link_{}; - - // dynamic energy (active durations consumption) + + // dynamic energy accumulated since the simulation start (active durations consumption) double eDyn_{0.0}; // static energy (no activity consumption) double eStat_{0.0}; @@ -95,32 +98,33 @@ private: double pSleep_{0.10}; // constant taking beacons into account (can be specified by the user) - double controlDuration_{0.0036}; + double control_duration_{0.0036}; // Measurements for report - double durTxRx{0}; - double durIdle{0}; + double dur_TxRx_{0}; // Duration of transmission + double dur_idle_{0}; // Duration of idle time bool valuesInit_{false}; }; xbt::Extension LinkEnergyWifi::EXTENSION_ID; -void LinkEnergyWifi::updateDestroy() { - simgrid::kernel::resource::NetworkWifiLink* wifi_link = - static_cast(link_->get_impl()); +void LinkEnergyWifi::update_destroy() +{ + auto const* wifi_link = static_cast(link_->get_impl()); double duration = surf_get_clock() - prev_update_; prev_update_ = surf_get_clock(); - durIdle += duration; + dur_idle_ += duration; // add IDLE energy usage, as well as beacons consumption since previous update - eDyn_ += duration*controlDuration_*wifi_link->get_nb_hosts_on_link()*pRx_; - eStat_ += (duration-(duration*controlDuration_)) * pIdle_ * (wifi_link->get_nb_hosts_on_link()+1); + eDyn_ += duration * control_duration_ * wifi_link->get_host_count() * pRx_; + eStat_ += (duration - (duration * control_duration_)) * pIdle_ * (wifi_link->get_host_count() + 1); - XBT_DEBUG("finish eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_nb_hosts_on_link(), eStat_); + XBT_DEBUG("finish eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_host_count(), eStat_); } -void LinkEnergyWifi::update(const simgrid::kernel::resource::NetworkAction& action) { +void LinkEnergyWifi::update(const simgrid::kernel::resource::NetworkAction&) +{ init_watts_range_list(); double duration = surf_get_clock() - prev_update_; @@ -130,32 +134,29 @@ void LinkEnergyWifi::update(const simgrid::kernel::resource::NetworkAction& acti if(duration < 1e-6) return; - simgrid::kernel::resource::NetworkWifiLink* wifi_link = - static_cast(link_->get_impl()); - + auto const* wifi_link = static_cast(link_->get_impl()); + const kernel::lmm::Variable* var; const kernel::lmm::Element* elem = nullptr; /** * We update the energy consumed by each flow active on the link since the previous update. - * To do this, we need to know how much time each flow has been effectively sending data on the WiFi link since the previous update (durUsage). - * We compute this value using the size of the flow, - * the amount of data already spent (using flowTmp), - * as well as the bandwidth used by the flow since the previous update (using LMM variables) - * Since flows are sharing the medium, the total active duration on the link is equal to the transmission/reception duration used by the flow with the longest active time since the previous update + * + * To do this, we need to know how much time each flow has been effectively sending data on the WiFi link since the + * previous update (durUsage). We compute this value using the size of the flow, the amount of data already spent + * (using flowTmp), as well as the bandwidth used by the flow since the previous update (using LMM variables). Since + * flows are sharing the medium, the total active duration on the link is equal to the transmission/reception duration + * used by the flow with the longest active time since the previous update */ double durUsage = 0; while((var = wifi_link->get_constraint()->get_variable(&elem))) { auto* action = static_cast(var->get_id()); XBT_DEBUG("cost: %f action value: %f link rate 1: %f link rate 2: %f", action->get_cost(), action->get_variable()->get_value(), wifi_link->get_host_rate(&action->get_src()),wifi_link->get_host_rate(&action->get_dst())); action->get_variable(); - - double du = 0; // durUsage on the current flow - std::map>::iterator it; if(action->get_variable()->get_value()) { - it = flowTmp.find(action); - + auto it = flowTmp.find(action); + // if the flow has not been registered, initialize it: 0 bytes sent, and not updated since its creation timestamp if(it == flowTmp.end()) flowTmp[action] = std::pair(0, action->get_start_time()); @@ -166,7 +167,8 @@ void LinkEnergyWifi::update(const simgrid::kernel::resource::NetworkAction& acti * The active duration of the link is equal to the amount of data it had to send divided by the bandwidth on the link. * If this is longer than the duration since the previous update, active duration = now - previous_update */ - du = (action->get_cost()-it->second.first) / action->get_variable()->get_value(); + double du = // durUsage on the current flow + (action->get_cost() - it->second.first) / action->get_variable()->get_value(); if(du > surf_get_clock()-it->second.second) du = surf_get_clock()-it->second.second; @@ -188,7 +190,7 @@ void LinkEnergyWifi::update(const simgrid::kernel::resource::NetworkAction& acti XBT_DEBUG("durUsage: %f", durUsage); // beacons cost - eDyn_+=duration*controlDuration_*wifi_link->get_nb_hosts_on_link()*pRx_; + eDyn_ += duration * control_duration_ * wifi_link->get_host_count() * pRx_; /** * Same principle as ns3: @@ -197,19 +199,18 @@ void LinkEnergyWifi::update(const simgrid::kernel::resource::NetworkAction& acti * P_{tot} = P_{dyn}+P_{stat} */ if(link_->get_usage()){ - eDyn_ += /*duration * */durUsage * ((wifi_link->get_nb_hosts_on_link()*pRx_)+pTx_); - eStat_ += (duration-durUsage)* pIdle_ * (wifi_link->get_nb_hosts_on_link()+1); - XBT_DEBUG("eDyn += %f * ((%d * %f) + %f) | eDyn = %f (durusage =%f)", durUsage, wifi_link->get_nb_hosts_on_link(), pRx_, pTx_, eDyn_, durUsage); - durTxRx+=duration; + eDyn_ += /*duration * */ durUsage * ((wifi_link->get_host_count() * pRx_) + pTx_); + eStat_ += (duration - durUsage) * pIdle_ * (wifi_link->get_host_count() + 1); + XBT_DEBUG("eDyn += %f * ((%d * %f) + %f) | eDyn = %f (durusage =%f)", durUsage, wifi_link->get_host_count(), pRx_, + pTx_, eDyn_, durUsage); + dur_TxRx_ += duration; }else{ - durIdle+=duration; - eStat_ += (duration-(duration*controlDuration_)) * pIdle_ * (wifi_link->get_nb_hosts_on_link()+1); + dur_idle_ += duration; + eStat_ += (duration - (duration * control_duration_)) * pIdle_ * (wifi_link->get_host_count() + 1); } - XBT_DEBUG("eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_nb_hosts_on_link(), eStat_); + XBT_DEBUG("eStat_ += %f * %f * (%d+1) | eStat = %f", duration, pIdle_, wifi_link->get_host_count(), eStat_); } - - void LinkEnergyWifi::init_watts_range_list() { @@ -224,7 +225,7 @@ void LinkEnergyWifi::init_watts_range_list() const char* beacons_factor = this->link_->get_property("control_duration"); if(beacons_factor != nullptr) { try { - controlDuration_ = std::stod(beacons_factor); + control_duration_ = std::stod(beacons_factor); } catch (const std::invalid_argument&) { throw std::invalid_argument(std::string("Invalid beacons factor value for link ") + this->link_->get_cname()); } @@ -279,10 +280,10 @@ using simgrid::plugin::LinkEnergyWifi; void sg_wifi_energy_plugin_init() { - XBT_DEBUG("Initialization wifi_energy plugin"); - if (LinkEnergyWifi::EXTENSION_ID.valid()) return; + + XBT_INFO("Activating the wifi_energy plugin."); LinkEnergyWifi::EXTENSION_ID = simgrid::s4u::Link::extension_create(); /** @@ -296,7 +297,7 @@ void sg_wifi_energy_plugin_init() // verify the link is appropriate to WiFi energy computations if (link.get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { XBT_DEBUG("Wifi Link: %s, initialization of wifi energy plugin", link.get_cname()); - LinkEnergyWifi* plugin = new LinkEnergyWifi(&link); + auto* plugin = new LinkEnergyWifi(&link); link.extension_set(plugin); } else { XBT_DEBUG("Not Wifi Link: %s, wifi energy on link not computed", link.get_cname()); @@ -306,21 +307,20 @@ void sg_wifi_energy_plugin_init() simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link const& link) { // output energy values if WiFi link if (link.get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { - link.extension()->updateDestroy(); - XBT_INFO("Link %s destroyed, consumed: %f J dyn: %f stat: %f durIdle: %f durTxRx: %f", link.get_cname(), - link.extension()->getConsumedEnergy(), - link.extension()->getEdyn(), - link.extension()->getEstat(), - link.extension()->getDurIdle(), - link.extension()->getDurTxRx() - ); + link.extension()->update_destroy(); + XBT_INFO( + "Link %s destroyed, consumed: %f J dyn: %f stat: %f durIdle: %f durTxRx: %f", link.get_cname(), + link.extension()->get_consumed_energy(), + link.extension()->get_energy_dynamic(), link.extension()->get_energy_static(), + link.extension()->get_duration_idle(), link.extension()->get_duration_comm()); } }); simgrid::s4u::Link::on_communication_state_change.connect( - [](simgrid::kernel::resource::NetworkAction const& action, simgrid::kernel::resource::Action::State previous) { + [](simgrid::kernel::resource::NetworkAction const& action, + simgrid::kernel::resource::Action::State /* previous */) { // update WiFi links encountered during the communication - for (simgrid::kernel::resource::LinkImpl* link : action.get_links()) { + for (auto const* link : action.get_links()) { if (link != nullptr && link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI) { link->get_iface()->extension()->update(action); } @@ -328,19 +328,17 @@ void sg_wifi_energy_plugin_init() }); simgrid::s4u::Link::on_communicate.connect([](const simgrid::kernel::resource::NetworkAction& action) { - const simgrid::kernel::resource::NetworkWifiAction* actionWifi = dynamic_cast(&action); + auto const* actionWifi = dynamic_cast(&action); - if(actionWifi == nullptr) + if (actionWifi == nullptr) return; - auto link_src = actionWifi->get_src_link(); - auto link_dst = actionWifi->get_dst_link(); + auto const* link_src = actionWifi->get_src_link(); + auto const* link_dst = actionWifi->get_dst_link(); if(link_src != nullptr) link_src->get_iface()->extension()->update(action); if(link_dst != nullptr) link_dst->get_iface()->extension()->update(action); - }); - }