X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f4895c3c3d812abc5ae8cce1d75580f7ed4bbf4f..f21c3891971f5b45e2664c31a76ad526b076abfb:/src/surf/surf_routing_cluster_fat_tree.hpp diff --git a/src/surf/surf_routing_cluster_fat_tree.hpp b/src/surf/surf_routing_cluster_fat_tree.hpp index fa63eb4a8e..c4de13f1a7 100644 --- a/src/surf/surf_routing_cluster_fat_tree.hpp +++ b/src/surf/surf_routing_cluster_fat_tree.hpp @@ -23,37 +23,53 @@ class FatTreeNode; class FatTreeLink; +/* \class FatTreeNode + * \brief A node in a fat tree + */ class FatTreeNode { public: + /* \brief Unique ID which identifies every node + */ int id; - unsigned int level; // The 0th level represents the leafs of the PGFT - unsigned int position; // Position in the level - std::vector label; - /* We can see the sizes sum of the two following vectors as the device - * ports number. If we use the notations used in Zahavi's paper, - * children.size() = m_level and parents.size() = w_(level+1) - * + /* \brief Level into the tree, with 0 being the leafs + */ + unsigned int level; + /* \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, + * 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 + * of a fat tree which fits the desired topology + */ + std::vector label; + + /* Links to the lower level, where the position in the vector corresponds to + * a port number. */ - std::vector children; // m, apply from lvl 0 to levels - 1 - std::vector parents; // w, apply from lvl 1 to levels - FatTreeNode(int id, int level=-1, int position=-1); + std::vector children; + /* Links to the upper level, where the position in the vector corresponds to + * a port number. + */ + std::vector parents; + + NetworkLink* limiterLink; + NetworkLink* loopback; + FatTreeNode(sg_platf_cluster_cbarg_t cluster, int id, int level, + int position); }; class FatTreeLink { public: FatTreeLink(sg_platf_cluster_cbarg_t cluster, FatTreeNode *source, FatTreeNode *destination); - // unsigned int ports; /* Links are dependant of the chosen network model, but must implement * NetworkLink */ - NetworkLink* linkUp; // From source to destination - NetworkLink* linkDown; // From destination to source - /* As it is symetric, it might as well be first / second instead - * of source / destination - */ - FatTreeNode *source; - FatTreeNode *destination; + NetworkLink *upLink; + NetworkLink *downLink; + FatTreeNode *upNode; + FatTreeNode *downNode; }; class AsClusterFatTree : public AsCluster { @@ -66,29 +82,33 @@ public: // virtual void getRouteAndLatency(const int src, const int dst, // std::vector *route, // double *latency) const; - virtual void create_links(sg_platf_cluster_cbarg_t cluster); + virtual void create_links(); void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster); - void addComputeNodes(std::vector const& id); + void addProcessingNode(int id); void generateDotFile(const string& filename = "fatTree.dot") const; -protected: +private: + //description of a PGFT (TODO : better doc) unsigned int levels; - std::vector lowerLevelNodesNumber; // number of children by node - std::vector upperLevelNodesNumber; // number of parents by node - std::vector lowerLevelPortsNumber; // ports between each level l and l-1 + std::vector lowerLevelNodesNumber; // number of children by node + std::vector upperLevelNodesNumber; // number of parents by node + std::vector lowerLevelPortsNumber; // ports between each level l and l-1 + std::map computeNodes; std::vector nodes; - std::map, FatTreeLink*> links; + std::vector links; std::vector nodesByLevel; - void addLink(sg_platf_cluster_cbarg_t cluster, - FatTreeNode *parent, unsigned int parentPort, + sg_platf_cluster_cbarg_t cluster; + + void addLink(FatTreeNode *parent, unsigned int parentPort, FatTreeNode *child, unsigned int childPort); int getLevelPosition(const unsigned int level); void generateLabels(); void generateSwitches(); - int connectNodeToParents(sg_platf_cluster_cbarg_t cluster, FatTreeNode *node); + int connectNodeToParents(FatTreeNode *node); bool areRelated(FatTreeNode *parent, FatTreeNode *child); + bool isInSubTree(FatTreeNode *root, FatTreeNode *node); }; #endif