-/* Computes the consumption so far. Called lazily on need. */
-static void update_consumption(simgrid::surf::Host *host, HostEnergy *host_energy) {
- double start_time = host_energy->last_updated;
- double finish_time = surf_get_clock();
- double cpu_load;
- if (host->p_cpu->m_speedPeak == 0)
- // Some users declare a pstate of speed 0 flops (eg to model boot time).
- // We consider that the machine is then fully loaded. That's arbitrary but it avoids a NaN
- cpu_load = 1;
- else
- cpu_load = lmm_constraint_get_usage(host->p_cpu->getConstraint()) / host->p_cpu->m_speedPeak;
-
- if (cpu_load > 1) // A machine with a load > 1 consumes as much as a fully loaded machine, not mores
- cpu_load = 1;
-
- double previous_energy = host_energy->total_energy;
-
- double instantaneous_consumption;
- if (host->isOff())
- instantaneous_consumption = host_energy->watts_off;
- else
- instantaneous_consumption = host_energy->getCurrentWattsValue(cpu_load);
-
- double energy_this_step = instantaneous_consumption*(finish_time-start_time);
-
- host_energy->total_energy = previous_energy + energy_this_step;
- host_energy->last_updated = finish_time;
-
- XBT_DEBUG("[update_energy of %s] period=[%.2f-%.2f]; current power peak=%.0E flop/s; consumption change: %.2f J -> %.2f J",
- host->getName(), start_time, finish_time, host->p_cpu->m_speedPeak, previous_energy, energy_this_step);
-}
-
-/** \ingroup SURF_plugin_energy
- * \brief Enable energy plugin
- * \details Enable energy plugin to get joules consumption of each cpu. You should call this function before #MSG_init().
- */
-void sg_energy_plugin_init() {
- if (simgrid::energy::surf_energy == NULL) {
-
- simgrid::energy::surf_energy = new std::map<simgrid::surf::Host*, simgrid::energy::HostEnergy*>();
-
- /* The following attaches an anonymous function to the Host::onCreation signal */
- /* Search for "C++ lambda" for more information on the syntax used here */
- simgrid::surf::Host::onCreation.connect([](simgrid::surf::Host *host) {
- if (dynamic_cast<simgrid::surf::VirtualMachine*>(host)) // Ignore virtual machines
- return;
-
- (*simgrid::energy::surf_energy)[host] = new HostEnergy(host);
- });
-
- simgrid::surf::Host::onDestruction.connect([](simgrid::surf::Host *host) {
- if (dynamic_cast<simgrid::surf::VirtualMachine*>(host)) // Ignore virtual machines
- return;
-
- std::map<simgrid::surf::Host*, HostEnergy*>::iterator host_energy_it = simgrid::energy::surf_energy->find(host);
- xbt_assert(host_energy_it != simgrid::energy::surf_energy->end(), "The host is not in surf_energy.");
-
- HostEnergy *host_energy = host_energy_it->second;
- update_consumption(host, host_energy);