X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ea4eb2d3ae5dd567ff62f88b7e61605a94ebff0e..2d75d1cbec1f1390f086522ccc8a0b3a4e645d89:/src/surf/plugins/host_load.cpp diff --git a/src/surf/plugins/host_load.cpp b/src/surf/plugins/host_load.cpp index 82668bd172..31ea874530 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,27 +71,38 @@ HostLoad::~HostLoad() = default; void HostLoad::update() { double now = surf_get_clock(); - if (last_updated < now) { - /* flops == pstate_speed * cores_being_currently_used */ - computed_flops += (now - last_updated) * current_flops; - /* 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(); + /* 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(); - if (was_prev_idle) { - idle_time += (now - last_updated); - } + /* flops == pstate_speed * cores_being_currently_used */ + computed_flops += (now - last_updated) * current_flops; - theor_max_flops += current_speed * host->getCoreCount() * (now - last_updated); - current_speed = host->getSpeed(); - last_updated = now; - was_prev_idle = (current_flops == 0); + 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()); } @@ -104,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; } @@ -119,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); } } }