X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/31717acca9960c34597be9aae60d9ddf076c7f9c..84c998f37a79bac94865047e272a49baa48985de:/src/surf/sg_platf.cpp 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); }