-/* Copyright (c) 2017-2019. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2017-2020. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+#include "simgrid/Exception.hpp"
#include "simgrid/plugins/energy.h"
#include "simgrid/s4u/Engine.hpp"
#include "src/surf/network_interface.hpp"
SIMGRID_REGISTER_PLUGIN(link_energy, "Link energy consumption.", &sg_link_energy_plugin_init)
-/** @addtogroup SURF_plugin_energy
-
+/** @defgroup plugin_link_energy Plugin Link Energy
This is the link energy plugin, accounting for the dissipated energy in the simulated platform.
@verbatim
<link id="SWITCH1" bandwidth="125Mbps" latency="5us" sharing_policy="SHARED" >
- <prop id="watt_range" value="100.0:200.0" />
- <prop id="watt_off" value="10" />
+ <prop id="wattage_range" value="100.0:200.0" />
+ <prop id="wattage_off" value="10" />
</link>
@endverbatim
The second property means that when your host is turned off, it will dissipate only 10 Watts (please note that these
values are arbitrary).
- To simulate the energy-related elements, first call the simgrid#energy#sg_link_energy_plugin_init() before your
- #MSG_init(),
+ To simulate the energy-related elements, first call the sg_link_energy_plugin_init() before loading the platform
and then use the following function to retrieve the consumption of a given link: sg_link_get_consumed_energy().
*/
private:
double get_power();
- simgrid::s4u::Link* link_{};
+ s4u::Link* link_{};
bool inited_{false};
double idle_{0.0};
double last_updated_{0.0}; /*< Timestamp of the last energy update event*/
};
-simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> LinkEnergy::EXTENSION_ID;
+xbt::Extension<s4u::Link, LinkEnergy> LinkEnergy::EXTENSION_ID;
void LinkEnergy::update()
{
return;
inited_ = true;
- const char* all_power_values_str = this->link_->get_property("watt_range");
+ const char* all_power_values_str = this->link_->get_property("wattage_range");
+ if (all_power_values_str == nullptr) {
+ all_power_values_str = this->link_->get_property("watt_range");
+ if (all_power_values_str != nullptr)
+ XBT_WARN("Please rename the 'watt_range' property of link %s into 'wattage_range'.", link_->get_cname());
+ }
if (all_power_values_str == nullptr)
return;
/* max_power is the power consumed at 100% link load */
try {
idle_ = std::stod(current_power_values.front());
- } catch (std::invalid_argument& ia) {
+ } catch (const std::invalid_argument&) {
throw std::invalid_argument(std::string("Invalid idle power value for link ") + this->link_->get_cname());
}
try {
busy_ = std::stod(current_power_values.back());
- } catch (std::invalid_argument& ia) {
+ } catch (const std::invalid_argument&) {
throw std::invalid_argument(std::string("Invalid busy power value for link ") + this->link_->get_cname());
}
}
double LinkEnergy::get_power()
{
-
if (!inited_)
return 0.0;
double LinkEnergy::get_consumed_energy()
{
if (last_updated_ < surf_get_clock()) // We need to simcall this as it modifies the environment
- simgrid::simix::simcall(std::bind(&LinkEnergy::update, this));
+ kernel::actor::simcall(std::bind(&LinkEnergy::update, this));
return this->total_energy_;
}
} // namespace plugin
using simgrid::plugin::LinkEnergy;
/* **************************** events callback *************************** */
-static void on_communicate(simgrid::kernel::resource::NetworkAction* action, simgrid::s4u::Host*, simgrid::s4u::Host*)
+static void on_communicate(const simgrid::kernel::resource::NetworkAction& action, const simgrid::s4u::Host*,
+ const simgrid::s4u::Host*)
{
XBT_DEBUG("onCommunicate is called");
- for (simgrid::kernel::resource::LinkImpl* link : action->links()) {
-
- if (link == nullptr)
+ for (simgrid::kernel::resource::LinkImpl* link : action.links()) {
+ if (link == nullptr || link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI)
continue;
XBT_DEBUG("Update link %s", link->get_cname());
- LinkEnergy* link_energy = link->piface_.extension<LinkEnergy>();
+ LinkEnergy* link_energy = link->get_iface()->extension<LinkEnergy>();
link_energy->init_watts_range_list();
link_energy->update();
}
double total_energy = 0.0; // Total dissipated energy (whole platform)
for (const auto link : links) {
+ if (link == nullptr || link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI)
+ continue;
+
double link_energy = link->extension<LinkEnergy>()->get_consumed_energy();
total_energy += link_energy;
}
{
return LinkEnergy::EXTENSION_ID.valid();
}
-/** @ingroup SURF_plugin_energy
+/** @ingroup plugin_link_energy
* @brief Enable energy plugin
* @details Enable energy plugin to get joules consumption of each cpu. You should call this function before
- * #MSG_init().
+ * loading your platform.
*/
void sg_link_energy_plugin_init()
{
-
if (LinkEnergy::EXTENSION_ID.valid())
return;
LinkEnergy::EXTENSION_ID = simgrid::s4u::Link::extension_create<LinkEnergy>();
xbt_assert(sg_host_count() == 0, "Please call sg_link_energy_plugin_init() before initializing the platform.");
- simgrid::s4u::Link::on_creation.connect([](simgrid::s4u::Link& link) { link.extension_set(new LinkEnergy(&link)); });
+ simgrid::s4u::Link::on_creation.connect([](simgrid::s4u::Link& link) {
+ if (link.get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI) {
+ XBT_DEBUG("Wired Link created: %s", link.get_cname());
+ link.extension_set(new LinkEnergy(&link));
+ } else {
+ XBT_DEBUG("Not Wired link: %s", link.get_cname());
+ }
+ });
- simgrid::s4u::Link::on_state_change.connect([](simgrid::s4u::Link& link) { link.extension<LinkEnergy>()->update(); });
+ simgrid::s4u::Link::on_state_change.connect([](simgrid::s4u::Link const& link) {
+ if (link.get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI)
+ link.extension<LinkEnergy>()->update();
+ });
- simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link& link) {
- if (strcmp(link.get_cname(), "__loopback__"))
+ simgrid::s4u::Link::on_destruction.connect([](simgrid::s4u::Link const& link) {
+ if (link.get_name() != "__loopback__" && link.get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI)
XBT_INFO("Energy consumption of link '%s': %f Joules", link.get_cname(),
link.extension<LinkEnergy>()->get_consumed_energy());
});
- 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<LinkEnergy>()->update();
- }
- });
+ simgrid::s4u::Link::on_communication_state_change.connect([](
+ simgrid::kernel::resource::NetworkAction const& action, simgrid::kernel::resource::Action::State /* previous */) {
+ for (simgrid::kernel::resource::LinkImpl* link : action.links()) {
+ if (link != nullptr && link->get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI)
+ link->get_iface()->extension<LinkEnergy>()->update();
+ }
+ });
simgrid::s4u::Link::on_communicate.connect(&on_communicate);
- simgrid::s4u::on_simulation_end.connect(&on_simulation_end);
+ simgrid::s4u::Engine::on_simulation_end.connect(&on_simulation_end);
}
-/** @ingroup plugin_energy
+/** @ingroup plugin_link_energy
* @brief Returns the total energy consumed by the link so far (in Joules)
*
* Please note that since the consumption is lazily updated, it may require a simcall to update it.
* The result is that the actor requesting this value will be interrupted,
* the value will be updated in kernel mode before returning the control to the requesting actor.
*/
-double sg_link_get_consumed_energy(sg_link_t link)
+double sg_link_get_consumed_energy(const_sg_link_t link)
{
+ if (not LinkEnergy::EXTENSION_ID.valid())
+ throw simgrid::xbt::InitializationError("The Energy plugin is not active. Please call sg_link_energy_plugin_init() "
+ "before calling sg_link_get_consumed_energy().");
return link->extension<LinkEnergy>()->get_consumed_energy();
}