From df0464c2ffa61d7fab01a54732b01368886013aa Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 11 Dec 2016 14:13:49 +0100 Subject: [PATCH] greatly simplify the way peers are created in Vivaldi AS We used to create a mini cluster for each added peer, which is useless since they are already in a Vivaldi AS. So instead, add the link up&down to the Vivaldi containing AS. This way, we can hide again the netcard of the AsImpl, that was made public only a few commits ago. --- .../java/app/tokenring/app_tokenring.tesh | 8 +- .../msg/app-token-ring/app-token-ring.tesh | 8 +- src/kernel/routing/AsImpl.hpp | 1 - src/kernel/routing/AsVivaldi.cpp | 21 ++++- src/kernel/routing/AsVivaldi.hpp | 1 + src/surf/sg_platf.cpp | 77 ++++--------------- 6 files changed, 41 insertions(+), 75 deletions(-) diff --git a/examples/java/app/tokenring/app_tokenring.tesh b/examples/java/app/tokenring/app_tokenring.tesh index 930d76d809..b18b64c74e 100644 --- a/examples/java/app/tokenring/app_tokenring.tesh +++ b/examples/java/app/tokenring/app_tokenring.tesh @@ -21,10 +21,10 @@ $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/r $ java -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../platforms/two_peers.xml '--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n' > [ 0.000000] (0:maestro@) Using regular java threads. > [ 0.000000] (0:maestro@) Number of hosts '2' -> [ 0.000000] (1:0@peer_100030591) Host '0' send 'Token' to Host '1' -> [ 0.637910] (2:1@peer_100036570) Host '1' received 'Token' -> [ 0.637910] (2:1@peer_100036570) Host '1' send 'Token' to Host '0' -> [ 1.275820] (1:0@peer_100030591) Host '0' received 'Token' +> [ 0.000000] (1:0@100030591) Host '0' send 'Token' to Host '1' +> [ 0.637910] (2:1@100036570) Host '1' received 'Token' +> [ 0.637910] (2:1@100036570) Host '1' send 'Token' to Host '0' +> [ 1.275820] (1:0@100030591) Host '0' received 'Token' > [ 1.275820] (0:maestro@) MSG_main finished; Cleaning up the simulation... > [ 1.275820] (0:maestro@) Simulation time 1.2758201322136908 diff --git a/examples/msg/app-token-ring/app-token-ring.tesh b/examples/msg/app-token-ring/app-token-ring.tesh index c21fa9184b..936a327583 100644 --- a/examples/msg/app-token-ring/app-token-ring.tesh +++ b/examples/msg/app-token-ring/app-token-ring.tesh @@ -18,10 +18,10 @@ $ $SG_TEST_EXENV ${bindir:=.}/app-token-ring ${srcdir:=.}/routing_cluster.xml "- $ $SG_TEST_EXENV ${bindir:=.}/app-token-ring ${srcdir:=.}/two_peers.xml "--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:maestro@) Number of hosts '2' -> [ 0.000000] (1:0@peer_100030591) Host "0" send 'Token' to Host "1" -> [ 0.637910] (2:1@peer_100036570) Host "1" received "Token" -> [ 0.637910] (2:1@peer_100036570) Host "1" send 'Token' to Host "0" -> [ 1.275820] (1:0@peer_100030591) Host "0" received "Token" +> [ 0.000000] (1:0@100030591) Host "0" send 'Token' to Host "1" +> [ 0.637910] (2:1@100036570) Host "1" received "Token" +> [ 0.637910] (2:1@100036570) Host "1" send 'Token' to Host "0" +> [ 1.275820] (1:0@100030591) Host "0" received "Token" > [ 1.275820] (0:maestro@) Simulation time 1.27582 $ $SG_TEST_EXENV ${bindir:=.}/app-token-ring ${srcdir:=.}/meta_cluster.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" diff --git a/src/kernel/routing/AsImpl.hpp b/src/kernel/routing/AsImpl.hpp index 5e48d080c2..2ff562085e 100644 --- a/src/kernel/routing/AsImpl.hpp +++ b/src/kernel/routing/AsImpl.hpp @@ -97,7 +97,6 @@ public: private: std::map, BypassRoute*> bypassRoutes_; // src x dst -> route -public: routing::NetCard* netcard_ = nullptr; // Our representative in the father AS }; diff --git a/src/kernel/routing/AsVivaldi.cpp b/src/kernel/routing/AsVivaldi.cpp index f54e508fd3..a7ff1f689a 100644 --- a/src/kernel/routing/AsVivaldi.cpp +++ b/src/kernel/routing/AsVivaldi.cpp @@ -57,6 +57,23 @@ AsVivaldi::AsVivaldi(As* father, const char* name) : AsCluster(father, name) { } +void AsVivaldi::setPeerLink(NetCard* netcard, double bw_in, double bw_out, double latency, const char* coord) +{ + xbt_assert(netcard->containingAS() == this, "Cannot add a peer link to a netcard that is not in this AS"); + + new simgrid::kernel::routing::vivaldi::Coords(netcard, coord); + + s_surf_parsing_link_up_down_t info; + char* link_up = bprintf("link_%s_UP", netcard->cname()); + char* link_down = bprintf("link_%s_DOWN", netcard->cname()); + info.linkUp = surf_network_model->createLink(link_up, bw_out, latency, SURF_LINK_SHARED); + info.linkDown = surf_network_model->createLink(link_down, bw_in, latency, SURF_LINK_SHARED); + privateLinks_.insert({netcard->id(), info}); + + free(link_up); + free(link_down); +} + void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t route, double* lat) { XBT_DEBUG("vivaldi getLocalRoute from '%s'[%d] '%s'[%d]", src->cname(), src->id(), dst->cname(), dst->id()); @@ -71,7 +88,7 @@ void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t } /* Retrieve the private links */ - if (privateLinks_.size() > src->id()) { + if (privateLinks_.find(src->id()) != privateLinks_.end()) { s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id()); if (info.linkUp) { route->link_list->push_back(info.linkUp); @@ -79,7 +96,7 @@ void AsVivaldi::getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t *lat += info.linkUp->latency(); } } - if (privateLinks_.size() > dst->id()) { + if (privateLinks_.find(dst->id()) != privateLinks_.end()) { s_surf_parsing_link_up_down_t info = privateLinks_.at(dst->id()); if (info.linkDown) { route->link_list->push_back(info.linkDown); diff --git a/src/kernel/routing/AsVivaldi.hpp b/src/kernel/routing/AsVivaldi.hpp index 7e702d828b..c348ce0747 100644 --- a/src/kernel/routing/AsVivaldi.hpp +++ b/src/kernel/routing/AsVivaldi.hpp @@ -17,6 +17,7 @@ class XBT_PRIVATE AsVivaldi: public AsCluster { public: explicit AsVivaldi(As* father, const char* name); + void setPeerLink(NetCard* netcard, double bw_in, double bw_out, double lat, const char* coord); void getLocalRoute(NetCard* src, NetCard* dst, sg_platf_route_cbarg_t into, double* latency) override; }; diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index a43f3f5f48..c33ed89a18 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -570,73 +570,22 @@ void sg_platf_new_process(sg_platf_process_cbarg_t process) void sg_platf_new_peer(sg_platf_peer_cbarg_t peer) { - using simgrid::kernel::routing::NetCard; - using simgrid::kernel::routing::AsCluster; - - char *host_id = bprintf("peer_%s", peer->id); - char *router_id = bprintf("router_%s", peer->id); - - XBT_DEBUG(" "); - - XBT_DEBUG("", peer->id); - s_sg_platf_AS_cbarg_t AS; - AS.id = peer->id; - AS.routing = A_surfxml_AS_routing_Cluster; - sg_platf_new_AS_begin(&AS); - new simgrid::kernel::routing::vivaldi::Coords(current_routing->netcard_, peer->coord); - - XBT_DEBUG("", host_id, peer->speed); - s_sg_platf_host_cbarg_t host; - memset(&host, 0, sizeof(host)); - host.id = host_id; - - host.speed_per_pstate.push_back(peer->speed); - host.pstate = 0; - host.speed_trace = peer->availability_trace; - host.state_trace = peer->state_trace; - host.core_amount = 1; - sg_platf_new_host(&host); + using simgrid::kernel::routing::AsVivaldi; - s_sg_platf_link_cbarg_t link; - memset(&link, 0, sizeof(link)); - link.policy = SURF_LINK_SHARED; - link.latency = peer->lat; - - char* link_up = bprintf("link_%s_UP",peer->id); - XBT_DEBUG("", link_up, peer->bw_out, peer->lat); - link.id = link_up; - link.bandwidth = peer->bw_out; - sg_platf_new_link(&link); - - char* link_down = bprintf("link_%s_DOWN",peer->id); - XBT_DEBUG("", link_down, peer->bw_in, peer->lat); - link.id = link_down; - link.bandwidth = peer->bw_in; - sg_platf_new_link(&link); - - XBT_DEBUG("", host_id,link_up,link_down); - s_sg_platf_host_link_cbarg_t host_link; - memset(&host_link, 0, sizeof(host_link)); - host_link.id = host_id; - host_link.link_up = link_up; - host_link.link_down = link_down; - sg_platf_new_hostlink(&host_link); - free(link_up); - free(link_down); - - XBT_DEBUG("", router_id); - s_sg_platf_router_cbarg_t router; - memset(&router, 0, sizeof(router)); - router.id = router_id; - router.coord = peer->coord; - sg_platf_new_router(&router); + AsVivaldi* as = dynamic_cast(current_routing); + xbt_assert(as, " tag can only be used in Vivaldi ASes"); - XBT_DEBUG(""); - sg_platf_new_AS_seal(); - XBT_DEBUG(" "); + std::vector speedPerPstate; + speedPerPstate.push_back(peer->speed); + simgrid::s4u::Host* host = as->createHost(peer->id, &speedPerPstate, 1); + as->setPeerLink(host->pimpl_netcard, peer->bw_in, peer->bw_out, peer->lat, peer->coord); + simgrid::s4u::Host::onCreation(*host); - free(router_id); - free(host_id); + /* Change from the defaults */ + if (peer->state_trace) + host->pimpl_cpu->setStateTrace(peer->state_trace); + if (peer->availability_trace) + host->pimpl_cpu->setSpeedTrace(peer->availability_trace); } void sg_platf_begin() { /* Do nothing: just for symmetry of user code */ } -- 2.20.1