X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bd7708d5f81722d60f78bcf7dd0481d6a8e58a92..c8017d49035c1ccdcd6b49f09162a4836b8d45a8:/src/surf/plugins/energy.cpp?ds=sidebyside diff --git a/src/surf/plugins/energy.cpp b/src/surf/plugins/energy.cpp index c3b623d929..82248cd160 100644 --- a/src/surf/plugins/energy.cpp +++ b/src/surf/plugins/energy.cpp @@ -153,8 +153,25 @@ double HostEnergy::getCurrentWattsValue(double cpu_load) if (cpu_load > 0) { /* Something is going on, the machine is not idle */ double min_power = range.min; double max_power = range.max; - double power_slope = max_power - min_power; - current_power = min_power + cpu_load * power_slope; + + /** + * The min_power states how much we consume when only one single + * core is working. This means that when cpu_load == 1/coreCount, then + * current_power == min_power. + * + * The maximum must be reached when all cores are working (but 1 core was + * already accounted for by min_power) + * i.e., we need min_power + (maxCpuLoad-1/coreCount)*power_slope == max_power + * (maxCpuLoad is by definition 1) + */ + double power_slope; + int coreCount = host->coreCount(); + if (coreCount > 1) + power_slope = (max_power - min_power) / (1 - 1 / coreCount); + else + power_slope = 0; // Should be 0, since max_power == min_power (in this case) + + current_power = min_power + (cpu_load - (1 / coreCount)) * power_slope; } else { /* Our machine is idle, take the dedicated value! */ current_power = range.idle;