Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
use NetCard extension to store vivaldi coordinates
authorMartin Quinson <martin.quinson@loria.fr>
Fri, 9 Dec 2016 21:14:38 +0000 (22:14 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Fri, 9 Dec 2016 21:14:38 +0000 (22:14 +0100)
examples/java/app/tokenring/app_tokenring.tesh
examples/msg/app-token-ring/app-token-ring.tesh
examples/platforms/two_peers.xml
include/surf/surf_routing.h
src/kernel/routing/AsImpl.hpp
src/kernel/routing/AsVivaldi.cpp
src/kernel/routing/AsVivaldi.hpp
src/simgrid/sg_config.cpp
src/surf/sg_platf.cpp
src/surf/surf_routing.cpp

index 530e677..589be45 100644 (file)
@@ -18,9 +18,9 @@ $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/r
 > [  0.131796] (0:maestro@) MSG_main finished; Cleaning up the simulation...
 > [  0.131796] (0:maestro@) Simulation time 0.13179602061855672
 
-$ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/two_peers.xml --cfg=network/coordinates:yes '--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n'
-> [    0.000000] (0:maestro@) Configuration change: Set 'network/coordinates' to 'yes'
+$ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/two_peers.xml '--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n'
 > [    0.000000] (0:maestro@) Using regular java threads.
+> [    0.000000] (0:maestro@) Configuration change: Set 'network/coordinates' to 'yes'
 > [    0.000000] (0:maestro@) Number of hosts '2'
 > [    0.000000] (1:0@peer_100030591) Host '0' send 'Token' to Host '1'
 > [    0.637910] (2:1@peer_100036570) Host '1' received 'Token'
index 83da4ae..9c43aac 100644 (file)
@@ -16,7 +16,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/app-token-ring ${srcdir:=.}/routing_cluster.xml "-
 > [  0.131796] (1:0@host1) Host "0" received "Token"
 > [  0.131796] (0:maestro@) Simulation time 0.131796
 
-$ $SG_TEST_EXENV ${bindir:=.}/app-token-ring ${srcdir:=.}/two_peers.xml --cfg=network/coordinates:yes "--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n"
+$ $SG_TEST_EXENV ${bindir:=.}/app-token-ring ${srcdir:=.}/two_peers.xml "--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n"
 > [    0.000000] (0:maestro@) Configuration change: Set 'network/coordinates' to 'yes'
 > [    0.000000] (0:maestro@) Number of hosts '2'
 > [    0.000000] (1:0@peer_100030591) Host "0" send 'Token' to Host "1"
index 00d9768..940b207 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
 <platform version="4">
+  <config id="General">
+    <prop id="network/coordinates" value="yes"></prop>
+  </config>
   <AS id="AS0" routing="Vivaldi">
     <peer id="100030591" coordinates="25.5 9.4 1.4" speed="1.5Gf" bw_in="2.25GBps" bw_out="2.25GBps" lat="500us" />
     <peer id="100036570" coordinates="-12.7 -9.9 2.1" speed="730Mf" bw_in="2.25GBps" bw_out="2.25GBps" lat="500us" />
index 885d8a1..181cd1f 100644 (file)
@@ -17,7 +17,6 @@ XBT_PUBLIC_DATA(int) SIMIX_STORAGE_LEVEL; //Simix storage level
 
 XBT_PUBLIC_DATA(xbt_lib_t) as_router_lib;
 XBT_PUBLIC_DATA(int) ROUTING_ASR_LEVEL;  //Routing level
-XBT_PUBLIC_DATA(int) COORD_ASR_LEVEL;  //Coordinates level
 XBT_PUBLIC_DATA(int) ROUTING_PROP_ASR_LEVEL; //Properties for AS and router
 
 XBT_PUBLIC_DATA(xbt_lib_t) storage_lib;
index 2ff5620..5e48d08 100644 (file)
@@ -97,6 +97,7 @@ public:
 
 private:
   std::map<std::pair<NetCard*, NetCard*>, BypassRoute*> bypassRoutes_; // src x dst -> route
+public:
   routing::NetCard* netcard_ = nullptr;                                // Our representative in the father AS
 };
 
