Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI/LB] Add files load_balancer.hpp and smpi/sampi.h
authorChristian Heinrich <franz-christian.heinrich@inria.fr>
Thu, 28 Jun 2018 12:08:22 +0000 (14:08 +0200)
committerChristian Heinrich <franz-christian.heinrich@inria.fr>
Thu, 2 Aug 2018 19:55:52 +0000 (21:55 +0200)
include/simgrid/smpi/loadbalancer/load_balancer.hpp [new file with mode: 0644]
include/smpi/sampi.h [new file with mode: 0644]

diff --git a/include/simgrid/smpi/loadbalancer/load_balancer.hpp b/include/simgrid/smpi/loadbalancer/load_balancer.hpp
new file mode 100644 (file)
index 0000000..37606ba
--- /dev/null
@@ -0,0 +1,75 @@
+
+#ifndef HAVE_SG_PLUGIN_LB
+#define HAVE_SG_PLUGIN_LB
+
+namespace simgrid {
+namespace plugin {
+namespace loadbalancer {
+
+class Mapping {
+public:
+  Mapping() = default;
+  ~Mapping() = default;
+  /** Each host can have an arbitrary number of actors -> multimap **/
+  typedef std::unordered_multimap<simgrid::s4u::Host*, simgrid::s4u::ActorPtr> host_to_actors_map_t;
+  host_to_actors_map_t host_to_actors;
+
+  /** Each actor gets assigned to exactly one host -> map **/
+  std::map<simgrid::s4u::ActorPtr, simgrid::s4u::Host*> actor_to_host;
+
+  void assign(simgrid::s4u::ActorPtr actor, simgrid::s4u::Host* host)
+  {
+    /* Remove "actor" from its old host -> get all elements that have the current host as key **/
+    auto range = host_to_actors.equal_range(/* current host */actor_to_host[actor]);
+    for (auto it = range.first; it != range.second; it++) {
+      if (it->second == actor) {
+        host_to_actors.erase(it); // unassign this actor
+        break;
+      }
+    }
+
+    actor_to_host[actor] = host;
+    host_to_actors.insert({host, actor});
+  }
+
+  simgrid::s4u::Host* get_host(simgrid::s4u::ActorPtr actor) { return actor_to_host[actor]; }
+
+  unsigned int count_actors(simgrid::s4u::Host* host)
+  {
+    return host_to_actors.count(host); // TODO This is linear in the size of the map. Maybe replace by constant lookup through another map?
+  }
+
+  void for_each_actor(simgrid::s4u::Host* host, std::function<void(simgrid::s4u::ActorPtr)> callback)
+  {
+    auto range = host_to_actors.equal_range(host);
+    std::for_each(
+        range.first,
+        range.second,
+        [&callback](host_to_actors_map_t::value_type& x) { callback(x.second); }
+    );
+  }
+};
+
+class LoadBalancer
+{
+  std::map<int, double> actor_computation;
+  std::map<simgrid::s4u::ActorPtr, simgrid::s4u::Host*> new_mapping;
+
+public:
+  LoadBalancer();
+  ~LoadBalancer();
+  void run();
+  void assign(simgrid::s4u::ActorPtr actor, simgrid::s4u::Host* host);
+  
+  /**
+   * FIXME These are functions used for testing and should be re-written or removed
+   */
+  simgrid::s4u::Host* get_mapping();
+  void record_actor_computation(simgrid::s4u::ActorPtr actor, double load);
+private:
+};
+
+}
+}
+}
+#endif
diff --git a/include/smpi/sampi.h b/include/smpi/sampi.h
new file mode 100644 (file)
index 0000000..bdbaa98
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright (c) 2007-2018. 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. */
+
+#ifndef SAMPI_H_
+#define SAMPI_H_
+
+#include "malloc.h"
+#include <smpi/smpi.h>
+
+#define AMPI_CALL(type, name, args)                                                                                    \
+  type A##name args __attribute__((weak));                                                                             \
+  type AP##name args;
+
+#ifndef HAVE_SMPI
+#define malloc(nbytes) _sampi_malloc(nbytes)
+#define free(ptr) _sampi_free(ptr)
+#endif
+
+SG_BEGIN_DECL()
+
+XBT_PUBLIC void* _sampi_malloc(size_t size);
+XBT_PUBLIC void _sampi_free(void* ptr);
+
+AMPI_CALL(XBT_PUBLIC int, MPI_Iteration_in, (MPI_Comm comm))
+AMPI_CALL(XBT_PUBLIC int, MPI_Iteration_out, (MPI_Comm comm))
+AMPI_CALL(XBT_PUBLIC void, MPI_Migrate, (MPI_Comm comm))
+
+SG_END_DECL()
+
+#endif