-/* Copyright (c) 2014-2019. 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. */
#include <simgrid/kernel/routing/ClusterZone.hpp>
-namespace simgrid {
-namespace kernel {
-namespace routing {
+namespace simgrid::kernel::routing {
class XBT_PRIVATE FatTreeLink;
/** Links to the lower level, where the position in the vector corresponds to
* a port number.
*/
- std::vector<FatTreeLink*> children;
+ std::vector<std::shared_ptr<FatTreeLink>> children;
/** Links to the upper level, where the position in the vector corresponds to
* a port number.
*/
- std::vector<FatTreeLink*> parents;
+ std::vector<std::shared_ptr<FatTreeLink>> 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).
*/
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
*
* Routing is made using a destination-mod-k scheme.
*/
-class XBT_PRIVATE FatTreeZone : public ClusterZone {
-public:
- explicit FatTreeZone(NetZoneImpl* father, std::string name, resource::NetworkModel* netmodel);
- FatTreeZone(const FatTreeZone&) = delete;
- FatTreeZone& operator=(const FatTreeZone&) = delete;
- ~FatTreeZone() override;
- void get_local_route(NetPoint* src, NetPoint* dst, RouteCreationArgs* into, double* latency) override;
-
+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<unsigned int> num_children_per_node_; // number of children by node
std::vector<unsigned int> num_parents_per_node_; // number of parents by node
std::vector<unsigned int> num_port_lower_level_; // ports between each level l and l-1
- std::map<int, FatTreeNode*> compute_nodes_;
- std::vector<FatTreeNode*> nodes_;
- std::vector<FatTreeLink*> links_;
+ std::map<unsigned long, std::shared_ptr<FatTreeNode>> compute_nodes_;
+ std::vector<std::shared_ptr<FatTreeNode>> nodes_;
+ std::vector<std::shared_ptr<FatTreeLink>> links_;
std::vector<unsigned int> 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<unsigned int>& down_links,
+ const std::vector<unsigned int>& up_links, const std::vector<unsigned int>& link_count);
+ /** @brief Set FatTree topology */
+ void set_topology(unsigned int n_levels, const std::vector<unsigned int>& down_links,
+ const std::vector<unsigned int>& up_links, const std::vector<unsigned int>& 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