Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
FatTreeZone: Add limiters for switches
[simgrid.git] / src / surf / sg_platf.cpp
index 24e7ab7..e63fc05 100644 (file)
@@ -155,7 +155,12 @@ static std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::
 sg_platf_cluster_create_host(const simgrid::kernel::routing::ClusterCreationArgs* cluster, simgrid::s4u::NetZone* zone,
                              const std::vector<unsigned int>& /*coord*/, int id)
 {
-  std::string host_id = std::string(cluster->prefix) + std::to_string(id) + cluster->suffix;
+  xbt_assert(static_cast<unsigned long>(id) < cluster->radicals.size(),
+             "Zone(%s): error when creating host number %d in the zone. Insufficient number of radicals available "
+             "(total = %zu). Check the 'radical' parameter in XML",
+             cluster->id.c_str(), id, cluster->radicals.size());
+
+  std::string host_id = std::string(cluster->prefix) + std::to_string(cluster->radicals[id]) + cluster->suffix;
   XBT_DEBUG("Cluster: creating host=%s speed=%f", host_id.c_str(), cluster->speeds.front());
   const simgrid::s4u::Host* host = zone->create_host(host_id, cluster->speeds)
                                        ->set_core_count(cluster->core_amount)
@@ -169,7 +174,13 @@ static simgrid::s4u::Link*
 sg_platf_cluster_create_loopback(const simgrid::kernel::routing::ClusterCreationArgs* cluster,
                                  simgrid::s4u::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
 {
-  std::string link_id = std::string(cluster->id) + "_link_" + std::to_string(id) + "_loopback";
+  xbt_assert(static_cast<unsigned long>(id) < cluster->radicals.size(),
+             "Zone(%s): error when creating loopback for host number %d in the zone. Insufficient number of radicals "
+             "available "
+             "(total = %zu). Check the 'radical' parameter in XML",
+             cluster->id.c_str(), id, cluster->radicals.size());
+
+  std::string link_id = std::string(cluster->id) + "_link_" + std::to_string(cluster->radicals[id]) + "_loopback";
   XBT_DEBUG("Cluster: creating loopback link=%s bw=%f", link_id.c_str(), cluster->loopback_bw);
 
   simgrid::s4u::Link* loopback = zone->create_link(link_id, cluster->loopback_bw)
@@ -200,38 +211,37 @@ static void sg_platf_new_cluster_hierarchical(const simgrid::kernel::routing::Cl
   using simgrid::kernel::routing::TorusZone;
 
   auto set_host = std::bind(sg_platf_cluster_create_host, cluster, _1, _2, _3);
-  std::function<simgrid::s4u::ClusterLinkCb> set_loopback{};
-  std::function<simgrid::s4u::ClusterLinkCb> set_limiter{};
+  std::function<simgrid::s4u::ClusterCallbacks::ClusterLinkCb> set_loopback{};
+  std::function<simgrid::s4u::ClusterCallbacks::ClusterLinkCb> set_limiter{};
 
   if (cluster->loopback_bw > 0 || cluster->loopback_lat > 0) {
     set_loopback = std::bind(sg_platf_cluster_create_loopback, cluster, _1, _2, _3);
   }
 
   if (cluster->limiter_link > 0) {
-    set_loopback = std::bind(sg_platf_cluster_create_limiter, cluster, _1, _2, _3);
+    set_limiter = std::bind(sg_platf_cluster_create_limiter, cluster, _1, _2, _3);
   }
 
-  simgrid::s4u::NetZone* parent = routing_get_current() ? routing_get_current()->get_iface() : nullptr;
+  simgrid::s4u::NetZone const* parent = routing_get_current() ? routing_get_current()->get_iface() : nullptr;
   simgrid::s4u::NetZone* zone;
   switch (cluster->topology) {
     case simgrid::kernel::routing::ClusterTopology::TORUS:
       zone = simgrid::s4u::create_torus_zone(
-          cluster->id, parent, TorusZone::parse_topo_parameters(cluster->topo_parameters), cluster->bw, cluster->lat,
-          cluster->sharing_policy, set_host, set_loopback, set_limiter);
+          cluster->id, parent, TorusZone::parse_topo_parameters(cluster->topo_parameters),
+          {set_host, set_loopback, set_limiter}, cluster->bw, cluster->lat, cluster->sharing_policy);
       break;
     case simgrid::kernel::routing::ClusterTopology::DRAGONFLY:
       zone = simgrid::s4u::create_dragonfly_zone(
-          cluster->id, parent, DragonflyZone::parse_topo_parameters(cluster->topo_parameters), cluster->bw,
-          cluster->lat, cluster->sharing_policy, set_host, set_loopback, set_limiter);
+          cluster->id, parent, DragonflyZone::parse_topo_parameters(cluster->topo_parameters),
+          {set_host, set_loopback, set_limiter}, cluster->bw, cluster->lat, cluster->sharing_policy);
       break;
     case simgrid::kernel::routing::ClusterTopology::FAT_TREE:
       zone = simgrid::s4u::create_fatTree_zone(
-          cluster->id, parent, FatTreeZone::parse_topo_parameters(cluster->topo_parameters), cluster->bw, cluster->lat,
-          cluster->sharing_policy, set_host, set_loopback, set_limiter);
+          cluster->id, parent, FatTreeZone::parse_topo_parameters(cluster->topo_parameters),
+          {set_host, set_loopback, set_limiter}, cluster->bw, cluster->lat, cluster->sharing_policy);
       break;
     default:
       THROW_IMPOSSIBLE;
-      break;
   }
   zone->seal();
 }
@@ -306,8 +316,9 @@ static void sg_platf_new_cluster_flat(simgrid::kernel::routing::ClusterCreationA
       current_zone->add_private_link_at(current_zone->node_pos_with_loopback(rankId), {limiter, limiter});
     }
 
+    current_zone->set_link_characteristics(cluster->bw, cluster->lat, cluster->sharing_policy);
     // call the cluster function that adds the others links
-    current_zone->create_links_for_node(cluster, i, rankId, current_zone->node_pos_with_loopback_limiter(rankId));
+    current_zone->create_links(i, rankId);
     rankId++;
   }