X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0a450bbc6181cf8aa9af5c4190cf91fa85ef4df6..d5c57ec2bead03b27b08d4136fb968e79aa3d233:/src/surf/plugins/host_load.cpp diff --git a/src/surf/plugins/host_load.cpp b/src/surf/plugins/host_load.cpp index f353661d25..b33570ded2 100644 --- a/src/surf/plugins/host_load.cpp +++ b/src/surf/plugins/host_load.cpp @@ -49,7 +49,7 @@ private: double current_flops = 0; double computed_flops = 0; double idle_time = 0; - long theor_max_flops = 0; + double theor_max_flops = 0; bool was_prev_idle = true; /* A host is idle at the beginning */ }; @@ -71,19 +71,38 @@ HostLoad::~HostLoad() = default; void HostLoad::update() { double now = surf_get_clock(); - if (last_updated < now) { - /* Current flop per second computed by the cpu; current_flops = k * pstate_speed_in_flops, k \in {0, 1, ..., cores} - * number of active cores */ - current_flops = host->pimpl_cpu->constraint()->get_usage(); - - /* flops == pstate_speed * cores_being_currently_used */ - computed_flops += (now - last_updated) * current_flops; - last_updated = now; + + /* Current flop per second computed by the cpu; current_flops = k * pstate_speed_in_flops, k \in {0, 1, ..., cores} + * number of active cores */ + current_flops = host->pimpl_cpu->constraint()->get_usage(); + + /* flops == pstate_speed * cores_being_currently_used */ + computed_flops += (now - last_updated) * current_flops; + + if (was_prev_idle) { + idle_time += (now - last_updated); } + + theor_max_flops += current_speed * host->getCoreCount() * (now - last_updated); + current_speed = host->getSpeed(); + last_updated = now; + was_prev_idle = (current_flops == 0); } +/** + * WARNING: This function does not guarantee that you have the real load at any time; + * imagine all actions on your CPU terminate at time t. Your load is then 0. Then + * you query the load (still 0) and then another action starts (still at time t!). + * This means that the load was never really 0 (because the time didn't advance) but + * it will still be reported as 0. + * + * So, use at your own risk. + */ double HostLoad::getCurrentLoad() { + // We don't need to call update() here because it is called everytime an + // action terminates or starts + // FIXME: Can this happen at the same time? stop -> call to getCurrentLoad, load = 0 -> next action starts? return current_flops / static_cast(host->getSpeed() * host->getCoreCount()); } @@ -96,13 +115,15 @@ double HostLoad::getIdleTime() { double HostLoad::getAverageLoad() { - return getComputedFlops() / (host->getSpeed() * host->getCoreCount() * (surf_get_clock() - last_reset)); + if (theor_max_flops == 0) { // Avoid division by 0 + return 0; + } + + return computed_flops / theor_max_flops; } double HostLoad::getComputedFlops() { - update(); - return computed_flops; } @@ -111,9 +132,14 @@ double HostLoad::getComputedFlops() */ void HostLoad::reset() { - last_updated = surf_get_clock(); - last_reset = surf_get_clock(); - computed_flops = 0; + last_updated = surf_get_clock(); + last_reset = surf_get_clock(); + idle_time = 0; + computed_flops = 0; + theor_max_flops = 0; + current_flops = host->pimpl_cpu->constraint()->get_usage(); + current_speed = host->getSpeed(); + was_prev_idle = (current_flops == 0); } } } @@ -185,6 +211,18 @@ double sg_host_get_current_load(sg_host_t host) return host->extension()->getCurrentLoad(); } +/** @brief Returns the current load of the host passed as argument + * + * See also @ref plugin_load + */ +double sg_host_get_avg_load(sg_host_t host) +{ + xbt_assert(HostLoad::EXTENSION_ID.valid(), + "The Load plugin is not active. Please call sg_host_load_plugin_init() during initialization."); + + return host->extension()->getAverageLoad(); +} + /** @brief Returns the time this host was idle since the last reset * * See also @ref plugin_load