Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
AsVivaldi is an AsCluster because each host as a private link
authorMartin Quinson <martin.quinson@loria.fr>
Sat, 26 Mar 2016 19:53:00 +0000 (20:53 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Sat, 26 Mar 2016 19:53:00 +0000 (20:53 +0100)
src/surf/AsCluster.cpp
src/surf/AsCluster.hpp
src/surf/AsClusterTorus.cpp
src/surf/AsImpl.cpp
src/surf/AsImpl.hpp
src/surf/AsVivaldi.cpp
src/surf/AsVivaldi.hpp
src/surf/sg_platf.cpp

index a297300..128115e 100644 (file)
@@ -17,6 +17,10 @@ namespace surf {
   AsCluster::AsCluster(const char*name)
     : AsImpl(name)
   {}
   AsCluster::AsCluster(const char*name)
     : AsImpl(name)
   {}
+  AsCluster::~AsCluster()
+  {
+    xbt_dynar_free(&upDownLinks_);
+  }
 
 void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
 {
 
 void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
 {
@@ -27,7 +31,7 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb
   if (! src->isRouter()) {    // No specific link for router
 
     if((src->id() == dst->id()) && has_loopback_  ){
   if (! src->isRouter()) {    // No specific link for router
 
     if((src->id() == dst->id()) && has_loopback_  ){
-      info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
+      info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
       route->link_list->push_back(info.link_up);
       if (lat)
         *lat += info.link_up->getLatency();
       route->link_list->push_back(info.link_up);
       if (lat)
         *lat += info.link_up->getLatency();
@@ -36,11 +40,11 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb
 
 
     if (has_limiter_){          // limiter for sender
 
 
     if (has_limiter_){          // limiter for sender
-      info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
+      info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
       route->link_list->push_back((Link*)info.link_up);
     }
 
       route->link_list->push_back((Link*)info.link_up);
     }
 
-    info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
+    info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
     if (info.link_up) {         // link up
       route->link_list->push_back(info.link_up);
       if (lat)
     if (info.link_up) {         // link up
       route->link_list->push_back(info.link_up);
       if (lat)
@@ -56,7 +60,7 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb
   }
 
   if (! dst->isRouter()) {    // No specific link for router
   }
 
   if (! dst->isRouter()) {    // No specific link for router
-    info = xbt_dynar_get_as(upDownLinks, dst->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
+    info = xbt_dynar_get_as(upDownLinks_, dst->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
 
     if (info.link_down) {       // link down
       route->link_list->push_back(info.link_down);
 
     if (info.link_down) {       // link down
       route->link_list->push_back(info.link_down);
@@ -64,7 +68,7 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb
         *lat += info.link_down->getLatency();
     }
     if (has_limiter_){          // limiter for receiver
         *lat += info.link_down->getLatency();
     }
     if (has_limiter_){          // limiter for receiver
-        info = xbt_dynar_get_as(upDownLinks, dst->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
+        info = xbt_dynar_get_as(upDownLinks_, dst->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
         route->link_list->push_back(info.link_up);
     }
   }
         route->link_list->push_back(info.link_up);
     }
   }
@@ -98,7 +102,7 @@ void AsCluster::getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)
     if (! src->isRouter()) {
       previous = new_xbt_graph_node(graph, src->name(), nodes);
 
     if (! src->isRouter()) {
       previous = new_xbt_graph_node(graph, src->name(), nodes);
 
-      info = xbt_dynar_get_as(upDownLinks, src->id(), s_surf_parsing_link_up_down_t);
+      info = xbt_dynar_get_as(upDownLinks_, src->id(), s_surf_parsing_link_up_down_t);
 
       if (info.link_up) {     // link up
 
 
       if (info.link_up) {     // link up
 
@@ -155,7 +159,7 @@ void AsCluster::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id,
     info.link_up = sg_link_by_name(link_id);
     info.link_down = info.link_up;
   }
     info.link_up = sg_link_by_name(link_id);
     info.link_down = info.link_up;
   }
-  xbt_dynar_set(upDownLinks, position, &info);
+  xbt_dynar_set(upDownLinks_, position, &info);
   xbt_free(link_id);
 }
 
   xbt_free(link_id);
 }
 
index d0e3819..ee2a718 100644 (file)
@@ -14,6 +14,7 @@ namespace surf {
 class XBT_PRIVATE AsCluster: public AsImpl {
 public:
   AsCluster(const char*name);
 class XBT_PRIVATE AsCluster: public AsImpl {
 public:
   AsCluster(const char*name);
+  ~AsCluster();
 
   virtual void getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t into, double *latency) override;
   void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges) override;
 
   virtual void getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t into, double *latency) override;
   void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges) override;
@@ -21,6 +22,8 @@ public:
   virtual void create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position);
   virtual void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) {}
 
   virtual void create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position);
   virtual void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) {}
 
+  xbt_dynar_t upDownLinks_ = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+
   Link* backbone_ = nullptr;
   void *loopback_ = nullptr;
   NetCard *router_ = nullptr;
   Link* backbone_ = nullptr;
   void *loopback_ = nullptr;
   NetCard *router_ = nullptr;
index 346361f..41655cc 100644 (file)
@@ -77,7 +77,7 @@ namespace simgrid {
          * note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?)
          * holds the link "rankId->rankId"
          */
          * note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?)
          * holds the link "rankId->rankId"
          */
-        xbt_dynar_set(upDownLinks, position + j, &info);
+        xbt_dynar_set(upDownLinks_, position + j, &info);
         dim_product *= current_dimension;
         xbt_free(link_id);
       }
         dim_product *= current_dimension;
         xbt_free(link_id);
       }
@@ -118,7 +118,7 @@ namespace simgrid {
         return;
 
       if ((src->id() == dst->id()) && has_loopback_) {
         return;
 
       if ((src->id() == dst->id()) && has_loopback_) {
-        s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
+        s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
 
         route->link_list->push_back(info.link_up);
         if (lat)
 
         route->link_list->push_back(info.link_up);
         if (lat)
@@ -200,11 +200,11 @@ namespace simgrid {
         s_surf_parsing_link_up_down_t info;
 
         if (has_limiter_) {    // limiter for sender
         s_surf_parsing_link_up_down_t info;
 
         if (has_limiter_) {    // limiter for sender
-          info = xbt_dynar_get_as(upDownLinks, nodeOffset + has_loopback_, s_surf_parsing_link_up_down_t);
+          info = xbt_dynar_get_as(upDownLinks_, nodeOffset + has_loopback_, s_surf_parsing_link_up_down_t);
           route->link_list->push_back(info.link_up);
         }
 
           route->link_list->push_back(info.link_up);
         }
 
-        info = xbt_dynar_get_as(upDownLinks, linkOffset, s_surf_parsing_link_up_down_t);
+        info = xbt_dynar_get_as(upDownLinks_, linkOffset, s_surf_parsing_link_up_down_t);
 
         if (use_lnk_up == false) {
           route->link_list->push_back(info.link_down);
 
         if (use_lnk_up == false) {
           route->link_list->push_back(info.link_down);
index 5979392..3a9f80e 100644 (file)
@@ -19,7 +19,6 @@ namespace simgrid {
     }
     AsImpl::~AsImpl()
     {
     }
     AsImpl::~AsImpl()
     {
-      xbt_dynar_free(&upDownLinks);
       delete netcard_;
     }
 
       delete netcard_;
     }
 
index 332335c..527d0dc 100644 (file)
@@ -71,7 +71,6 @@ public:
   };
   /* FIXME: protect the following fields once the construction madness is sorted out */
   RoutingMode hierarchy_ = RoutingMode::unset;
   };
   /* FIXME: protect the following fields once the construction madness is sorted out */
   RoutingMode hierarchy_ = RoutingMode::unset;
-  xbt_dynar_t upDownLinks = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
   surf::NetCard *netcard_ = nullptr; // Our representative in the father AS
 };
 
   surf::NetCard *netcard_ = nullptr; // Our representative in the father AS
 };
 
index c935f6c..d773f14 100644 (file)
@@ -24,7 +24,7 @@ static inline double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t
 namespace simgrid {
 namespace surf {
   AsVivaldi::AsVivaldi(const char *name)
 namespace simgrid {
 namespace surf {
   AsVivaldi::AsVivaldi(const char *name)
-    : AsRoutedGraph(name)
+    : AsCluster(name)
   {}
 
 void AsVivaldi::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
   {}
 
 void AsVivaldi::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
@@ -50,8 +50,8 @@ void AsVivaldi::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb
   if(src->isHost()){
     tmp_src_name = HOST_PEER(src->name());
 
   if(src->isHost()){
     tmp_src_name = HOST_PEER(src->name());
 
-    if ((int)xbt_dynar_length(upDownLinks)>src->id()) {
-      info = xbt_dynar_get_as(upDownLinks, src->id(), s_surf_parsing_link_up_down_t);
+    if ((int)xbt_dynar_length(upDownLinks_)>src->id()) {
+      info = xbt_dynar_get_as(upDownLinks_, src->id(), s_surf_parsing_link_up_down_t);
       if(info.link_up) { // link up
         route->link_list->push_back(info.link_up);
         if (lat)
       if(info.link_up) { // link up
         route->link_list->push_back(info.link_up);
         if (lat)
@@ -73,8 +73,8 @@ void AsVivaldi::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb
   if(dst->isHost()){
     tmp_dst_name = HOST_PEER(dst->name());
 
   if(dst->isHost()){
     tmp_dst_name = HOST_PEER(dst->name());
 
-    if ((int)xbt_dynar_length(upDownLinks)>dst->id()) {
-      info = xbt_dynar_get_as(upDownLinks, dst->id(), s_surf_parsing_link_up_down_t);
+    if ((int)xbt_dynar_length(upDownLinks_)>dst->id()) {
+      info = xbt_dynar_get_as(upDownLinks_, dst->id(), s_surf_parsing_link_up_down_t);
       if(info.link_down) { // link down
         route->link_list->push_back(info.link_down);
         if (lat)
       if(info.link_down) { // link down
         route->link_list->push_back(info.link_down);
         if (lat)
index 1e9c632..3903496 100644 (file)
@@ -6,12 +6,13 @@
 #ifndef SURF_ROUTING_VIVALDI_HPP_
 #define SURF_ROUTING_VIVALDI_HPP_
 
 #ifndef SURF_ROUTING_VIVALDI_HPP_
 #define SURF_ROUTING_VIVALDI_HPP_
 
-#include "src/surf/AsRoutedGraph.hpp"
+#include "src/surf/AsCluster.hpp"
 
 namespace simgrid {
 namespace surf {
 
 
 namespace simgrid {
 namespace surf {
 
-class XBT_PRIVATE AsVivaldi: public AsRoutedGraph {
+/* This derivates from cluster because each host has a private link */
+class XBT_PRIVATE AsVivaldi: public AsCluster {
 public:
   AsVivaldi(const char *name);
   ~AsVivaldi() {};
 public:
   AsVivaldi(const char *name);
   ~AsVivaldi() {};
index 1a7c2cd..6989e52 100644 (file)
@@ -343,7 +343,8 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster)
         info_loop.link_up   = Link::byName(tmp_link);
         info_loop.link_down = info_loop.link_up;
         free(tmp_link);
         info_loop.link_up   = Link::byName(tmp_link);
         info_loop.link_down = info_loop.link_up;
         free(tmp_link);
-        xbt_dynar_set(current_routing->upDownLinks, rankId*(static_cast<AsCluster*>(current_routing))->nb_links_per_node_, &info_loop);
+        auto as_cluster = static_cast<AsCluster*>(current_routing);
+        xbt_dynar_set(as_cluster->upDownLinks_, rankId*as_cluster->nb_links_per_node_, &info_loop);
       }
 
       //add a limiter link (shared link to account for maximal bandwidth of the node)
       }
 
       //add a limiter link (shared link to account for maximal bandwidth of the node)
@@ -363,7 +364,7 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster)
         info_lim.link_down = info_lim.link_up;
         free(tmp_link);
         auto as_cluster = static_cast<AsCluster*>(current_routing);
         info_lim.link_down = info_lim.link_up;
         free(tmp_link);
         auto as_cluster = static_cast<AsCluster*>(current_routing);
-        xbt_dynar_set(current_routing->upDownLinks, rankId*(as_cluster)->nb_links_per_node_ + as_cluster->has_loopback_ , &info_lim);
+        xbt_dynar_set(as_cluster->upDownLinks_, rankId*(as_cluster)->nb_links_per_node_ + as_cluster->has_loopback_ , &info_lim);
 
       }
 
 
       }
 
@@ -955,26 +956,26 @@ void sg_platf_new_AS_end()
 }
 
 /** @brief Add a link connecting an host to the rest of its AS (which must be cluster or vivaldi) */
 }
 
 /** @brief Add a link connecting an host to the rest of its AS (which must be cluster or vivaldi) */
-void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t netcard_arg)
+void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t hostlink)
 {
 {
-  simgrid::surf::NetCard *netcard = sg_host_by_name(netcard_arg->id)->pimpl_netcard;
-  xbt_assert(netcard, "Host '%s' not found!", netcard_arg->id);
-  xbt_assert(dynamic_cast<simgrid::surf::AsCluster*>(current_routing) ||
-             dynamic_cast<simgrid::surf::AsVivaldi*>(current_routing),
-      "Only hosts from Cluster and Vivaldi ASes can get a host_link.");
+  simgrid::surf::NetCard *netcard = sg_host_by_name(hostlink->id)->pimpl_netcard;
+  xbt_assert(netcard, "Host '%s' not found!", hostlink->id);
+  xbt_assert(dynamic_cast<simgrid::surf::AsCluster*>(current_routing),
+      "Only hosts from Cluster and Vivaldi ASes can get an host_link.");
 
   s_surf_parsing_link_up_down_t link_up_down;
 
   s_surf_parsing_link_up_down_t link_up_down;
-  link_up_down.link_up = Link::byName(netcard_arg->link_up);
-  link_up_down.link_down = Link::byName(netcard_arg->link_down);
+  link_up_down.link_up = Link::byName(hostlink->link_up);
+  link_up_down.link_down = Link::byName(hostlink->link_down);
 
 
-  xbt_assert(link_up_down.link_up, "Link '%s' not found!",netcard_arg->link_up);
-  xbt_assert(link_up_down.link_down, "Link '%s' not found!",netcard_arg->link_down);
+  xbt_assert(link_up_down.link_up, "Link '%s' not found!",hostlink->link_up);
+  xbt_assert(link_up_down.link_down, "Link '%s' not found!",hostlink->link_down);
 
   // If dynar is is greater than netcard id and if the host_link is already defined
 
   // If dynar is is greater than netcard id and if the host_link is already defined
-  if((int)xbt_dynar_length(current_routing->upDownLinks) > netcard->id() &&
-      xbt_dynar_get_as(current_routing->upDownLinks, netcard->id(), void*))
-  surf_parse_error("Host_link for '%s' is already defined!",netcard_arg->id);
+  auto as_cluster = static_cast<simgrid::surf::AsCluster*>(current_routing);
+  if((int)xbt_dynar_length(as_cluster->upDownLinks_) > netcard->id() &&
+      xbt_dynar_get_as(as_cluster->upDownLinks_, netcard->id(), void*))
+  surf_parse_error("Host_link for '%s' is already defined!",hostlink->id);
 
   XBT_DEBUG("Push Host_link for host '%s' to position %d", netcard->name(), netcard->id());
 
   XBT_DEBUG("Push Host_link for host '%s' to position %d", netcard->name(), netcard->id());
-  xbt_dynar_set_as(current_routing->upDownLinks, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down);
+  xbt_dynar_set_as(as_cluster->upDownLinks_, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down);
 }
 }