-/* Copyright (c) 2017-2020. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2017-2022. 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/host.h"
#include "simgrid/plugins/energy.h"
#include "simgrid/s4u/Engine.hpp"
-#include "src/surf/network_interface.hpp"
+#include "simgrid/s4u/Link.hpp"
+#include "src/kernel/activity/CommImpl.hpp"
#include "src/surf/surf_interface.hpp"
-#include "surf/surf.hpp"
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
and then use the following function to retrieve the consumption of a given link: sg_link_get_consumed_energy().
*/
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy, surf, "Logging specific to the SURF LinkEnergy plugin");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(link_energy, kernel, "Logging specific to the LinkEnergy plugin");
namespace simgrid {
namespace plugin {
class LinkEnergy {
-public:
- static simgrid::xbt::Extension<simgrid::s4u::Link, LinkEnergy> EXTENSION_ID;
-
- explicit LinkEnergy(simgrid::s4u::Link* ptr) : link_(ptr), last_updated_(surf_get_clock()) {}
- ~LinkEnergy() = default;
-
- void init_watts_range_list();
- double get_consumed_energy();
- void update();
-
-private:
- double get_power();
-
s4u::Link* link_{};
bool inited_{false};
double total_energy_{0.0};
double last_updated_{0.0}; /*< Timestamp of the last energy update event*/
+
+ double get_power() const;
+
+public:
+ static xbt::Extension<simgrid::s4u::Link, LinkEnergy> EXTENSION_ID;
+
+ explicit LinkEnergy(s4u::Link* ptr) : link_(ptr), last_updated_(simgrid::s4u::Engine::get_clock()) {}
+
+ void init_watts_range_list();
+ double get_consumed_energy();
+ void update();
};
xbt::Extension<s4u::Link, LinkEnergy> LinkEnergy::EXTENSION_ID;
void LinkEnergy::update()
{
- if (!inited_)
+ if (not inited_)
init_watts_range_list();
double power = get_power();
- double now = surf_get_clock();
+ double now = simgrid::s4u::Engine::get_clock();
total_energy_ += power * (now - last_updated_);
last_updated_ = now;
}
}
}
-double LinkEnergy::get_power()
+double LinkEnergy::get_power() const
{
- if (!inited_)
+ if (not inited_)
return 0.0;
double power_slope = busy_ - idle_;
double LinkEnergy::get_consumed_energy()
{
- if (last_updated_ < surf_get_clock()) // We need to simcall this as it modifies the environment
+ if (last_updated_ < simgrid::s4u::Engine::get_clock()) // We need to simcall this as it modifies the environment
kernel::actor::simcall(std::bind(&LinkEnergy::update, this));
return this->total_energy_;
}
using simgrid::plugin::LinkEnergy;
/* **************************** events callback *************************** */
-static void on_communicate(const simgrid::kernel::resource::NetworkAction& action)
-{
- XBT_DEBUG("onCommunicate is called");
- for (simgrid::kernel::resource::LinkImpl* link : action.get_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->get_iface()->extension<LinkEnergy>();
- link_energy->init_watts_range_list();
- link_energy->update();
- }
-}
-
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) {
+ for (auto const* link : links) {
if (link == nullptr || link->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::WIFI)
continue;
XBT_INFO("Total energy over all links: %f", total_energy);
}
+
+static void on_communication(const simgrid::kernel::activity::CommImpl& comm)
+{
+ for (auto const* link : comm.get_traversed_links()) {
+ if (link != nullptr && link->get_sharing_policy() != simgrid::s4u::Link::SharingPolicy::WIFI) {
+ XBT_DEBUG("Update %s on Comm Start/End", link->get_cname());
+ link->extension<LinkEnergy>()->update();
+ }
+ }
+}
/* **************************** Public interface *************************** */
int sg_link_energy_is_inited()
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) {
+ simgrid::s4u::Link::on_creation_cb([](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));
}
});
- simgrid::s4u::Link::on_state_change.connect([](simgrid::s4u::Link const& link) {
+ simgrid::s4u::Link::on_state_change_cb([](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 const& link) {
+ simgrid::s4u::Link::on_destruction_cb([](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 const& action,
- simgrid::kernel::resource::Action::State /* previous */) {
- for (simgrid::kernel::resource::LinkImpl* link : action.get_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::Engine::on_simulation_end.connect(&on_simulation_end);
+ simgrid::kernel::activity::CommImpl::on_start.connect(&on_communication);
+ simgrid::kernel::activity::CommImpl::on_completion.connect(&on_communication);
+
+ simgrid::s4u::Engine::on_simulation_end_cb(&on_simulation_end);
}
/** @ingroup plugin_link_energy