1 /* Copyright (c) 2014-2016. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #ifndef SURF_ROUTING_CLUSTER_DRAGONFLY_HPP_
7 #define SURF_ROUTING_CLUSTER_DRAGONFLY_HPP_
9 #include "src/kernel/routing/AsCluster.hpp"
16 class XBT_PRIVATE DragonflyRouter {
19 unsigned int chassis_;
21 surf::Link** blueLinks_=nullptr;
22 surf::Link** blackLinks_=nullptr;
23 surf::Link** greenLinks_=nullptr;
24 surf::Link** myNodes_=nullptr;
25 DragonflyRouter(int i, int j, int k);
31 * \class AsClusterDragonfly
33 * \brief Dragonfly representation and routing.
35 * Generate dragonfly according to the topology asked for, according to:
36 * Cray Cascade: a Scalable HPC System based on a Dragonfly Network
37 * Greg Faanes, Abdulla Bataineh, Duncan Roweth, Tom Court, Edwin Froese,
38 * Bob Alverson, Tim Johnson, Joe Kopnick, Mike Higgins and James Reinhard
39 * Cray Inc, Chippewa Falls, Wisconsin, USA
40 * or http://www.cray.com/sites/default/files/resources/CrayXCNetwork.pdf
42 * We use the same denomination for the different levels, with a Green,
43 * Black and Blue color scheme for the three different levels.
45 * Description of the topology has to be given with a string of type :
48 * Last part : "2" : 2 nodes per blade
49 * Third part : "5,1" : five blades/routers per chassis, with one link between each (green network)
50 * Second part : "4,3" = four chassis per group, with three links between each nth router of each chassis (black network)
51 * First part : "3,4" = three electrical groups, linked in an alltoall
52 * pattern by 4 links each (blue network)
54 * LIMITATIONS (for now):
55 * - Routing is only static and uses minimal routes.
56 * - When n links are used between two routers/groups, we consider only one link with n times the bandwidth (needs to be validated on a real system)
57 * - All links have the same characteristics for now
58 * - Blue links are all attached to routers in the chassis n°0. This limits
59 * the number of groups possible to the number of blades in a chassis. This
60 * is also not realistic, as blue level can use more links than a single
61 * Aries can handle, thus it should use several routers.
63 class XBT_PRIVATE AsClusterDragonfly
66 explicit AsClusterDragonfly(As* father, const char* name);
67 ~AsClusterDragonfly() override;
68 // void create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position) override;
69 void getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t into, double* latency) override;
70 void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) override;
72 void generateRouters();
74 void createLink(char* id, int numlinks, Link** linkup, Link** linkdown);
75 unsigned int * rankId_to_coords(int rankId);
77 sg_platf_cluster_cbarg_t cluster_;
78 unsigned int numNodesPerBlade_ = 0;
79 unsigned int numBladesPerChassis_ = 0;
80 unsigned int numChassisPerGroup_ = 0;
81 unsigned int numGroups_ = 0;
82 unsigned int numLinksGreen_ = 0;
83 unsigned int numLinksBlack_ = 0;
84 unsigned int numLinksBlue_ = 0;
85 unsigned int numLinksperLink_ = 1; //fullduplex -> 2, only for local link
86 DragonflyRouter** routers_=nullptr;