X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f2df13795e01302813a6aef10825ec7e922ce530..5b4186afc59b21b326fbe3128e4c39b487dd2c36:/src/surf/surf_routing.cpp diff --git a/src/surf/surf_routing.cpp b/src/surf/surf_routing.cpp index f62f852947..32e238a19f 100644 --- a/src/surf/surf_routing.cpp +++ b/src/surf/surf_routing.cpp @@ -8,7 +8,7 @@ #include "surf_routing_private.hpp" #include "surf_routing_cluster.hpp" #include "surf_routing_cluster_torus.hpp" - +#include "surf_routing_cluster_fat_tree.hpp" #include "simgrid/platf_interface.h" // platform creation API internal interface #include "simgrid/sg_config.h" @@ -43,7 +43,6 @@ int NS3_HOST_LEVEL; //host node for ns3 xbt_lib_t link_lib; int SD_LINK_LEVEL; //Simdag level int SURF_LINK_LEVEL; //Surf level -int NS3_LINK_LEVEL; //link for ns3 xbt_lib_t as_router_lib; int ROUTING_ASR_LEVEL; //Routing level @@ -89,7 +88,7 @@ typedef enum { SURF_MODEL_VIVALDI, SURF_MODEL_CLUSTER, SURF_MODEL_TORUS_CLUSTER, - + SURF_MODEL_FAT_TREE_CLUSTER, } e_routing_types; struct s_model_type routing_models[] = { @@ -111,8 +110,10 @@ struct s_model_type routing_models[] = { model_vivaldi_create, NULL}, {"Cluster", "Cluster routing", model_cluster_create, NULL}, - {"Torus_Cluster", "Torus Cluster routing", - model_torus_cluster_create, NULL}, + {"Torus_Cluster", "Torus Cluster routing", + model_torus_cluster_create, NULL}, + {"Fat_Tree_Cluster", "Fat Tree Cluster routing", + model_fat_tree_cluster_create, NULL}, {NULL, NULL, NULL, NULL} }; @@ -356,14 +357,15 @@ void routing_AS_begin(sg_platf_AS_cbarg_t AS) /* search the routing model */ switch(AS->routing){ - case A_surfxml_AS_routing_Cluster: model = &routing_models[SURF_MODEL_CLUSTER];break; - case A_surfxml_AS_routing_Cluster___torus: model = &routing_models[SURF_MODEL_TORUS_CLUSTER];break; - case A_surfxml_AS_routing_Dijkstra: model = &routing_models[SURF_MODEL_DIJKSTRA];break; - case A_surfxml_AS_routing_DijkstraCache: model = &routing_models[SURF_MODEL_DIJKSTRACACHE];break; - case A_surfxml_AS_routing_Floyd: model = &routing_models[SURF_MODEL_FLOYD];break; - case A_surfxml_AS_routing_Full: model = &routing_models[SURF_MODEL_FULL];break; - case A_surfxml_AS_routing_None: model = &routing_models[SURF_MODEL_NONE];break; - case A_surfxml_AS_routing_Vivaldi: model = &routing_models[SURF_MODEL_VIVALDI];break; + case A_surfxml_AS_routing_Cluster: model = &routing_models[SURF_MODEL_CLUSTER];break; + case A_surfxml_AS_routing_Cluster___torus: model = &routing_models[SURF_MODEL_TORUS_CLUSTER];break; + case A_surfxml_AS_routing_Cluster___fat___tree: model = &routing_models[SURF_MODEL_FAT_TREE_CLUSTER];break; + case A_surfxml_AS_routing_Dijkstra: model = &routing_models[SURF_MODEL_DIJKSTRA];break; + case A_surfxml_AS_routing_DijkstraCache: model = &routing_models[SURF_MODEL_DIJKSTRACACHE];break; + case A_surfxml_AS_routing_Floyd: model = &routing_models[SURF_MODEL_FLOYD];break; + case A_surfxml_AS_routing_Full: model = &routing_models[SURF_MODEL_FULL];break; + case A_surfxml_AS_routing_None: model = &routing_models[SURF_MODEL_NONE];break; + case A_surfxml_AS_routing_Vivaldi: model = &routing_models[SURF_MODEL_VIVALDI];break; default: xbt_die("Not a valid model!!!"); break; } @@ -401,7 +403,7 @@ void routing_AS_begin(sg_platf_AS_cbarg_t AS) /* add to the father element list */ info->setId(current_routing->parseAS(info)); } else { - THROWF(arg_error, 0, "All defined components must be belong to a AS"); + THROWF(arg_error, 0, "All defined components must belong to a AS"); } xbt_lib_set(as_router_lib, info->getName(), ROUTING_ASR_LEVEL, @@ -631,7 +633,7 @@ xbt_dynar_t RoutingPlatf::getOneLinkRoutes(){ xbt_dynar_t RoutingPlatf::recursiveGetOneLinkRoutes(AsPtr rc) { - xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free); + xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free_f); //adding my one link routes xbt_dynar_t onelink_mine = rc->getOneLinkRoutes(); @@ -836,7 +838,15 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) AS.routing = A_surfxml_AS_routing_Cluster___torus; sg_platf_new_AS_begin(&AS); ((AsClusterTorusPtr)current_routing)->parse_specific_arguments(cluster); - }else{ + } + else if (cluster->topology == SURF_CLUSTER_FAT_TREE) { + XBT_DEBUG("", cluster->id); + AS.routing = A_surfxml_AS_routing_Cluster___fat___tree; + sg_platf_new_AS_begin(&AS); + ((AsClusterFatTree*)current_routing)->parse_specific_arguments(cluster); + } + + else{ XBT_DEBUG("", cluster->id); AS.routing = A_surfxml_AS_routing_Cluster; sg_platf_new_AS_begin(&AS); @@ -884,6 +894,17 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) memset(&host, 0, sizeof(host)); host.id = host_id; + if ((cluster->properties != NULL) && (!xbt_dict_is_empty(cluster->properties))) { + xbt_dict_cursor_t cursor=NULL; + char *key,*data; + host.properties = xbt_dict_new(); + + xbt_dict_foreach(cluster->properties,cursor,key,data) { + xbt_dict_set(host.properties, key, xbt_strdup(data),free); + } + } else { + XBT_INFO("Null properties for %s: %p",host_id,cluster->properties); + } if (cluster->availability_trace && strcmp(cluster->availability_trace, "")) { xbt_dict_set(patterns, "radical", bprintf("%d", i), NULL); char *avail_file = xbt_str_varsubst(cluster->availability_trace, patterns); @@ -975,12 +996,15 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) //call the cluster function that adds the others links - + if (cluster->topology == SURF_CLUSTER_FAT_TREE) { + ((AsClusterFatTree*) current_routing)->addProcessingNode(i); + } + else { ((AsClusterPtr)current_routing)->create_links_for_node(cluster, i, rankId, rankId* ((AsClusterPtr)current_routing)->p_nb_links_per_node + ((AsClusterPtr)current_routing)->p_has_loopback + ((AsClusterPtr)current_routing)->p_has_limiter ); - + } xbt_free(link_id); xbt_free(host_id); rankId++; @@ -990,6 +1014,10 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) } xbt_dynar_free(&radical_elements); + // For fat trees, the links must be created once all nodes have been added + if(cluster->topology == SURF_CLUSTER_FAT_TREE) { + ((AsClusterFatTree*)current_routing)->create_links(); + } // Add a router. It is magically used thanks to the way in which surf_routing_cluster is written, // and it's very useful to connect clusters together XBT_DEBUG(" "); @@ -1252,7 +1280,7 @@ static void check_disk_attachment() StoragePtr storage = static_cast(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL)); host_elm = sg_routing_edge_by_name_or_null(storage->p_attach); if(!host_elm) - surf_parse_error("Enable to attach storage %s: host %s doesn't exist.", storage->getName(), storage->p_attach); + surf_parse_error("Unable to attach storage %s: host %s doesn't exist.", storage->getName(), storage->p_attach); } } } @@ -1325,6 +1353,32 @@ const char *surf_AS_get_name(AsPtr as) { return as->p_name; } +static AsPtr surf_AS_recursive_get_by_name(AsPtr current, const char * name) { + xbt_dict_cursor_t cursor = NULL; + char *key; + AS_t elem; + AsPtr tmp = NULL; + + if(!strcmp(current->p_name, name)) + return current; + + xbt_dict_foreach(current->p_routingSons, cursor, key, elem) { + tmp = surf_AS_recursive_get_by_name(elem, name); + if(tmp != NULL ) { + break; + } + } + return tmp; +} + + +AsPtr surf_AS_get_by_name(const char * name) { + AsPtr as = surf_AS_recursive_get_by_name(routing_platf->p_root, name); + if(as == NULL) + XBT_WARN("Impossible to find an AS with name %s, please check your input", name); + return as; +} + xbt_dict_t surf_AS_get_routing_sons(AsPtr as) { return as->p_routingSons; }