SimGrid
3.13
Versatile Simulation of Distributed Systems
|
Fat tree representation and routing. More...
#include <AsClusterFatTree.hpp>
Public Member Functions | |
AsClusterFatTree (const char *name) | |
~AsClusterFatTree () | |
virtual void | getRouteAndLatency (NetCard *src, NetCard *dst, sg_platf_route_cbarg_t into, double *latency) override |
Probe the routing path between two points. More... | |
void | seal () override |
Generate the fat tree. More... | |
void | parse_specific_arguments (sg_platf_cluster_cbarg_t cluster) override |
Read the parameters in topo_parameters field. More... | |
void | addProcessingNode (int id) |
void | generateDotFile (const std::string &filename="fatTree.dot") const |
![]() | |
AsCluster (const char *name) | |
~AsCluster () | |
void | getGraph (xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges) override |
virtual void | create_links_for_node (sg_platf_cluster_cbarg_t cluster, int id, int rank, int position) |
![]() | |
virtual xbt_dynar_t | getOneLinkRoutes () |
retrieves the list of all routes of size 1 (of type src x dst x Link) More... | |
std::vector< surf::Link * > * | getBypassRoute (surf::NetCard *src, surf::NetCard *dst) |
Additional Inherited Members | |
![]() | |
enum | RoutingMode { RoutingMode::unset = 0, RoutingMode::base, RoutingMode::recursive } |
![]() | |
static void | getRouteRecursive (surf::NetCard *src, surf::NetCard *dst, std::vector< surf::Link * > *links, double *latency) |
Recursive function for getRouteAndLatency. More... | |
![]() | |
xbt_dynar_t | privateLinks_ = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL) |
Link * | backbone_ = nullptr |
void * | loopback_ = nullptr |
NetCard * | router_ = nullptr |
int | has_limiter_ = 0 |
int | has_loopback_ = 0 |
int | nb_links_per_node_ = 1 |
![]() | |
RoutingMode | hierarchy_ = RoutingMode::unset |
surf::NetCard * | netcard_ = nullptr |
![]() | |
AsImpl (const char *name) | |
~AsImpl () | |
Fat tree representation and routing.
Generate fat trees according to the topology asked for. Almost everything is based on the work of Eitan Zahavi in "D-Mod-K Routing Providing Non-Blocking Traffic for Shift Permutations on Real Life Fat Trees" (2010).
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. 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 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 the number of processing nodes required to fit the topology, which is the product of the m_i's.
Routing is made using a destination-mod-k scheme.
simgrid::surf::AsClusterFatTree::AsClusterFatTree | ( | const char * | name | ) |
simgrid::surf::AsClusterFatTree::~AsClusterFatTree | ( | ) |
|
overridevirtual |
Probe the routing path between two points.
The networking model uses this function when creating a communication to retrieve both the list of links that the create communication will use, and the summed latency that these links represent.
The network could recompute the latency by itself from the list, but it would require an additional link set traversal. This operation being on the critical path of SimGrid, the routing computes the latency in behalf of the network.
Things are rather complex here because we have to find the path from ASes to ASes, and within each. In addition, the different ASes may use differing routing models. Some ASes may be routed in full, others may have only some connection information and use a shortest path on top of that, and so on. Some ASes may even not have any predefined links and use only coordinate informations to compute the latency.
So, the path is constructed recursively, with each traversed AS adding its information to the set. The algorithm for that is explained in http://hal.inria.fr/hal-00650233/
src | Initial point of the routing path |
dst | Final point of the routing path |
into | Container into which the traversed links should be pushed |
latency | Accumulator in which the latencies should be added (caller must set it to 0) |
Reimplemented from simgrid::surf::AsCluster.
|
override |
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.
|
overridevirtual |
Read the parameters in topo_parameters field.
It will also store the cluster for future use.
Reimplemented from simgrid::surf::AsCluster.
void simgrid::surf::AsClusterFatTree::addProcessingNode | ( | int | id | ) |
void simgrid::surf::AsClusterFatTree::generateDotFile | ( | const std::string & | filename = "fatTree.dot" | ) | const |