#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 <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
+SIMGRID_REGISTER_PLUGIN(link_energy, "Link energy consumption.", &sg_link_energy_plugin_init)
+
/** @addtogroup SURF_plugin_energy
public:
static simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> 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_{};
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<simgrid::s4u::Link, LinkEnergy> 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_)
/* 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_)
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
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()) {
XBT_DEBUG("Update link %s", link->get_cname());
LinkEnergy* link_energy = link->piface_.extension<LinkEnergy>();
- link_energy->initWattsRangeList();
+ link_energy->init_watts_range_list();
link_energy->update();
}
}
-static void onSimulationEnd()
+static void on_simulation_end()
{
std::vector<simgrid::s4u::Link*> 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<LinkEnergy>()->getConsumedEnergy();
+ double link_energy = link->extension<LinkEnergy>()->get_consumed_energy();
total_energy += link_energy;
}
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<LinkEnergy>()->getConsumedEnergy());
+ link.extension<LinkEnergy>()->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<LinkEnergy>()->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<LinkEnergy>()->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
*/
double sg_link_get_consumed_energy(sg_link_t link)
{
- return link->extension<LinkEnergy>()->getConsumedEnergy();
+ return link->extension<LinkEnergy>()->get_consumed_energy();
}