X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/895710d49f77179d9893bc76b3e31b69fae638af..40ee10e13b61bfb28374d96ade010a262b5abd44:/include/simgrid/kernel/routing/FatTreeZone.hpp diff --git a/include/simgrid/kernel/routing/FatTreeZone.hpp b/include/simgrid/kernel/routing/FatTreeZone.hpp index 7fbf25f6e2..fabeea233a 100644 --- a/include/simgrid/kernel/routing/FatTreeZone.hpp +++ b/include/simgrid/kernel/routing/FatTreeZone.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2018. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2014-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -8,13 +8,11 @@ #include -namespace simgrid { -namespace kernel { -namespace routing { +namespace simgrid::kernel::routing { class XBT_PRIVATE FatTreeLink; -/** \brief A node in a fat tree (@ref FatTreeZone). +/** @brief A node in a fat tree (@ref FatTreeZone). * A FatTreeNode can either be a switch or a processing node. Switches are * identified by a negative ID. This class is closely related to fat */ @@ -25,7 +23,7 @@ public: /* Level into the tree, with 0 being the leafs. */ unsigned int level; - /* \brief Position into the level, starting from 0. + /* @brief Position into the level, starting from 0. */ unsigned int position; /** In order to link nodes between them, each one must be assigned a label, @@ -38,38 +36,46 @@ public: /** Links to the lower level, where the position in the vector corresponds to * a port number. */ - std::vector children; + std::vector> children; /** Links to the upper level, where the position in the vector corresponds to * a port number. */ - std::vector parents; + std::vector> parents; /** Virtual link standing for the node global capacity. */ - resource::LinkImpl* limiter_link_; + resource::StandardLinkImpl* limiter_link_; /** If present, communications from this node to this node will pass through it * instead of passing by an upper level switch. */ - resource::LinkImpl* loopback; - FatTreeNode(ClusterCreationArgs* cluster, int id, int level, int position); + resource::StandardLinkImpl* loopback_; + FatTreeNode(int id, int level, int position, resource::StandardLinkImpl* limiter, + resource::StandardLinkImpl* loopback) + : id(id), level(level), position(position), limiter_link_(limiter), loopback_(loopback) + { + } }; -/** \brief Link in a fat tree (@ref FatTreeZone). +/** @brief Link in a fat tree (@ref FatTreeZone). * * Represents a single, duplex link in a fat tree. This is necessary to have a tree. * It is equivalent to a physical link. */ class FatTreeLink { public: - FatTreeLink(ClusterCreationArgs* cluster, FatTreeNode* source, FatTreeNode* destination); - /** Link going up in the tree */ - resource::LinkImpl* up_link_; - /** Link going down in the tree */ - resource::LinkImpl* down_link_; + FatTreeLink(FatTreeNode* src, FatTreeNode* dst, resource::StandardLinkImpl* linkup, + resource::StandardLinkImpl* linkdown) + : up_node_(dst), down_node_(src), up_link_(linkup), down_link_(linkdown) + { + } /** Upper end of the link */ FatTreeNode* up_node_; /** Lower end of the link */ FatTreeNode* down_node_; + /** Link going up in the tree */ + resource::StandardLinkImpl* up_link_; + /** Link going down in the tree */ + resource::StandardLinkImpl* down_link_; }; /** @ingroup ROUTING_API @@ -96,51 +102,61 @@ public: * * Routing is made using a destination-mod-k scheme. */ -class XBT_PRIVATE FatTreeZone : public ClusterZone { -public: - explicit FatTreeZone(NetZone* father, std::string name); - ~FatTreeZone() override; - void get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArgs* into, double* latency) override; - - /** \brief Generate the fat tree +class XBT_PRIVATE FatTreeZone : public ClusterBase { + /** @brief Generate the fat tree * * Once all processing nodes have been added, this will make sure the fat * tree is generated by calling generateLabels(), generateSwitches() and * then connection all nodes between them, using their label. */ - void seal() override; - /** \brief Read the parameters in topo_parameters field. - * - * It will also store the cluster for future use. - */ - void parse_specific_arguments(ClusterCreationArgs* cluster) override; - void add_processing_node(int id); - void generate_dot_file(const std::string& filename = "fat_tree.dot") const; - -private: // description of a PGFT (TODO : better doc) unsigned long levels_ = 0; std::vector num_children_per_node_; // number of children by node std::vector num_parents_per_node_; // number of parents by node std::vector num_port_lower_level_; // ports between each level l and l-1 - std::map compute_nodes_; - std::vector nodes_; - std::vector links_; + std::map> compute_nodes_; + std::vector> nodes_; + std::vector> links_; std::vector nodes_by_level_; - ClusterCreationArgs* cluster_ = nullptr; - void add_link(FatTreeNode* parent, unsigned int parent_port, FatTreeNode* child, unsigned int child_port); int get_level_position(const unsigned int level); + void generate_switches(const s4u::ClusterCallbacks& set_callbacks); void generate_labels(); - void generate_switches(); int connect_node_to_parents(FatTreeNode* node); - bool are_related(FatTreeNode* parent, FatTreeNode* child); - bool is_in_sub_tree(FatTreeNode* root, FatTreeNode* node); + bool are_related(FatTreeNode* parent, FatTreeNode* child) const; + bool is_in_sub_tree(const FatTreeNode* root, const FatTreeNode* node) const; + + void do_seal() override; + +public: + explicit FatTreeZone(const std::string& name) : ClusterBase(name){}; + FatTreeZone(const FatTreeZone&) = delete; + FatTreeZone& operator=(const FatTreeZone&) = delete; + void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override; + + /** + * @brief Parse the topology parameters from string format + * + * @param topo_parameters String with topology, e.g. "2;4,4;1,2;1,2" + */ + static s4u::FatTreeParams parse_topo_parameters(const std::string& topo_parameters); + /** @brief Checks topology parameters */ + static void check_topology(unsigned int n_levels, const std::vector& down_links, + const std::vector& up_links, const std::vector& link_count); + /** @brief Set FatTree topology */ + void set_topology(unsigned int n_levels, const std::vector& down_links, + const std::vector& up_links, const std::vector& link_count); + void add_processing_node(int id, resource::StandardLinkImpl* limiter, resource::StandardLinkImpl* loopback); + /** + * @brief Build upper levels (switches) in Fat-Tree + * + * Suppose that set_topology and add_processing_node have already been called + */ + void build_upper_levels(const s4u::ClusterCallbacks& set_callbacks); + void generate_dot_file(const std::string& filename = "fat_tree.dot") const; }; -} // namespace routing -} // namespace kernel -} // namespace simgrid +} // namespace simgrid::kernel::routing #endif