X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2ccf4cc115bbe75120d9264dc17ea7f7fed551e8..4a45895d75b6268e77e7a4d925fd175649e3866a:/src/surf/sg_platf.cpp diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index 9a67956c3c..e63fc05bc0 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -97,11 +97,11 @@ void sg_platf_new_peer(const simgrid::kernel::routing::PeerCreationArgs* args) auto* zone = dynamic_cast(current_routing); xbt_assert(zone, " tag can only be used in Vivaldi netzones."); - auto* peer = zone->create_host(args->id, std::vector{args->speed}) - ->set_state_profile(args->state_trace) - ->set_speed_profile(args->speed_trace) - ->set_coordinates(args->coord) - ->seal(); + const auto* peer = zone->create_host(args->id, std::vector{args->speed}) + ->set_state_profile(args->state_trace) + ->set_speed_profile(args->speed_trace) + ->set_coordinates(args->coord) + ->seal(); zone->set_peer_link(peer->get_netpoint(), args->bw_in, args->bw_out); } @@ -150,35 +150,115 @@ void sg_platf_new_disk(const simgrid::kernel::routing::DiskCreationArgs* disk) current_host->add_disk(new_disk); } -void sg_platf_new_cluster(simgrid::kernel::routing::ClusterCreationArgs* cluster) +/** @brief Auxiliary function to create hosts */ +static std::pair +sg_platf_cluster_create_host(const simgrid::kernel::routing::ClusterCreationArgs* cluster, simgrid::s4u::NetZone* zone, + const std::vector& /*coord*/, int id) { - using simgrid::kernel::routing::ClusterZone; + xbt_assert(static_cast(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) + ->set_properties(cluster->properties) + ->seal(); + return std::make_pair(host->get_netpoint(), nullptr); +} + +/** @brief Auxiliary function to create loopback links */ +static simgrid::s4u::Link* +sg_platf_cluster_create_loopback(const simgrid::kernel::routing::ClusterCreationArgs* cluster, + simgrid::s4u::NetZone* zone, const std::vector& /*coord*/, int id) +{ + xbt_assert(static_cast(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) + ->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::FATPIPE) + ->set_latency(cluster->loopback_lat) + ->seal(); + return loopback; +} + +/** @brief Auxiliary function to create limiter links */ +static simgrid::s4u::Link* sg_platf_cluster_create_limiter(const simgrid::kernel::routing::ClusterCreationArgs* cluster, + simgrid::s4u::NetZone* zone, + const std::vector& /*coord*/, int id) +{ + std::string link_id = std::string(cluster->id) + "_link_" + std::to_string(id) + "_limiter"; + XBT_DEBUG("Cluster: creating limiter link=%s bw=%f", link_id.c_str(), cluster->limiter_link); + + simgrid::s4u::Link* limiter = zone->create_link(link_id, cluster->limiter_link)->seal(); + return limiter; +} + +/** @brief Create Torus, Fat-Tree and Dragonfly clusters */ +static void sg_platf_new_cluster_hierarchical(const simgrid::kernel::routing::ClusterCreationArgs* cluster) +{ + using namespace std::placeholders; using simgrid::kernel::routing::DragonflyZone; using simgrid::kernel::routing::FatTreeZone; using simgrid::kernel::routing::TorusZone; - int rankId = 0; + auto set_host = std::bind(sg_platf_cluster_create_host, cluster, _1, _2, _3); + std::function set_loopback{}; + std::function set_limiter{}; - // What an inventive way of initializing the NetZone that I have as ancestor :-( - simgrid::kernel::routing::ZoneCreationArgs zone; - zone.id = cluster->id; + 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_limiter = std::bind(sg_platf_cluster_create_limiter, cluster, _1, _2, _3); + } + + 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.routing = "ClusterTorus"; + zone = simgrid::s4u::create_torus_zone( + 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.routing = "ClusterDragonfly"; + zone = simgrid::s4u::create_dragonfly_zone( + 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.routing = "ClusterFatTree"; + zone = simgrid::s4u::create_fatTree_zone( + 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: - zone.routing = "Cluster"; - break; + THROW_IMPOSSIBLE; } + zone->seal(); +} + +/** @brief Create regular Cluster */ +static void sg_platf_new_cluster_flat(simgrid::kernel::routing::ClusterCreationArgs* cluster) +{ + using simgrid::kernel::routing::ClusterZone; + + int rankId = 0; + + // What an inventive way of initializing the NetZone that I have as ancestor :-( + simgrid::kernel::routing::ZoneCreationArgs zone; + zone.id = cluster->id; + zone.routing = "Cluster"; sg_platf_new_Zone_begin(&zone); auto* current_zone = static_cast(routing_get_current()); - current_zone->parse_specific_arguments(cluster); for (auto const& elm : cluster->properties) current_zone->get_iface()->set_property(elm.first, elm.second); @@ -236,12 +316,9 @@ void sg_platf_new_cluster(simgrid::kernel::routing::ClusterCreationArgs* cluster 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 - if (cluster->topology == simgrid::kernel::routing::ClusterTopology::FAT_TREE) { - static_cast(current_zone)->add_processing_node(i, limiter, loopback); - } else { - current_zone->create_links_for_node(cluster, i, rankId, current_zone->node_pos_with_loopback_limiter(rankId)); - } + current_zone->create_links(i, rankId); rankId++; } @@ -268,6 +345,20 @@ void sg_platf_new_cluster(simgrid::kernel::routing::ClusterCreationArgs* cluster XBT_DEBUG(""); sg_platf_new_Zone_seal(); +} + +void sg_platf_new_cluster(simgrid::kernel::routing::ClusterCreationArgs* cluster) +{ + switch (cluster->topology) { + case simgrid::kernel::routing::ClusterTopology::TORUS: + case simgrid::kernel::routing::ClusterTopology::DRAGONFLY: + case simgrid::kernel::routing::ClusterTopology::FAT_TREE: + sg_platf_new_cluster_hierarchical(cluster); + break; + default: + sg_platf_new_cluster_flat(cluster); + break; + } simgrid::kernel::routing::on_cluster_creation(*cluster); } @@ -290,10 +381,10 @@ void sg_platf_new_cabinet(const simgrid::kernel::routing::CabinetCreationArgs* a std::string id = args->prefix + std::to_string(radical) + args->suffix; auto const* host = zone->create_host(id, std::vector{args->speed})->seal(); - auto* link_up = + const auto* link_up = zone->create_link("link_" + id + "_UP", std::vector{args->bw})->set_latency(args->lat)->seal(); - auto* link_down = + const auto* link_down = zone->create_link("link_" + id + "_DOWN", std::vector{args->bw})->set_latency(args->lat)->seal(); zone->add_private_link_at(host->get_netpoint()->id(), {link_up->get_impl(), link_down->get_impl()}); @@ -437,20 +528,9 @@ sg_platf_create_zone(const simgrid::kernel::routing::ZoneCreationArgs* zone) */ simgrid::kernel::routing::NetZoneImpl* sg_platf_new_Zone_begin(const simgrid::kernel::routing::ZoneCreationArgs* zone) { - /* First create the zone. - * This order is important to assure that root netzone is set when models are setting - * the default mode for each resource (CPU, network, etc) - */ - auto* new_zone = sg_platf_create_zone(zone); - - _sg_cfg_init_status = 2; /* HACK: direct access to the global controlling the level of configuration to prevent - * any further config now that we created some real content */ + current_routing = sg_platf_create_zone(zone); - /* set the new current component of the tree */ - current_routing = new_zone; - simgrid::s4u::NetZone::on_creation(*new_zone->get_iface()); // notify the signal - - return new_zone; + return current_routing; } void sg_platf_new_Zone_set_properties(const std::unordered_map& props) @@ -470,7 +550,6 @@ void sg_platf_new_Zone_seal() { xbt_assert(current_routing, "Cannot seal the current Zone: none under construction"); current_routing->seal(); - simgrid::s4u::NetZone::on_seal(*current_routing->get_iface()); current_routing = current_routing->get_parent(); }