From 84c998f37a79bac94865047e272a49baa48985de Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Thu, 11 Feb 2016 12:56:44 +0100 Subject: [PATCH 1/1] Inline another function about the parsing of clusters --- src/surf/sg_platf.cpp | 266 +++++++++++++++++++++++++++++++++++++- src/surf/surf_private.h | 2 - src/surf/surf_routing.cpp | 257 ------------------------------------ 3 files changed, 262 insertions(+), 263 deletions(-) diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index 0c7df96202..b324147864 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -11,14 +11,19 @@ #include "xbt/RngStream.h" #include #include "simgrid/platf_interface.h" -#include "surf/surf_routing.h" #include "surf/surf.h" #include "src/simix/smx_private.h" #include "src/surf/platform.hpp" -#include "cpu_interface.hpp" -#include "host_interface.hpp" +#include "src/surf/platform.hpp" +#include "src/surf/cpu_interface.hpp" +#include "src/surf/host_interface.hpp" +#include "src/surf/network_interface.hpp" +#include "surf/surf_routing.h" // FIXME: brain dead public header +#include "src/surf/surf_routing_cluster.hpp" +#include "src/surf/surf_routing_cluster_torus.hpp" +#include "src/surf/surf_routing_cluster_fat_tree.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_parse); @@ -156,7 +161,260 @@ void sg_platf_new_link(sg_platf_link_cbarg_t link){ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) { - routing_new_cluster(cluster); + using simgrid::surf::AsCluster; + using simgrid::surf::AsClusterTorus; + using simgrid::surf::AsClusterFatTree; + + char *host_id, *groups, *link_id = NULL; + xbt_dict_t patterns = NULL; + int rankId=0; + + s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER; + s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER; + + unsigned int iter; + int start, end, i; + xbt_dynar_t radical_elements; + xbt_dynar_t radical_ends; + + if ((cluster->availability_trace && strcmp(cluster->availability_trace, "")) + || (cluster->state_trace && strcmp(cluster->state_trace, ""))) { + patterns = xbt_dict_new_homogeneous(xbt_free_f); + xbt_dict_set(patterns, "id", xbt_strdup(cluster->id), NULL); + xbt_dict_set(patterns, "prefix", xbt_strdup(cluster->prefix), NULL); + xbt_dict_set(patterns, "suffix", xbt_strdup(cluster->suffix), NULL); + } + + /* Parse the topology attributes. + * Nothing to do in a vanilla cluster, but that's another story for torus and flat_trees */ + s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER; + AS.id = cluster->id; + + switch (cluster->topology) { + case SURF_CLUSTER_TORUS: + XBT_DEBUG("", cluster->id); + AS.routing = A_surfxml_AS_routing_Cluster___torus; + break; + case SURF_CLUSTER_FAT_TREE: + XBT_DEBUG("", cluster->id); + AS.routing = A_surfxml_AS_routing_Cluster___fat___tree; + break; + default: + XBT_DEBUG("", cluster->id); + AS.routing = A_surfxml_AS_routing_Cluster; + break; + } + + // What an inventive way of initializing the AS that I have as ancestor :-( + sg_platf_new_AS_begin(&AS); + simgrid::surf::As *current_routing = routing_get_current(); + static_cast(current_routing)->parse_specific_arguments(cluster); + + if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){ + ((AsCluster*)current_routing)->p_nb_links_per_node++; + ((AsCluster*)current_routing)->p_has_loopback=1; + } + + if(cluster->limiter_link!=0){ + ((AsCluster*)current_routing)->p_nb_links_per_node++; + ((AsCluster*)current_routing)->p_has_limiter=1; + } + + + current_routing->p_linkUpDownList + = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL); + + //Make all hosts + radical_elements = xbt_str_split(cluster->radical, ","); + xbt_dynar_foreach(radical_elements, iter, groups) { + + radical_ends = xbt_str_split(groups, "-"); + start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); + + switch (xbt_dynar_length(radical_ends)) { + case 1: + end = start; + break; + case 2: + end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *)); + break; + default: + surf_parse_error("Malformed radical"); + break; + } + for (i = start; i <= end; i++) { + host_id = + bprintf("%s%d%s", cluster->prefix, i, cluster->suffix); + link_id = bprintf("%s_link_%d", cluster->id, i); + + XBT_DEBUG("", host_id, cluster->speed); + + 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); + } + } + 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); + XBT_DEBUG("\tavailability_file=\"%s\"", avail_file); + host.speed_trace = tmgr_trace_new_from_file(avail_file); + xbt_free(avail_file); + } else { + XBT_DEBUG("\tavailability_file=\"\""); + } + + if (cluster->state_trace && strcmp(cluster->state_trace, "")) { + char *avail_file = xbt_str_varsubst(cluster->state_trace, patterns); + XBT_DEBUG("\tstate_file=\"%s\"", avail_file); + host.state_trace = tmgr_trace_new_from_file(avail_file); + xbt_free(avail_file); + } else { + XBT_DEBUG("\tstate_file=\"\""); + } + + host.speed_peak = xbt_dynar_new(sizeof(double), NULL); + xbt_dynar_push(host.speed_peak,&cluster->speed); + host.pstate = 0; + + //host.power_peak = cluster->power; + host.speed_scale = 1.0; + host.core_amount = cluster->core_amount; + host.initiallyOn = 1; + host.coord = ""; + sg_platf_new_host(&host); + xbt_dynar_free(&host.speed_peak); + XBT_DEBUG(""); + + XBT_DEBUG("", link_id, + cluster->bw, cluster->lat); + + + s_surf_parsing_link_up_down_t info_lim, info_loop; + // All links are saved in a matrix; + // every row describes a single node; every node + // may have multiple links. + // the first column may store a link from x to x if p_has_loopback is set + // the second column may store a limiter link if p_has_limiter is set + // other columns are to store one or more link for the node + + //add a loopback link + if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){ + char *tmp_link = bprintf("%s_loopback", link_id); + XBT_DEBUG("", tmp_link, + cluster->limiter_link); + + + memset(&link, 0, sizeof(link)); + link.id = tmp_link; + link.bandwidth = cluster->loopback_bw; + link.latency = cluster->loopback_lat; + link.initiallyOn = 1; + link.policy = SURF_LINK_FATPIPE; + sg_platf_new_link(&link); + info_loop.link_up = Link::byName(tmp_link); + info_loop.link_down = info_loop.link_up; + free(tmp_link); + xbt_dynar_set(current_routing->p_linkUpDownList, + rankId*(static_cast(current_routing))->p_nb_links_per_node, &info_loop); + } + + //add a limiter link (shared link to account for maximal bandwidth of the node) + if(cluster->limiter_link!=0){ + char *tmp_link = bprintf("%s_limiter", link_id); + XBT_DEBUG("", tmp_link, + cluster->limiter_link); + + + memset(&link, 0, sizeof(link)); + link.id = tmp_link; + link.bandwidth = cluster->limiter_link; + link.latency = 0; + link.initiallyOn = 1; + link.policy = SURF_LINK_SHARED; + sg_platf_new_link(&link); + info_lim.link_up = Link::byName(tmp_link); + info_lim.link_down = info_lim.link_up; + free(tmp_link); + auto as_cluster = static_cast(current_routing); + xbt_dynar_set(current_routing->p_linkUpDownList, + rankId*(as_cluster)->p_nb_links_per_node + as_cluster->p_has_loopback , + &info_lim); + + } + + + //call the cluster function that adds the others links + if (cluster->topology == SURF_CLUSTER_FAT_TREE) { + ((AsClusterFatTree*) current_routing)->addProcessingNode(i); + } + else { + static_cast(current_routing)->create_links_for_node(cluster, i, rankId, rankId* + static_cast(current_routing)->p_nb_links_per_node + + static_cast(current_routing)->p_has_loopback + + static_cast(current_routing)->p_has_limiter ); + } + xbt_free(link_id); + xbt_free(host_id); + rankId++; + } + + xbt_dynar_free(&radical_ends); + } + 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) { + static_cast(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(" "); + XBT_DEBUG("", cluster->router_id); + char *newid = NULL; + s_sg_platf_router_cbarg_t router = SG_PLATF_ROUTER_INITIALIZER; + memset(&router, 0, sizeof(router)); + router.id = cluster->router_id; + router.coord = ""; + if (!router.id || !strcmp(router.id, "")) + router.id = newid = + bprintf("%s%s_router%s", cluster->prefix, cluster->id, + cluster->suffix); + sg_platf_new_router(&router); + ((AsCluster*)current_routing)->p_router = (simgrid::surf::NetCard*) xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL); + free(newid); + + //Make the backbone + if ((cluster->bb_bw != 0) || (cluster->bb_lat != 0)) { + char *link_backbone = bprintf("%s_backbone", cluster->id); + XBT_DEBUG("", link_backbone, + cluster->bb_bw, cluster->bb_lat); + + memset(&link, 0, sizeof(link)); + link.id = link_backbone; + link.bandwidth = cluster->bb_bw; + link.latency = cluster->bb_lat; + link.initiallyOn = 1; + link.policy = cluster->bb_sharing_policy; + + sg_platf_new_link(&link); + + routing_cluster_add_backbone(Link::byName(link_backbone)); + + free(link_backbone); + } + + XBT_DEBUG(""); + sg_platf_new_AS_end(); + XBT_DEBUG(" "); + xbt_dict_free(&patterns); // no op if it were never set + simgrid::surf::on_cluster(cluster); } diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index e2ecdcbd9e..ceb1aa9294 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -72,8 +72,6 @@ XBT_PUBLIC(void) routing_model_create(void *loopback); XBT_PUBLIC(void) routing_exit(void); XBT_PUBLIC(void) storage_register_callbacks(void); -XBT_PRIVATE void routing_new_cluster(sg_platf_cluster_cbarg_t cluster); - XBT_PUBLIC(void) routing_register_callbacks(void); XBT_PUBLIC(void) generic_free_route(sg_platf_route_cbarg_t route); // FIXME rename to routing_route_free // FIXME: make previous function private to routing again? diff --git a/src/surf/surf_routing.cpp b/src/surf/surf_routing.cpp index b196348bc7..4e5b860411 100644 --- a/src/surf/surf_routing.cpp +++ b/src/surf/surf_routing.cpp @@ -7,8 +7,6 @@ #include "surf_routing.hpp" #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" @@ -647,261 +645,6 @@ void sg_platf_new_cabinet(sg_platf_cabinet_cbarg_t cabinet) xbt_dynar_free(&radical_elements); } -void routing_new_cluster(sg_platf_cluster_cbarg_t cluster) -{ - using simgrid::surf::AsCluster; - using simgrid::surf::AsClusterTorus; - using simgrid::surf::AsClusterFatTree; - - char *host_id, *groups, *link_id = NULL; - xbt_dict_t patterns = NULL; - int rankId=0; - - s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER; - s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER; - - unsigned int iter; - int start, end, i; - xbt_dynar_t radical_elements; - xbt_dynar_t radical_ends; - - if ((cluster->availability_trace && strcmp(cluster->availability_trace, "")) - || (cluster->state_trace && strcmp(cluster->state_trace, ""))) { - patterns = xbt_dict_new_homogeneous(xbt_free_f); - xbt_dict_set(patterns, "id", xbt_strdup(cluster->id), NULL); - xbt_dict_set(patterns, "prefix", xbt_strdup(cluster->prefix), NULL); - xbt_dict_set(patterns, "suffix", xbt_strdup(cluster->suffix), NULL); - } - - /* Parse the topology attributes. - * Nothing to do in a vanilla cluster, but that's another story for torus and flat_trees */ - s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER; - AS.id = cluster->id; - - switch (cluster->topology) { - case SURF_CLUSTER_TORUS: - XBT_DEBUG("", cluster->id); - AS.routing = A_surfxml_AS_routing_Cluster___torus; - break; - case SURF_CLUSTER_FAT_TREE: - XBT_DEBUG("", cluster->id); - AS.routing = A_surfxml_AS_routing_Cluster___fat___tree; - break; - default: - XBT_DEBUG("", cluster->id); - AS.routing = A_surfxml_AS_routing_Cluster; - break; - } - - sg_platf_new_AS_begin(&AS); - static_cast(current_routing)->parse_specific_arguments(cluster); - - if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){ - ((AsCluster*)current_routing)->p_nb_links_per_node++; - ((AsCluster*)current_routing)->p_has_loopback=1; - } - - if(cluster->limiter_link!=0){ - ((AsCluster*)current_routing)->p_nb_links_per_node++; - ((AsCluster*)current_routing)->p_has_limiter=1; - } - - - current_routing->p_linkUpDownList - = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL); - - //Make all hosts - radical_elements = xbt_str_split(cluster->radical, ","); - xbt_dynar_foreach(radical_elements, iter, groups) { - - radical_ends = xbt_str_split(groups, "-"); - start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); - - switch (xbt_dynar_length(radical_ends)) { - case 1: - end = start; - break; - case 2: - end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *)); - break; - default: - surf_parse_error("Malformed radical"); - break; - } - for (i = start; i <= end; i++) { - host_id = - bprintf("%s%d%s", cluster->prefix, i, cluster->suffix); - link_id = bprintf("%s_link_%d", cluster->id, i); - - XBT_DEBUG("", host_id, cluster->speed); - - 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); - } - } - 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); - XBT_DEBUG("\tavailability_file=\"%s\"", avail_file); - host.speed_trace = tmgr_trace_new_from_file(avail_file); - xbt_free(avail_file); - } else { - XBT_DEBUG("\tavailability_file=\"\""); - } - - if (cluster->state_trace && strcmp(cluster->state_trace, "")) { - char *avail_file = xbt_str_varsubst(cluster->state_trace, patterns); - XBT_DEBUG("\tstate_file=\"%s\"", avail_file); - host.state_trace = tmgr_trace_new_from_file(avail_file); - xbt_free(avail_file); - } else { - XBT_DEBUG("\tstate_file=\"\""); - } - - host.speed_peak = xbt_dynar_new(sizeof(double), NULL); - xbt_dynar_push(host.speed_peak,&cluster->speed); - host.pstate = 0; - - //host.power_peak = cluster->power; - host.speed_scale = 1.0; - host.core_amount = cluster->core_amount; - host.initiallyOn = 1; - host.coord = ""; - sg_platf_new_host(&host); - xbt_dynar_free(&host.speed_peak); - XBT_DEBUG(""); - - XBT_DEBUG("", link_id, - cluster->bw, cluster->lat); - - - s_surf_parsing_link_up_down_t info_lim, info_loop; - // All links are saved in a matrix; - // every row describes a single node; every node - // may have multiple links. - // the first column may store a link from x to x if p_has_loopback is set - // the second column may store a limiter link if p_has_limiter is set - // other columns are to store one or more link for the node - - //add a loopback link - if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){ - char *tmp_link = bprintf("%s_loopback", link_id); - XBT_DEBUG("", tmp_link, - cluster->limiter_link); - - - memset(&link, 0, sizeof(link)); - link.id = tmp_link; - link.bandwidth = cluster->loopback_bw; - link.latency = cluster->loopback_lat; - link.initiallyOn = 1; - link.policy = SURF_LINK_FATPIPE; - sg_platf_new_link(&link); - info_loop.link_up = Link::byName(tmp_link); - info_loop.link_down = info_loop.link_up; - free(tmp_link); - xbt_dynar_set(current_routing->p_linkUpDownList, - rankId*(static_cast(current_routing))->p_nb_links_per_node, &info_loop); - } - - //add a limiter link (shared link to account for maximal bandwidth of the node) - if(cluster->limiter_link!=0){ - char *tmp_link = bprintf("%s_limiter", link_id); - XBT_DEBUG("", tmp_link, - cluster->limiter_link); - - - memset(&link, 0, sizeof(link)); - link.id = tmp_link; - link.bandwidth = cluster->limiter_link; - link.latency = 0; - link.initiallyOn = 1; - link.policy = SURF_LINK_SHARED; - sg_platf_new_link(&link); - info_lim.link_up = Link::byName(tmp_link); - info_lim.link_down = info_lim.link_up; - free(tmp_link); - auto as_cluster = static_cast(current_routing); - xbt_dynar_set(current_routing->p_linkUpDownList, - rankId*(as_cluster)->p_nb_links_per_node + as_cluster->p_has_loopback , - &info_lim); - - } - - - //call the cluster function that adds the others links - if (cluster->topology == SURF_CLUSTER_FAT_TREE) { - ((AsClusterFatTree*) current_routing)->addProcessingNode(i); - } - else { - static_cast(current_routing)->create_links_for_node(cluster, i, rankId, rankId* - static_cast(current_routing)->p_nb_links_per_node - + static_cast(current_routing)->p_has_loopback - + static_cast(current_routing)->p_has_limiter ); - } - xbt_free(link_id); - xbt_free(host_id); - rankId++; - } - - xbt_dynar_free(&radical_ends); - } - 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) { - static_cast(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(" "); - XBT_DEBUG("", cluster->router_id); - char *newid = NULL; - s_sg_platf_router_cbarg_t router = SG_PLATF_ROUTER_INITIALIZER; - memset(&router, 0, sizeof(router)); - router.id = cluster->router_id; - router.coord = ""; - if (!router.id || !strcmp(router.id, "")) - router.id = newid = - bprintf("%s%s_router%s", cluster->prefix, cluster->id, - cluster->suffix); - sg_platf_new_router(&router); - ((AsCluster*)current_routing)->p_router = (simgrid::surf::NetCard*) xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL); - free(newid); - - //Make the backbone - if ((cluster->bb_bw != 0) || (cluster->bb_lat != 0)) { - char *link_backbone = bprintf("%s_backbone", cluster->id); - XBT_DEBUG("", link_backbone, - cluster->bb_bw, cluster->bb_lat); - - memset(&link, 0, sizeof(link)); - link.id = link_backbone; - link.bandwidth = cluster->bb_bw; - link.latency = cluster->bb_lat; - link.initiallyOn = 1; - link.policy = cluster->bb_sharing_policy; - - sg_platf_new_link(&link); - - routing_cluster_add_backbone(Link::byName(link_backbone)); - - free(link_backbone); - } - - XBT_DEBUG(""); - sg_platf_new_AS_end(); - XBT_DEBUG(" "); - xbt_dict_free(&patterns); // no op if it were never set -} - static void routing_parse_postparse(void) { xbt_dict_free(&random_value); } -- 2.20.1