index e048015..3d5add0 100644 (file)
@@ -17,19 +17,18 @@ namespace simgrid {
 namespace kernel {
 namespace routing {
 namespace vivaldi {
-simgrid::xbt::Extension<s4u::Host, Coords> Coords::EXTENSION_ID;
+simgrid::xbt::Extension<NetCard, Coords> Coords::EXTENSION_ID;
 
-Coords::Coords(s4u::Host* host, const char* coordStr)
+Coords::Coords(NetCard* netcard, const char* coordStr)
 {
-  if (!Coords::EXTENSION_ID.valid()) {
-    Coords::EXTENSION_ID = s4u::Host::extension_create<Coords>();
-  }
+  if (!Coords::EXTENSION_ID.valid())
+    Coords::EXTENSION_ID = NetCard::extension_create<Coords>();
 
   unsigned int cursor;
   char* str;
 
   xbt_dynar_t ctn_str = xbt_str_split_str(coordStr, " ");
-  xbt_assert(xbt_dynar_length(ctn_str) == 3, "Coordinates of %s must have 3 dimensions", host->name().c_str());
+  xbt_assert(xbt_dynar_length(ctn_str) == 3, "Coordinates of %s must have 3 dimensions", netcard->cname());
 
   this->coords = xbt_dynar_new(sizeof(double), nullptr);
   xbt_dynar_foreach (ctn_str, cursor, str) {
@@ -38,7 +37,8 @@ Coords::Coords(s4u::Host* host, const char* coordStr)
   }
   xbt_dynar_free(&ctn_str);
   xbt_dynar_shrink(this->coords, 0);
-  host->extension_set<Coords>(this);
+  netcard->extension_set<Coords>(this);
+  XBT_DEBUG("Coords of %s %p: %s", netcard->cname(), netcard, coordStr);
 }
 Coords::~Coords()
 {
@@ -52,81 +52,63 @@ static inline double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t
   double dst_coord = xbt_dynar_get_as(dst, index, double);
 
   return (src_coord - dst_coord) * (src_coord - dst_coord);
-  }
-
-  static xbt_dynar_t getCoordsFromNetcard(NetCard *nc)
-  {
-    xbt_dynar_t res = nullptr;
-    char *tmp_name;
-
-    if (nc->isHost()) {
-      tmp_name                 = bprintf("peer_%s", nc->name().c_str());
-      simgrid::s4u::Host *host = simgrid::s4u::Host::by_name_or_null(tmp_name);
-      if (host == nullptr)
-        host = simgrid::s4u::Host::by_name_or_null(nc->name());
-      if (host != nullptr)
-        res = host->extension<simgrid::kernel::routing::vivaldi::Coords>()->coords;
-    }
-    else if(nc->isRouter() || nc->isAS()){
-      tmp_name = bprintf("router_%s", nc->name().c_str());
-      res = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_name, COORD_ASR_LEVEL);
-    }
-    else{
-      THROW_IMPOSSIBLE;
-    }
+}
 
-    xbt_assert(res,"No coordinate found for element '%s'",tmp_name);
-    free(tmp_name);
+static xbt_dynar_t getCoordsFromNetcard(NetCard* nc)
+{
+  simgrid::kernel::routing::vivaldi::Coords* coords = nc->extension<simgrid::kernel::routing::vivaldi::Coords>();
+  xbt_assert(coords, "Please specify the Vivaldi coordinates of %s %s (%p)",
+             (nc->isAS() ? "AS" : (nc->isHost() ? "Host" : "Router")), nc->cname(), nc);
+  return coords->coords;
+}
+AsVivaldi::AsVivaldi(As* father, const char* name) : AsCluster(father, name)
+{
+}
 
-    return res;
+void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t route, double* lat)
+{
+  XBT_DEBUG("vivaldi getLocalRoute from '%s'[%d] '%s'[%d]", src->cname(), src->id(), dst->cname(), dst->id());
+
+  if (src->isAS()) {
+    char* srcName = bprintf("router_%s", src->cname());
+    char* dstName = bprintf("router_%s", dst->cname());
+    route->gw_src = (sg_netcard_t)xbt_lib_get_or_null(as_router_lib, srcName, ROUTING_ASR_LEVEL);
+    route->gw_dst = (sg_netcard_t)xbt_lib_get_or_null(as_router_lib, dstName, ROUTING_ASR_LEVEL);
+    xbt_free(srcName);
+    xbt_free(dstName);
   }
-  AsVivaldi::AsVivaldi(As* father, const char* name) : AsCluster(father, name)
-  {}
-
-  void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t route, double* lat)
-  {
-    XBT_DEBUG("vivaldi getLocalRoute from '%s'[%d] '%s'[%d]", src->name().c_str(), src->id(), dst->name().c_str(),
-              dst->id());
-
-    if (src->isAS()) {
-      char* srcName = bprintf("router_%s", src->name().c_str());
-      char* dstName = bprintf("router_%s", dst->name().c_str());
-      route->gw_src = (sg_netcard_t)xbt_lib_get_or_null(as_router_lib, srcName, ROUTING_ASR_LEVEL);
-      route->gw_dst = (sg_netcard_t)xbt_lib_get_or_null(as_router_lib, dstName, ROUTING_ASR_LEVEL);
-      xbt_free(srcName);
-      xbt_free(dstName);
-    }
 
-    /* Retrieve the private links */
-    if (privateLinks_.size() > src->id()) {
-      s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id());
-      if (info.linkUp) {
-        route->link_list->push_back(info.linkUp);
-        if (lat)
-          *lat += info.linkUp->latency();
-      }
+  /* Retrieve the private links */
+  if (privateLinks_.size() > src->id()) {
+    s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id());
+    if (info.linkUp) {
+      route->link_list->push_back(info.linkUp);
+      if (lat)
+        *lat += info.linkUp->latency();
     }
-    if (privateLinks_.size() > dst->id()) {
-      s_surf_parsing_link_up_down_t info = privateLinks_.at(dst->id());
-      if (info.linkDown) {
-        route->link_list->push_back(info.linkDown);
-        if (lat)
-          *lat += info.linkDown->latency();
-      }
+  }
+  if (privateLinks_.size() > dst->id()) {
+    s_surf_parsing_link_up_down_t info = privateLinks_.at(dst->id());
+    if (info.linkDown) {
+      route->link_list->push_back(info.linkDown);
+      if (lat)
+        *lat += info.linkDown->latency();
     }
+  }
 
-    /* Compute the extra latency due to the euclidean distance if needed */
-    if (lat) {
-      xbt_dynar_t srcCoords = getCoordsFromNetcard(src);
-      xbt_dynar_t dstCoords = getCoordsFromNetcard(dst);
+  /* Compute the extra latency due to the euclidean distance if needed */
+  if (lat) {
+    xbt_dynar_t srcCoords = getCoordsFromNetcard(src);
+    xbt_dynar_t dstCoords = getCoordsFromNetcard(dst);
 
-      double euclidean_dist =
-          sqrt(euclidean_dist_comp(0, srcCoords, dstCoords) + euclidean_dist_comp(1, srcCoords, dstCoords)) +
-          fabs(xbt_dynar_get_as(srcCoords, 2, double)) + fabs(xbt_dynar_get_as(dstCoords, 2, double));
+    double euclidean_dist =
+        sqrt(euclidean_dist_comp(0, srcCoords, dstCoords) + euclidean_dist_comp(1, srcCoords, dstCoords)) +
+        fabs(xbt_dynar_get_as(srcCoords, 2, double)) + fabs(xbt_dynar_get_as(dstCoords, 2, double));
 
-      XBT_DEBUG("Updating latency %f += %f", *lat, euclidean_dist);
-      *lat += euclidean_dist / 1000.0; // From .ms to .s
-    }
+    XBT_DEBUG("Updating latency %f += %f", *lat, euclidean_dist);
+    *lat += euclidean_dist / 1000.0; // From .ms to .s
+  }
+}
+}
+}
 }
