X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ed26e84f533a3dc510abdc384aee02506ab9798b..2807fde4fd1f59c230d69a934634c5dfb77905f2:/src/surf/plugins/host_load.cpp diff --git a/src/surf/plugins/host_load.cpp b/src/surf/plugins/host_load.cpp index 5225633b55..3d5a901e56 100644 --- a/src/surf/plugins/host_load.cpp +++ b/src/surf/plugins/host_load.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010, 2012-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2017. 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. */ @@ -8,20 +8,21 @@ #include "src/plugins/vm/VirtualMachineImpl.hpp" #include "src/surf/cpu_interface.hpp" +#include "simgrid/s4u/Engine.hpp" + #include #include -#include #include #include #include -/** @addtogroup SURF_plugin_load +/** @addtogroup plugin_load This plugin makes it very simple for users to obtain the current load for each host. */ -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_plugin_load, surf, "Logging specific to the SURF HostLoad plugin"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_plugin_load, surf, "Logging specific to the HostLoad plugin"); namespace simgrid { namespace plugin { @@ -35,12 +36,14 @@ public: double getCurrentLoad(); double getComputedFlops(); + double getAverageLoad(); void update(); void reset(); private: simgrid::s4u::Host* host = nullptr; double last_updated = 0; + double last_reset = 0; double current_flops = 0; double computed_flops = 0; }; @@ -48,7 +51,10 @@ private: simgrid::xbt::Extension HostLoad::EXTENSION_ID; HostLoad::HostLoad(simgrid::s4u::Host* ptr) - : host(ptr), last_updated(surf_get_clock()), current_flops(lmm_constraint_get_usage(host->pimpl_cpu->constraint())) + : host(ptr) + , last_updated(surf_get_clock()) + , last_reset(surf_get_clock()) + , current_flops(lmm_constraint_get_usage(host->pimpl_cpu->constraint())) { } @@ -70,7 +76,12 @@ void HostLoad::update() double HostLoad::getCurrentLoad() { - return current_flops / (host->speed() * host->coreCount()); + return current_flops / (host->getSpeed() * host->getCoreCount()); +} + +double HostLoad::getAverageLoad() +{ + return getComputedFlops() / (host->getSpeed() * host->getCoreCount() * (surf_get_clock() - last_reset)); } double HostLoad::getComputedFlops() @@ -86,6 +97,7 @@ double HostLoad::getComputedFlops() void HostLoad::reset() { last_updated = surf_get_clock(); + last_reset = surf_get_clock(); computed_flops = 0; } } @@ -94,13 +106,6 @@ void HostLoad::reset() using simgrid::plugin::HostLoad; /* **************************** events callback *************************** */ -static void on_host_added(simgrid::s4u::Host& host) -{ - if (dynamic_cast(&host)) // Ignore virtual machines - return; - host.extension_set(new HostLoad(&host)); -} - /* This callback is fired either when the host changes its state (on/off) or its speed * (because the user changed the pstate, or because of external trace events) */ static void onHostChange(simgrid::s4u::Host& host) @@ -108,14 +113,13 @@ static void onHostChange(simgrid::s4u::Host& host) if (dynamic_cast(&host)) // Ignore virtual machines return; - HostLoad* host_load = host.extension(); - host_load->update(); + host.extension()->update(); } /* This callback is called when an action (computation, idle, ...) terminates */ -static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf::Action::State previous) +static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf::Action::State /*previous*/) { - for (simgrid::surf::Cpu* cpu : action->cpus()) { + for (simgrid::surf::Cpu* const& cpu : action->cpus()) { simgrid::s4u::Host* host = cpu->getHost(); if (host != nullptr) { @@ -127,9 +131,9 @@ static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf: } /* **************************** Public interface *************************** */ -SG_BEGIN_DECL() +extern "C" { -/** \ingroup SURF_plugin_load +/** \ingroup plugin_load * \brief Initializes the HostLoad plugin * \details The HostLoad plugin provides an API to get the current load of each host. */ @@ -140,7 +144,14 @@ void sg_host_load_plugin_init() HostLoad::EXTENSION_ID = simgrid::s4u::Host::extension_create(); - simgrid::s4u::Host::onCreation.connect(&on_host_added); + /* When attaching a callback into a signal, you can use a lambda as follows, or a regular function as done below */ + + simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host& host) { + if (dynamic_cast(&host)) // Ignore virtual machines + return; + host.extension_set(new HostLoad(&host)); + }); + simgrid::surf::CpuAction::onStateChange.connect(&onActionStateChange); simgrid::s4u::Host::onStateChange.connect(&onHostChange); simgrid::s4u::Host::onSpeedChange.connect(&onHostChange); @@ -148,7 +159,7 @@ void sg_host_load_plugin_init() /** @brief Returns the current load of the host passed as argument * - * See also @ref SURF_plugin_load + * See also @ref plugin_load */ double sg_host_get_current_load(sg_host_t host) { @@ -173,5 +184,4 @@ void sg_host_load_reset(sg_host_t host) host->extension()->reset(); } - -SG_END_DECL() +}