-/* 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. */
namespace plugin {
namespace loadbalancer {
-struct XBT_PRIVATE compare_hosts {
+class XBT_PRIVATE compare_hosts {
+public:
bool operator()(simgrid::s4u::Host* const a, simgrid::s4u::Host* const b) const;
};
typedef boost::heap::fibonacci_heap<simgrid::s4u::Host*, boost::heap::compare<compare_hosts>>::handle_type heap_handle;
/**
- * Structure that imitates a std::pair, but it allows us
- * to use meaningful names instead of .first and .second
+ * Structure that imitates a std::pair, but it allows us
+ * to use meaningful names instead of .first and .second
*/
struct XBT_PRIVATE pair_handle_load
{
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);
}
}
}
-simgrid::s4u::Host* LoadBalancer::get_mapping()
+simgrid::s4u::Host* LoadBalancer::get_mapping(simgrid::s4u::ActorPtr actor)
{
- return new_mapping.get_host(simgrid::s4u::Actor::self());
+ return new_mapping.get_host(actor);
}
void LoadBalancer::record_actor_computation(simgrid::s4u::ActorPtr actor, double load)