From bbab4619c1dbcfedc93e2d14812a684119c75136 Mon Sep 17 00:00:00 2001 From: Navarrop Date: Mon, 7 Nov 2011 15:35:46 +0100 Subject: [PATCH] Add a source file for model vivaldi. Write vivaldi_get_route. Update vivaldi platforms (examples/platforms/syscoord/ --- buildtools/Cmake/DefinePackages.cmake | 1 + .../syscoord/generate_peer_platform.pl | 3 +- .../platforms/syscoord/median_harvard.xml | 6 -- .../platforms/syscoord/median_meridian.xml | 6 -- examples/platforms/syscoord/median_p2psim.xml | 6 -- src/surf/surf_routing.c | 66 ++----------- src/surf/surf_routing_private.h | 14 +-- src/surf/surf_routing_rulebased.c | 14 --- src/surf/surf_routing_vivaldi.c | 94 +++++++++++++++++++ 9 files changed, 112 insertions(+), 98 deletions(-) create mode 100644 src/surf/surf_routing_vivaldi.c diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index c8043df848..2a63c70a72 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -214,6 +214,7 @@ set(SURF_SRC src/surf/surf_routing_dijkstra.c src/surf/surf_routing_none.c src/surf/surf_routing_cluster.c + src/surf/surf_routing_vivaldi.c src/surf/surf_config.c src/surf/maxmin.c src/surf/fair_bottleneck.c diff --git a/examples/platforms/syscoord/generate_peer_platform.pl b/examples/platforms/syscoord/generate_peer_platform.pl index 91f8ca5004..659ae83988 100755 --- a/examples/platforms/syscoord/generate_peer_platform.pl +++ b/examples/platforms/syscoord/generate_peer_platform.pl @@ -27,9 +27,8 @@ while(defined($line=)) print "\t\tbw_in=\"13380000\" bw_out=\"1024000\" lat=\"5E-4\" />\n\n"; } } -print "\t\t\n\t\t\n"; print "\t\n"; print ""; -print " \n"; \ No newline at end of file +print " \n"; diff --git a/examples/platforms/syscoord/median_harvard.xml b/examples/platforms/syscoord/median_harvard.xml index 26518f70d6..ae8082c59b 100644 --- a/examples/platforms/syscoord/median_harvard.xml +++ b/examples/platforms/syscoord/median_harvard.xml @@ -684,11 +684,5 @@ - - - diff --git a/examples/platforms/syscoord/median_meridian.xml b/examples/platforms/syscoord/median_meridian.xml index 2b15b7394f..1ff1ec2b09 100644 --- a/examples/platforms/syscoord/median_meridian.xml +++ b/examples/platforms/syscoord/median_meridian.xml @@ -7506,11 +7506,5 @@ - - - diff --git a/examples/platforms/syscoord/median_p2psim.xml b/examples/platforms/syscoord/median_p2psim.xml index ae81b76de8..fb945b3ca8 100644 --- a/examples/platforms/syscoord/median_p2psim.xml +++ b/examples/platforms/syscoord/median_p2psim.xml @@ -5226,11 +5226,5 @@ - - - diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index e96b00c5aa..bd20167eba 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -91,60 +91,14 @@ struct s_model_type routing_models[] = { {"Full", {"none", "No routing (usable with Constant network only)", model_none_create, model_none_load, model_none_unload, model_none_end}, {"RuleBased", "Rule-Based routing data (...)", model_rulebased_create, - model_rulebased_load, model_rulebased_unload, model_rulebased_end}, -{"Vivaldi", "Vivaldi routing", model_rulebased_create, - model_rulebased_load, model_rulebased_unload, model_rulebased_end}, + model_none_load, model_none_unload, model_none_end}, +{"Vivaldi", "Vivaldi routing", model_vivaldi_create, + model_none_load, model_none_unload, model_none_end}, {"Cluster", "Cluster routing", model_cluster_create, - model_rulebased_load, model_rulebased_unload, model_rulebased_end}, + model_none_load, model_none_unload, model_none_end}, {NULL, NULL, NULL, NULL, NULL, NULL} }; -static double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) -{ - double src_coord, dst_coord; - - src_coord = atof(xbt_dynar_get_as(src, index, char *)); - dst_coord = atof(xbt_dynar_get_as(dst, index, char *)); - - return (src_coord-dst_coord)*(src_coord-dst_coord); - -} - -static double base_vivaldi_get_latency (const char *src, const char *dst) -{ - double euclidean_dist; - xbt_dynar_t src_ctn, dst_ctn; - src_ctn = xbt_lib_get_or_null(host_lib, src, COORD_HOST_LEVEL); - if(!src_ctn) src_ctn = xbt_lib_get_or_null(as_router_lib, src, COORD_ASR_LEVEL); - dst_ctn = xbt_lib_get_or_null(host_lib, dst, COORD_HOST_LEVEL); - if(!dst_ctn) dst_ctn = xbt_lib_get_or_null(as_router_lib, dst, COORD_ASR_LEVEL); - - if(dst_ctn == NULL || src_ctn == NULL) - xbt_die("Coord src '%s' :%p dst '%s' :%p",src,src_ctn,dst,dst_ctn); - - euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn)) - + fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *))); - - xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist); - - //From .ms to .s - return euclidean_dist / 1000; -} - -static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst, route_extended_t e_route) -{ - if(get_network_element_type(src) == SURF_NETWORK_ELEMENT_AS) { - int need_to_clean = e_route?0:1; - double latency; - e_route = e_route?e_route:(*(rc->get_route)) (rc, src, dst); - latency = base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway); - if(need_to_clean) generic_free_extended_route(e_route); - return latency; - } else { - return base_vivaldi_get_latency(src,dst); - } -} - /** * \brief Add a "host" to the network element list */ @@ -453,10 +407,6 @@ void sg_platf_new_AS_open(const char *AS_id, const char *wanted_routing_type) new_routing->name = xbt_strdup(AS_id); new_routing->routing_sons = xbt_dict_new(); - /* Hack for Vivaldi */ - if(!strcmp(model->name,"Vivaldi")) - new_routing->get_latency = vivaldi_get_link_latency; - if (current_routing == NULL && global_routing->root == NULL) { /* it is the first one */ @@ -1819,10 +1769,10 @@ static void routing_parse_Speer(void) SURFXML_START_TAG(AS); XBT_DEBUG(" "); - host_id = bprintf("peer_%s", struct_peer->V_peer_id); - router_id = bprintf("router_%s", struct_peer->V_peer_id); - link_id_up = bprintf("link_%s_up", struct_peer->V_peer_id); - link_id_down = bprintf("link_%s_down", struct_peer->V_peer_id); + host_id = HOST_PEER(struct_peer->V_peer_id); + router_id = ROUTER_PEER(struct_peer->V_peer_id); + link_id_up = LINK_UP_PEER(struct_peer->V_peer_id); + link_id_down = LINK_DOWN_PEER(struct_peer->V_peer_id); link_router = bprintf("%s_link_router", struct_peer->V_peer_id); link_backbone = bprintf("%s_backbone", struct_peer->V_peer_id); diff --git a/src/surf/surf_routing_private.h b/src/surf/surf_routing_private.h index 322c7471db..5e98558968 100644 --- a/src/surf/surf_routing_private.h +++ b/src/surf/surf_routing_private.h @@ -74,16 +74,18 @@ void model_floyd_set_route(routing_component_t rc, const char *src, /* ************************************************** */ /* ************** RULE-BASED ROUTING **************** */ void *model_rulebased_create(void); /* create structures for rulebased routing model */ -void model_rulebased_load(void); /* load parse functions for rulebased routing model */ -void model_rulebased_unload(void); /* unload parse functions for rulebased routing model */ -void model_rulebased_end(void); /* finalize the creation of rulebased routing model */ /* ************************************************** */ /* ************** Cluster ROUTING **************** */ void *model_cluster_create(void); /* create structures for cluster routing model */ -void model_cluster_load(void); /* load parse functions for cluster routing model */ -void model_cluster_unload(void); /* unload parse functions for cluster routing model */ -void model_cluster_end(void); /* finalize the creation of cluster routing model */ + +/* ************************************************** */ +/* ************** Vivaldi ROUTING **************** */ +void *model_vivaldi_create(void); /* create structures for vivaldi routing model */ +#define HOST_PEER(peername) bprintf("peer_%s", peername) +#define ROUTER_PEER(peername) bprintf("router_%s", peername) +#define LINK_UP_PEER(peername) bprintf("link_%s_up", peername) +#define LINK_DOWN_PEER(peername) bprintf("link_%s_down", peername) /* ************************************************************************** */ /* ********** Dijkstra & Dijkstra Cached ROUTING **************************** */ diff --git a/src/surf/surf_routing_rulebased.c b/src/surf/surf_routing_rulebased.c index 404335d042..03ae1a4d93 100644 --- a/src/surf/surf_routing_rulebased.c +++ b/src/surf/surf_routing_rulebased.c @@ -420,17 +420,3 @@ void *model_rulebased_create(void) &rule_route_extended_free); return new_component; } - -void model_rulebased_load(void) -{ - /* use "surfxml_add_callback" to add a parse function call */ -} - -void model_rulebased_unload(void) -{ - /* use "surfxml_del_callback" to remove a parse function call */ -} - -void model_rulebased_end(void) -{ -} diff --git a/src/surf/surf_routing_vivaldi.c b/src/surf/surf_routing_vivaldi.c new file mode 100644 index 0000000000..d53c81233f --- /dev/null +++ b/src/surf/surf_routing_vivaldi.c @@ -0,0 +1,94 @@ +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "surf_routing_private.h" + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf"); + +/* Routing model structure */ + +typedef struct { + s_routing_component_t generic_routing; + xbt_dict_t dict_processing_units; + xbt_dict_t dict_autonomous_systems; +} s_routing_component_vivaldi_t, *routing_component_vivaldi_t; + +/* Parse routing model functions */ + +static route_extended_t vivaldi_get_route(routing_component_t rc, + const char *src, + const char *dst); + +/* Business methods */ +static route_extended_t vivaldi_get_route(routing_component_t rc, + const char *src, + const char *dst) +{ + xbt_assert(rc && src + && dst, + "Invalid params for \"get_route\" function at AS \"%s\"", + rc->name); + + route_extended_t new_e_route = xbt_new0(s_route_extended_t, 1); + new_e_route->src_gateway = ROUTER_PEER(src); + new_e_route->dst_gateway = ROUTER_PEER(dst); + new_e_route->generic_route.link_list = xbt_dynar_new(0, NULL); + return new_e_route; +} + +static double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) +{ + double src_coord, dst_coord; + + src_coord = atof(xbt_dynar_get_as(src, index, char *)); + dst_coord = atof(xbt_dynar_get_as(dst, index, char *)); + + return (src_coord-dst_coord)*(src_coord-dst_coord); + +} + +static double base_vivaldi_get_latency (const char *src, const char *dst) +{ + double euclidean_dist; + xbt_dynar_t src_ctn, dst_ctn; + src_ctn = xbt_lib_get_or_null(host_lib, src, COORD_HOST_LEVEL); + if(!src_ctn) src_ctn = xbt_lib_get_or_null(as_router_lib, src, COORD_ASR_LEVEL); + dst_ctn = xbt_lib_get_or_null(host_lib, dst, COORD_HOST_LEVEL); + if(!dst_ctn) dst_ctn = xbt_lib_get_or_null(as_router_lib, dst, COORD_ASR_LEVEL); + + if(dst_ctn == NULL || src_ctn == NULL) + xbt_die("Coord src '%s' :%p dst '%s' :%p",src,src_ctn,dst,dst_ctn); + + euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn)) + + fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *))); + + xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist); + + //From .ms to .s + return euclidean_dist / 1000; +} + +static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst, route_extended_t e_route) +{ + if(get_network_element_type(src) == SURF_NETWORK_ELEMENT_AS) { + int need_to_clean = e_route?0:1; + double latency; + e_route = e_route?e_route:(*(rc->get_route)) (rc, src, dst); + latency = base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway); + if(need_to_clean) generic_free_extended_route(e_route); + return latency; + } else { + return base_vivaldi_get_latency(src,dst); + } +} + +/* Creation routing model functions */ +void *model_vivaldi_create(void) +{ + routing_component_vivaldi_t new_component = model_none_create(); + new_component->generic_routing.get_route = vivaldi_get_route; + new_component->generic_routing.get_latency = vivaldi_get_link_latency; + return new_component; +} -- 2.20.1