X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/39c935d6d5ee86d153f6f7e6a10d723ae7c57f6f..24947937a4e48cf91d79eb889e1a6d6c30cbc2ef:/src/kernel/routing/FatTreeZone.cpp diff --git a/src/kernel/routing/FatTreeZone.cpp b/src/kernel/routing/FatTreeZone.cpp index 228527ae2d..e68caae8b5 100644 --- a/src/kernel/routing/FatTreeZone.cpp +++ b/src/kernel/routing/FatTreeZone.cpp @@ -12,7 +12,6 @@ #include "src/surf/network_interface.hpp" #include "src/surf/xml/platf_private.hpp" - #include #include @@ -22,20 +21,12 @@ namespace simgrid { namespace kernel { namespace routing { -FatTreeZone::FatTreeZone(NetZoneImpl* father, const std::string& name, resource::NetworkModel* netmodel) - : ClusterZone(father, name, netmodel) -{ - XBT_DEBUG("Creating a new fat tree."); -} - FatTreeZone::~FatTreeZone() { - for (FatTreeNode const* node : this->nodes_) { + for (FatTreeNode const* node : this->nodes_) delete node; - } - for (FatTreeLink const* link : this->links_) { + for (FatTreeLink const* link : this->links_) delete link; - } } bool FatTreeZone::is_in_sub_tree(FatTreeNode* root, FatTreeNode* node) const @@ -79,10 +70,10 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArg dst->get_cname(), dst->id()); /* In case destination is the source, and there is a loopback, let's use it instead of going up to a switch */ - if (source->id == destination->id && this->has_loopback_) { - into->link_list.push_back(source->loopback); + if (source->id == destination->id && has_loopback()) { + into->link_list.push_back(source->loopback_); if (latency) - *latency += source->loopback->get_latency(); + *latency += source->loopback_->get_latency(); return; } @@ -102,7 +93,7 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArg if (latency) *latency += currentNode->parents[d]->up_link_->get_latency(); - if (this->has_limiter_) + if (currentNode->limiter_link_) into->link_list.push_back(currentNode->limiter_link_); currentNode = currentNode->parents[d]->up_node_; } @@ -118,7 +109,7 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArg if (latency) *latency += currentNode->children[i]->down_link_->get_latency(); currentNode = currentNode->children[i]->down_node_; - if (this->has_limiter_) + if (currentNode->limiter_link_) into->link_list.push_back(currentNode->limiter_link_); XBT_DEBUG("%d(%u,%u) is accessible through %d(%u,%u)", destination->id, destination->level, destination->position, currentNode->id, currentNode->level, currentNode->position); @@ -130,7 +121,7 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArg /* This function makes the assumption that parse_specific_arguments() and * addNodes() have already been called */ -void FatTreeZone::seal() +void FatTreeZone::do_seal() { if (this->levels_ == 0) { return; @@ -178,9 +169,9 @@ void FatTreeZone::seal() int FatTreeZone::connect_node_to_parents(FatTreeNode* node) { - auto currentParentNode = this->nodes_.begin(); - int connectionsNumber = 0; - const int level = node->level; + auto currentParentNode = this->nodes_.begin(); + int connectionsNumber = 0; + const int level = node->level; XBT_DEBUG("We are connecting node %d(%u,%u) to his parents.", node->id, node->level, node->position); currentParentNode += this->get_level_position(level + 1); for (unsigned int i = 0; i < this->nodes_by_level_[level + 1]; i++) { @@ -264,7 +255,7 @@ void FatTreeZone::generate_switches() int k = 0; for (unsigned int i = 0; i < this->levels_; i++) { for (unsigned int j = 0; j < this->nodes_by_level_[i + 1]; j++) { - auto* newNode = new FatTreeNode(this->cluster_, --k, i + 1, j); + auto* newNode = new FatTreeNode(--k, i + 1, j, nullptr, nullptr); XBT_DEBUG("We create the switch %d(%u,%u)", newNode->id, newNode->level, newNode->position); newNode->children.resize(this->num_children_per_node_[i] * this->num_port_lower_level_[i]); if (i != this->levels_ - 1) { @@ -332,12 +323,11 @@ int FatTreeZone::get_level_position(const unsigned int level) return tempPosition; } -void FatTreeZone::add_processing_node(int id) +void FatTreeZone::add_processing_node(int id, resource::LinkImpl* limiter, resource::LinkImpl* loopback) { using std::make_pair; static int position = 0; - FatTreeNode* newNode; - newNode = new FatTreeNode(this->cluster_, id, 0, position++); + auto* newNode = new FatTreeNode(id, 0, position++, limiter, loopback); newNode->parents.resize(this->num_parents_per_node_[0] * this->num_port_lower_level_[0]); newNode->label.resize(this->levels_); this->compute_nodes_.insert(make_pair(id, newNode)); @@ -346,8 +336,22 @@ void FatTreeZone::add_processing_node(int id) void FatTreeZone::add_link(FatTreeNode* parent, unsigned int parentPort, FatTreeNode* child, unsigned int childPort) { - FatTreeLink* newLink; - newLink = new FatTreeLink(this->cluster_, child, parent); + static int uniqueId = 0; + const s4u::Link* linkup; + const s4u::Link* linkdown; + std::string id = + "link_from_" + std::to_string(child->id) + "_" + std::to_string(parent->id) + "_" + std::to_string(uniqueId); + + if (cluster_->sharing_policy == s4u::Link::SharingPolicy::SPLITDUPLEX) { + linkup = create_link(id + "_UP", std::vector{cluster_->bw})->set_latency(cluster_->lat)->seal(); + linkdown = create_link(id + "_DOWN", std::vector{cluster_->bw})->set_latency(cluster_->lat)->seal(); + } else { + linkup = create_link(id, std::vector{cluster_->bw})->set_latency(cluster_->lat)->seal(); + linkdown = linkup; + } + uniqueId++; + + auto* newLink = new FatTreeLink(child, parent, linkup->get_impl(), linkdown->get_impl()); XBT_DEBUG("Creating a link between the parent (%u,%u,%u) and the child (%u,%u,%u)", parent->level, parent->position, parentPort, child->level, child->position, childPort); parent->children[parentPort] = newLink; @@ -437,50 +441,14 @@ void FatTreeZone::generate_dot_file(const std::string& filename) const file << "}"; file.close(); } +} // namespace routing +} // namespace kernel -FatTreeNode::FatTreeNode(const ClusterCreationArgs* cluster, int id, int level, int position) - : id(id), level(level), position(position) +namespace s4u { +NetZone* create_fatTree_zone(const std::string& name) { - LinkCreationArgs linkTemplate; - if (cluster->limiter_link != 0.0) { - linkTemplate.bandwidths.push_back(cluster->limiter_link); - linkTemplate.latency = 0; - linkTemplate.policy = s4u::Link::SharingPolicy::SHARED; - linkTemplate.id = "limiter_"+std::to_string(id); - sg_platf_new_link(&linkTemplate); - this->limiter_link_ = s4u::Link::by_name(linkTemplate.id)->get_impl(); - } - if (cluster->loopback_bw != 0.0 || cluster->loopback_lat != 0.0) { - linkTemplate.bandwidths.push_back(cluster->loopback_bw); - linkTemplate.latency = cluster->loopback_lat; - linkTemplate.policy = s4u::Link::SharingPolicy::FATPIPE; - linkTemplate.id = "loopback_"+ std::to_string(id); - sg_platf_new_link(&linkTemplate); - this->loopback = s4u::Link::by_name(linkTemplate.id)->get_impl(); - } + return (new kernel::routing::FatTreeZone(name))->get_iface(); } +} // namespace s4u -FatTreeLink::FatTreeLink(const ClusterCreationArgs* cluster, FatTreeNode* downNode, FatTreeNode* upNode) - : up_node_(upNode), down_node_(downNode) -{ - static int uniqueId = 0; - LinkCreationArgs linkTemplate; - linkTemplate.bandwidths.push_back(cluster->bw); - linkTemplate.latency = cluster->lat; - linkTemplate.policy = cluster->sharing_policy; // sthg to do with that ? - linkTemplate.id = - "link_from_" + std::to_string(downNode->id) + "_" + std::to_string(upNode->id) + "_" + std::to_string(uniqueId); - sg_platf_new_link(&linkTemplate); - - if (cluster->sharing_policy == s4u::Link::SharingPolicy::SPLITDUPLEX) { - this->up_link_ = s4u::Link::by_name(linkTemplate.id + "_UP")->get_impl(); // check link? - this->down_link_ = s4u::Link::by_name(linkTemplate.id + "_DOWN")->get_impl(); // check link ? - } else { - this->up_link_ = s4u::Link::by_name(linkTemplate.id)->get_impl(); - this->down_link_ = this->up_link_; - } - uniqueId++; -} -} // namespace routing -} // namespace kernel } // namespace simgrid