SimGrid
3.21
Versatile Simulation of Distributed Systems
|
Private implementation of the Networking Zones.
A netzone is a network container, in charge of routing information between elements (hosts and sub-netzones) and to the nearby netzones. In SimGrid, there is a hierarchy of netzones, ie a tree with a unique root NetZone, that you can retrieve with simgrid::s4u::Engine::netRoot().
The purpose of the kernel::routing module is to retrieve the routing path between two points in a time- and space-efficient manner. This is done by NetZoneImpl::getGlobalRoute(), called 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 model could recompute the latency by itself from the list, but it would require an additional traversal of the link set. This operation being on the critical path of SimGrid, the routing computes the latency on the behalf of the network while constructing the link set.
Finding the path between two nodes is rather complex because we navigate a hierarchy of netzones, each of them being a full network. In addition, the routing can declare shortcuts (called bypasses), either within a NetZone at the route level or directly between NetZones. Also, each NetZone can use a differing routing algorithm, depending on its class. FullZone have a full matrix giving explicitly the path between any pair of their contained nodes, while DijkstraZone or FloydZone rely on a shortest path algorithm. VivaldiZone does not even have any link but only use only coordinate information to compute the latency.
So NetZoneImpl::getGlobalRoute builds the path recursively asking its specific information to each traversed NetZone with NetZoneImpl::getLocalRoute, that is redefined in each sub-class. The algorithm for that is explained in http://hal.inria.fr/hal-00650233/ (but for historical reasons, NetZones are called Autonomous Systems in this article).
#include <NetZoneImpl.hpp>
Inherited by simgrid::kernel::routing::ClusterZone, simgrid::kernel::routing::EmptyZone, and simgrid::kernel::routing::RoutedZone.
Public Types | |
enum | RoutingMode { RoutingMode::unset = 0, RoutingMode::base, RoutingMode::recursive } |
Public Member Functions | |
s4u::NetZone * | get_iface () |
simgrid::s4u::Host * | create_host (const char *name, std::vector< double > *speed_per_pstate, int core_count, std::map< std::string, std::string > *props) |
Make an host within that NetZone. More... | |
virtual void | add_bypass_route (NetPoint *src, NetPoint *dst, NetPoint *gw_src, NetPoint *gw_dst, std::vector< resource::LinkImpl *> &link_list, bool symmetrical) |
Creates a new route in this NetZone. More... | |
virtual void | seal () |
Seal your netzone once you're done adding content, and before routing stuff through it. More... | |
virtual int | add_component (kernel::routing::NetPoint *elm) |
virtual void | add_route (kernel::routing::NetPoint *src, kernel::routing::NetPoint *dst, kernel::routing::NetPoint *gw_src, kernel::routing::NetPoint *gw_dst, std::vector< kernel::resource::LinkImpl *> &link_list, bool symmetrical) |
unsigned int | get_table_size () |
std::vector< kernel::routing::NetPoint * > | get_vertices () |
NetZoneImpl * | get_father () |
std::vector< NetZoneImpl * > * | get_children () |
const std::string & | get_name () const |
Retrieves the name of that netzone as a C++ string. More... | |
const char * | get_cname () const |
Retrieves the name of that netzone as a C string. More... | |
std::vector< s4u::Host * > | get_all_hosts () |
int | get_host_count () |
virtual void | get_graph (xbt_graph_t graph, std::map< std::string, xbt_node_t > *nodes, std::map< std::string, xbt_edge_t > *edges)=0 |
Static Public Member Functions | |
static void | get_global_route (routing::NetPoint *src, routing::NetPoint *dst, std::vector< resource::LinkImpl *> &links, double *latency) |
Public Attributes | |
resource::NetworkModel * | network_model_ |
RoutingMode | hierarchy_ = RoutingMode::unset |
Protected Member Functions | |
NetZoneImpl (NetZoneImpl *father, std::string name, resource::NetworkModel *network_model) | |
virtual | ~NetZoneImpl () |
virtual void | get_local_route (NetPoint *src, NetPoint *dst, RouteCreationArgs *into, double *latency)=0 |
Probe the routing path between two points that are local to the called NetZone. More... | |
bool | get_bypass_route (routing::NetPoint *src, routing::NetPoint *dst, std::vector< resource::LinkImpl *> &links, double *latency) |
retrieves the list of all routes of size 1 (of type src x dst x Link) More... | |
|
explicitprotected |
|
protectedvirtual |
|
inline |
simgrid::s4u::Host* simgrid::kernel::routing::NetZoneImpl::create_host | ( | const char * | name, |
std::vector< double > * | speed_per_pstate, | ||
int | core_count, | ||
std::map< std::string, std::string > * | props | ||
) |
Make an host within that NetZone.
|
virtual |
Creates a new route in this NetZone.
|
virtual |
Seal your netzone once you're done adding content, and before routing stuff through it.
Reimplemented in simgrid::kernel::routing::FatTreeZone, simgrid::kernel::routing::DragonflyZone, simgrid::kernel::routing::FloydZone, simgrid::kernel::routing::DijkstraZone, and simgrid::kernel::routing::FullZone.
|
virtual |
|
virtual |
|
protectedpure virtual |
Probe the routing path between two points that are local to the called NetZone.
src | where from |
dst | where to |
into | Container into which the traversed links and gateway informations should be pushed |
latency | Accumulator in which the latencies should be added (caller must set it to 0) |
Implemented in simgrid::kernel::routing::FatTreeZone, simgrid::kernel::routing::ClusterZone, simgrid::kernel::routing::DragonflyZone, simgrid::kernel::routing::VivaldiZone, simgrid::kernel::routing::DijkstraZone, simgrid::kernel::routing::FloydZone, simgrid::kernel::routing::EmptyZone, simgrid::kernel::routing::FullZone, and simgrid::kernel::routing::TorusZone.
|
protected |
retrieves the list of all routes of size 1 (of type src x dst x Link)
|
inline |
|
inline |
NetZoneImpl* simgrid::kernel::routing::NetZoneImpl::get_father | ( | ) |
std::vector<NetZoneImpl*>* simgrid::kernel::routing::NetZoneImpl::get_children | ( | ) |
|
inline |
Retrieves the name of that netzone as a C++ string.
const char* simgrid::kernel::routing::NetZoneImpl::get_cname | ( | ) | const |
Retrieves the name of that netzone as a C string.
std::vector<s4u::Host*> simgrid::kernel::routing::NetZoneImpl::get_all_hosts | ( | ) |
int simgrid::kernel::routing::NetZoneImpl::get_host_count | ( | ) |
|
static |
|
pure virtual |
resource::NetworkModel* simgrid::kernel::routing::NetZoneImpl::network_model_ |
RoutingMode simgrid::kernel::routing::NetZoneImpl::hierarchy_ = RoutingMode::unset |