-/* Copyright (c) 2006-2018. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2006-2019. 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. */
}
-LoadBalancer::LoadBalancer()
-{
-}
-
-LoadBalancer::~LoadBalancer()
-{
-}
-
void LoadBalancer::run()
{
simgrid::s4u::Engine* engine = simgrid::s4u::Engine::get_instance();
- std::vector<simgrid::s4u::Host*> available_hosts = engine->get_filtered_hosts([](simgrid::s4u::Host* host) {
- return not host->is_off();
- });
+ std::vector<simgrid::s4u::Host*> available_hosts =
+ engine->get_filtered_hosts([](simgrid::s4u::Host* host) { return host->is_on(); });
xbt_assert(available_hosts.size() > 0, "No hosts available; are they all switched off?");
// TODO: Account for daemon background load (-> use especially the availability file)
for (auto& host : available_hosts) {
std::vector<simgrid::s4u::ActorPtr> actors = host->get_all_actors();
heap_handle update_handle = usable_hosts.push(host); // Required to update elements in the heap
- additional_load[host] = {update_handle, 0}; // Save the handle for later
+ additional_load[host] = {update_handle, 0}; // Save the handle for later
+ const double total_flops_computed = sg_host_get_computed_flops(host);
for (auto& actor : actors) {
- additional_load[host].load += actor_computation[actor->get_pid()];
+ additional_load[host].load += actor_computation[actor->get_pid()] / total_flops_computed; // Normalize load - this allows comparison
+ // even between hosts with different frequencies
XBT_DEBUG("Actor %li -> %f", actor->get_pid(), actor_computation[actor->get_pid()]);
}
+ usable_hosts.increase(update_handle);
XBT_DEBUG("Host %s initialized to %f", host->get_cname(), additional_load[host].load);
}
return new_mapping.get_host(actor);
}
-void LoadBalancer::record_actor_computation(simgrid::s4u::ActorPtr actor, double load)
+void LoadBalancer::record_actor_computation(simgrid::s4u::Actor const& actor, double load)
{
- actor_computation[actor->get_pid()] += load;
+ actor_computation[actor.get_pid()] += load;
}
}
}