class XBT_PRIVATE FatTreeLink;
-/** \brief A node in a fat tree (@ref AsClusterFatTree).
+/** \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
*/
int id;
/* Level into the tree, with 0 being the leafs.
*/
- unsigned int level;
+ unsigned int level;
/* \brief Position into the level, starting from 0.
*/
- unsigned int position;
+ unsigned int position;
/** In order to link nodes between them, each one must be assigned a label,
* consisting of l integers, l being the levels number of the tree. Each label
* is unique in the level, and the way it is generated allows the construction
std::vector<unsigned int> label;
/** Links to the lower level, where the position in the vector corresponds to
- * a port number.
+ * a port number.
*/
std::vector<FatTreeLink*> children;
/** Links to the upper level, where the position in the vector corresponds to
- * a port number.
- */
+ * a port number.
+ */
std::vector<FatTreeLink*> parents;
/** Virtual link standing for the node global capacity.
*/
- Link* limiterLink;
+ surf::LinkImpl* limiterLink;
/** If present, communications from this node to this node will pass through it
* instead of passing by an upper level switch.
*/
- Link* loopback;
- FatTreeNode(sg_platf_cluster_cbarg_t cluster, int id, int level, int position);
+ surf::LinkImpl* loopback;
+ FatTreeNode(ClusterCreationArgs* cluster, int id, int level, int position);
};
-
-
-/** \brief Link in a fat tree (@ref AsClusterFatTree).
+/** \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(sg_platf_cluster_cbarg_t cluster, FatTreeNode *source, FatTreeNode *destination);
+ FatTreeLink(ClusterCreationArgs* cluster, FatTreeNode* source, FatTreeNode* destination);
/** Link going up in the tree */
- Link *upLink;
+ surf::LinkImpl* upLink;
/** Link going down in the tree */
- Link *downLink;
+ surf::LinkImpl* downLink;
/** Upper end of the link */
- FatTreeNode *upNode;
+ FatTreeNode* upNode;
/** Lower end of the link */
- FatTreeNode *downNode;
+ FatTreeNode* downNode;
};
-/**
- * \class AsClusterFatTree
- *
- * \brief Fat tree representation and routing.
+/** @ingroup ROUTING_API
+ * @brief NetZone using a Fat-Tree topology
*
* Generate fat trees according to the topology asked for, according to:
* Eitan Zahavi, D-Mod-K Routing Providing Non-Blocking Traffic for Shift
* which are not currently enforced.
*
* The exact topology is described in the mandatory topo_parameters
- * field, and follow the "h ; m_h, ..., m_1 ; w_h, ..., w_1 ; p_h, ..., p_1" format.
+ * field, and follow the "h ; m_1, ..., m_h ; w_1, ..., w_h ; p_1, ..., p_h" format.
* h stands for the switches levels number, i.e. the fat tree is of height h,
* without the processing nodes. m_i stands for the number of lower level nodes
* connected to a node in level i. w_i stands for the number of upper levels
- * nodes connected to a node in level i-1. p_i stands for the number of
+ * nodes connected to a node in level i-1. p_i stands for the number of
* parallel links connecting two nodes between level i and i - 1. Level h is
* the topmost switch level, level 1 is the lowest switch level, and level 0
* represents the processing nodes. The number of provided nodes must be exactly
*
* Routing is made using a destination-mod-k scheme.
*/
-class XBT_PRIVATE AsClusterFatTree : public AsCluster {
+class XBT_PRIVATE FatTreeZone : public ClusterZone {
public:
- explicit AsClusterFatTree(As* father, const char* name);
- ~AsClusterFatTree() override;
- void getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t into, double* latency) override;
+ explicit FatTreeZone(NetZone* father, std::string name);
+ ~FatTreeZone() override;
+ void getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cbarg_t into, double* latency) override;
/** \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
+ * tree is generated by calling generateLabels(), generateSwitches() and
* then connection all nodes between them, using their label.
*/
void seal() override;
*
* It will also store the cluster for future use.
*/
- void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) override;
+ void parse_specific_arguments(ClusterCreationArgs* cluster) override;
void addProcessingNode(int id);
void generateDotFile(const std::string& filename = "fatTree.dot") const;
private:
-
- //description of a PGFT (TODO : better doc)
- unsigned int levels_ = 0;
+ // description of a PGFT (TODO : better doc)
+ unsigned long levels_ = 0;
std::vector<unsigned int> lowerLevelNodesNumber_; // number of children by node
std::vector<unsigned int> upperLevelNodesNumber_; // number of parents by node
std::vector<unsigned int> lowerLevelPortsNumber_; // ports between each level l and l-1
-
+
std::map<int, FatTreeNode*> computeNodes_;
std::vector<FatTreeNode*> nodes_;
std::vector<FatTreeLink*> links_;
std::vector<unsigned int> nodesByLevel_;
- sg_platf_cluster_cbarg_t cluster_ = nullptr;
+ ClusterCreationArgs* cluster_ = nullptr;
- void addLink(FatTreeNode *parent, unsigned int parentPort,
- FatTreeNode *child, unsigned int childPort);
+ void addLink(FatTreeNode* parent, unsigned int parentPort, FatTreeNode* child, unsigned int childPort);
int getLevelPosition(const unsigned int level);
void generateLabels();
void generateSwitches();
- int connectNodeToParents(FatTreeNode *node);
- bool areRelated(FatTreeNode *parent, FatTreeNode *child);
- bool isInSubTree(FatTreeNode *root, FatTreeNode *node);
+ int connectNodeToParents(FatTreeNode* node);
+ bool areRelated(FatTreeNode* parent, FatTreeNode* child);
+ bool isInSubTree(FatTreeNode* root, FatTreeNode* node);
};
-
-}}} // namespaces
+}
+}
+} // namespaces
#endif