X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f77cfc70ecec6f8e33fcd80a55ac2c3bb2abac62..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 d45cdbf3a8..c4de13f1a7 100644 --- a/src/surf/surf_routing_cluster_fat_tree.hpp +++ b/src/surf/surf_routing_cluster_fat_tree.hpp @@ -10,33 +10,105 @@ #define SURF_ROUTING_CLUSTER_FAT_TREE_HPP_ +/* The class AsClusterFatTree describes PGFT, as introduced by Eitan Zahavi + * in "D-Mod-K Routing Providing Non-Blocking Traffic for Shift Permutations + * on Real Life Fat Trees" (2010). RLFT are PGFT with some restrictions to + * address real world constraints, which are not currently enforced (but it + * should certainly be checked for) + */ -class FatTreeLink; +/* TODO : limiter link ? Loopback? + * + */ 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; + /* \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; + /* 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); + /* Links are dependant of the chosen network model, but must implement + * NetworkLink + */ + NetworkLink *upLink; + NetworkLink *downLink; + FatTreeNode *upNode; + FatTreeNode *downNode; +}; class AsClusterFatTree : public AsCluster { public: AsClusterFatTree(); - virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency); + ~AsClusterFatTree(); + virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, + sg_platf_route_cbarg_t into, + double *latency); + // virtual void getRouteAndLatency(const int src, const int dst, + // std::vector *route, + // double *latency) const; virtual void create_links(); void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster); + 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; - std::vector upperLevelNodesNumber; - std::vector lowerLevelPortsNumber; + 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 nodes; -}; + std::map computeNodes; + std::vector nodes; + std::vector links; + std::vector nodesByLevel; -class FatTreeLink { -public: -}; -class FatTreeNode { - int id; - std::string name; + 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(FatTreeNode *node); + bool areRelated(FatTreeNode *parent, FatTreeNode *child); + bool isInSubTree(FatTreeNode *root, FatTreeNode *node); }; - #endif