Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove empty functions
[simgrid.git] / src / smpi / plugins / load_balancer / load_balancer.hpp
1 /* Copyright (c) 2006-2019. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #ifndef HAVE_SG_PLUGIN_LB
7 #define HAVE_SG_PLUGIN_LB
8
9 #include <simgrid/s4u.hpp>
10
11 namespace simgrid {
12 namespace plugin {
13 namespace loadbalancer {
14
15 class XBT_PRIVATE Mapping {
16 public:
17   /** Each host can have an arbitrary number of actors -> multimap **/
18   typedef std::unordered_multimap<simgrid::s4u::Host*, simgrid::s4u::ActorPtr> host_to_actors_map_t;
19   host_to_actors_map_t host_to_actors;
20
21   /** Each actor gets assigned to exactly one host -> map **/
22   std::map<simgrid::s4u::ActorPtr, simgrid::s4u::Host*> actor_to_host;
23
24   void assign(simgrid::s4u::ActorPtr actor, simgrid::s4u::Host* host)
25   {
26     /* Remove "actor" from its old host -> get all elements that have the current host as key **/
27     auto range = host_to_actors.equal_range(/* current host */actor_to_host[actor]);
28     for (auto it = range.first; it != range.second; it++) {
29       if (it->second == actor) {
30         host_to_actors.erase(it); // unassign this actor
31         break;
32       }
33     }
34
35     actor_to_host[actor] = host;
36     host_to_actors.insert({host, actor});
37   }
38
39   simgrid::s4u::Host* get_host(simgrid::s4u::ActorPtr actor) { return actor_to_host[actor]; }
40
41   unsigned int count_actors(simgrid::s4u::Host* host)
42   {
43     return host_to_actors.count(host); // TODO This is linear in the size of the map. Maybe replace by constant lookup through another map?
44   }
45
46   void for_each_actor(simgrid::s4u::Host* host, const std::function<void(simgrid::s4u::ActorPtr)>& callback)
47   {
48     auto range = host_to_actors.equal_range(host);
49     std::for_each(
50         range.first,
51         range.second,
52         [&callback](host_to_actors_map_t::value_type& x) { callback(x.second); }
53     );
54   }
55 };
56
57 class XBT_PRIVATE LoadBalancer
58 {
59   Mapping new_mapping;
60   std::map</*proc id*/int, double> actor_computation;
61
62 public:
63   void run();
64   void assign(simgrid::s4u::ActorPtr actor, simgrid::s4u::Host* host);
65   
66   /**
67    * FIXME These are functions used for testing and should be re-written or removed
68    */
69   simgrid::s4u::Host* get_mapping(simgrid::s4u::ActorPtr);
70   void record_actor_computation(simgrid::s4u::ActorPtr actor, double load);
71 };
72
73 }
74 }
75 }
76 #endif