-
-}}}
index c51d678..5b7f684 100644 (file)
@@ -23,8 +23,8 @@ public:
 namespace vivaldi {
 class XBT_PRIVATE Coords {
 public:
-  static simgrid::xbt::Extension<simgrid::s4u::Host, Coords> EXTENSION_ID;
-  explicit Coords(s4u::Host* host, const char* str);
+  static simgrid::xbt::Extension<NetCard, Coords> EXTENSION_ID;
+  explicit Coords(NetCard* host, const char* str);
   virtual ~Coords();
 
   xbt_dynar_t coords;
index 1365f02..251ff47 100644 (file)
@@ -332,8 +332,6 @@ static void _sg_cfg_cb__surf_network_coordinates(const char *name)
   static int already_set = 0;
   int val = xbt_cfg_get_boolean(name);
   if (val) {
-    if (!already_set)
-      COORD_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp);
     already_set = 1;
   } else
     if (already_set)
index 73f817c..a43f3f5 100644 (file)
@@ -100,7 +100,7 @@ void sg_platf_new_host(sg_platf_host_cbarg_t args)
   if (args->pstate != 0)
     host->pimpl_cpu->setPState(args->pstate);
   if (args->coord && strcmp(args->coord, ""))
-    new simgrid::kernel::routing::vivaldi::Coords(host, args->coord);
+    new simgrid::kernel::routing::vivaldi::Coords(host->pimpl_netcard, args->coord);
 
   simgrid::s4u::Host::onCreation(*host);
 
@@ -123,23 +123,8 @@ void sg_platf_new_router(sg_platf_router_cbarg_t router)
   xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, netcard);
   XBT_DEBUG("Router '%s' has the id %d", router->id, netcard->id());
 
