From 1b75ebf09b4d1b81533d140a9437efffeb9e6a0c Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Fri, 19 Aug 2016 13:21:44 +0200 Subject: [PATCH] use std::map for sparse vectors. This simplifies things --- src/kernel/routing/AsCluster.cpp | 2 +- src/kernel/routing/AsCluster.hpp | 5 ++++- src/kernel/routing/AsClusterTorus.cpp | 2 +- src/surf/sg_platf.cpp | 24 +++++++++--------------- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/kernel/routing/AsCluster.cpp b/src/kernel/routing/AsCluster.cpp index 94e2f14afb..011725aa2c 100644 --- a/src/kernel/routing/AsCluster.cpp +++ b/src/kernel/routing/AsCluster.cpp @@ -146,7 +146,7 @@ void AsCluster::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, info.linkUp = Link::byName(link_id); info.linkDown = info.linkUp; } - privateLinks_.insert(privateLinks_.begin()+position, info); + privateLinks_.insert({position, info}); xbt_free(link_id); } diff --git a/src/kernel/routing/AsCluster.hpp b/src/kernel/routing/AsCluster.hpp index 229b73fe5d..082333e7c3 100644 --- a/src/kernel/routing/AsCluster.hpp +++ b/src/kernel/routing/AsCluster.hpp @@ -6,6 +6,8 @@ #ifndef SIMGRID_ROUTING_CLUSTER_HPP_ #define SIMGRID_ROUTING_CLUSTER_HPP_ +#include + #include "src/kernel/routing/AsImpl.hpp" namespace simgrid { @@ -23,7 +25,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) {} - std::vector privateLinks_; + /* We use a map instead of a std::vector here because that's a sparse vector. Some values may not exist */ + std::unordered_map privateLinks_; Link* backbone_ = nullptr; void *loopback_ = nullptr; diff --git a/src/kernel/routing/AsClusterTorus.cpp b/src/kernel/routing/AsClusterTorus.cpp index 70f254997b..d38511f0a8 100644 --- a/src/kernel/routing/AsClusterTorus.cpp +++ b/src/kernel/routing/AsClusterTorus.cpp @@ -78,7 +78,7 @@ namespace simgrid { * note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?) * holds the link "rankId->rankId" */ - privateLinks_.insert(privateLinks_.begin() + position + j, info); + privateLinks_.insert({position + j, info}); dim_product *= current_dimension; xbt_free(link_id); } diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index f4420c6a78..ce4449a540 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -334,10 +334,7 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) free(tmp_link); auto as_cluster = static_cast(current_as); - if (rankId*as_cluster->linkCountPerNode_ >= as_cluster->privateLinks_.size()) - as_cluster->privateLinks_.resize(rankId*as_cluster->linkCountPerNode_,{nullptr, nullptr}); - as_cluster->privateLinks_.insert(as_cluster->privateLinks_.begin() + rankId*as_cluster->linkCountPerNode_, - info_loop); + as_cluster->privateLinks_.insert({rankId*as_cluster->linkCountPerNode_, info_loop}); } //add a limiter link (shared link to account for maximal bandwidth of the node) @@ -353,13 +350,13 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) sg_platf_new_link(&link); info_lim.linkUp = info_lim.linkDown = Link::byName(tmp_link); free(tmp_link); - current_as->privateLinks_.insert(current_as->privateLinks_.begin() + rankId * current_as->linkCountPerNode_ + - current_as->hasLoopback_ , info_lim); + current_as->privateLinks_.insert( + {rankId * current_as->linkCountPerNode_ + current_as->hasLoopback_ , info_lim}); } //call the cluster function that adds the others links if (cluster->topology == SURF_CLUSTER_FAT_TREE) { - ((AsClusterFatTree*) current_as)->addProcessingNode(i); + static_cast(current_as)->addProcessingNode(i); } else { current_as->create_links_for_node(cluster, i, rankId, @@ -908,14 +905,11 @@ void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t hostlink) xbt_assert(link_up_down.linkUp, "Link '%s' not found!",hostlink->link_up); xbt_assert(link_up_down.linkDown, "Link '%s' not found!",hostlink->link_down); - // If dynar is is greater than netcard id and if the host_link is already defined auto as_cluster = static_cast(current_routing); - if (as_cluster->privateLinks_.size() > netcard->id()){ - if (as_cluster->privateLinks_.at(netcard->id()).linkUp != nullptr) - surf_parse_error("Host_link for '%s' is already defined!",hostlink->id); - } else { - as_cluster->privateLinks_.resize(netcard->id(), {nullptr, nullptr}); - } + + if (as_cluster->privateLinks_.find(netcard->id()) != as_cluster->privateLinks_.end()) + 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()); - as_cluster->privateLinks_.insert(as_cluster->privateLinks_.begin() + netcard->id(), link_up_down); + as_cluster->privateLinks_.insert({netcard->id(), link_up_down}); } -- 2.20.1