-  if (router->coord && strcmp(router->coord, "")) {
-    unsigned int cursor;
-    char*str;
-
-    xbt_assert(COORD_ASR_LEVEL, "To use host coordinates, please add --cfg=network/coordinates:yes to your command line");
-    /* Pre-parse the host coordinates */
-    xbt_dynar_t ctn_str = xbt_str_split_str(router->coord, " ");
-    xbt_assert(xbt_dynar_length(ctn_str)==3,"Coordinates of %s must have 3 dimensions", router->id);
-    xbt_dynar_t ctn = xbt_dynar_new(sizeof(double),nullptr);
-    xbt_dynar_foreach(ctn_str,cursor, str) {
-      double val = xbt_str_parse_double(str, "Invalid coordinate: %s");
-      xbt_dynar_push(ctn,&val);
-    }
-    xbt_dynar_free(&ctn_str);
-    xbt_dynar_shrink(ctn, 0);
-    xbt_lib_set(as_router_lib, router->id, COORD_ASR_LEVEL, (void *) ctn);
-  }
+  if (router->coord && strcmp(router->coord, ""))
+    new simgrid::kernel::routing::vivaldi::Coords(netcard, router->coord);
 
   auto cluster = dynamic_cast<simgrid::kernel::routing::AsCluster*>(current_routing);
   if(cluster != nullptr)
@@ -598,6 +583,7 @@ void sg_platf_new_peer(sg_platf_peer_cbarg_t peer)
   AS.id      = peer->id;
   AS.routing = A_surfxml_AS_routing_Cluster;
   sg_platf_new_AS_begin(&AS);
+  new simgrid::kernel::routing::vivaldi::Coords(current_routing->netcard_, peer->coord);
 
   XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\"/>", host_id, peer->speed);
   s_sg_platf_host_cbarg_t host;
index e1540b2..5d8bdb5 100644 (file)
@@ -41,7 +41,6 @@ int MSG_STORAGE_LEVEL = -1;          //Msg storage level
 
 xbt_lib_t as_router_lib;
 int ROUTING_ASR_LEVEL = -1;          //Routing level
-int COORD_ASR_LEVEL = -1;            //Coordinates level
 int ROUTING_PROP_ASR_LEVEL = -1;     //Where the properties are stored
 
 void sg_platf_new_trace(sg_platf_trace_cbarg_t trace)