X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/27915da6b357d043681f745c4574699ff0db0146..28200591a8ba30e8b362400419b03bc94205198e:/src/surf/sg_platf.cpp diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index 55010c7bba..9dfdc53525 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -73,8 +73,7 @@ void sg_platf_exit(void) { /** @brief Add an "host" to the current AS */ void sg_platf_new_host(sg_platf_host_cbarg_t host) { - xbt_assert(! sg_host_by_name(host->id), - "Refusing to create a second host named '%s'.", host->id); + xbt_assert(! sg_host_by_name(host->id), "Refusing to create a second host named '%s'.", host->id); simgrid::surf::AsImpl* current_routing = routing_get_current(); if (current_routing->hierarchy_ == simgrid::surf::AsImpl::RoutingMode::unset) @@ -97,8 +96,7 @@ void sg_platf_new_host(sg_platf_host_cbarg_t host) unsigned int cursor; char*str; - if (!COORD_HOST_LEVEL) - xbt_die ("To use host coordinates, please add --cfg=network/coordinates:yes to your command line"); + xbt_assert(COORD_HOST_LEVEL, "To use host coordinates, please add --cfg=network/coordinates:yes to your command line"); /* Pre-parse the host coordinates -- FIXME factorize with routers by overloading the routing->parse_PU function*/ xbt_dynar_t ctn_str = xbt_str_split_str(host->coord, " "); xbt_dynar_t ctn = xbt_dynar_new(sizeof(double),NULL); @@ -112,12 +110,13 @@ void sg_platf_new_host(sg_platf_host_cbarg_t host) XBT_DEBUG("Having set host coordinates for '%s'",host->id); } - simgrid::surf::Cpu *cpu = surf_cpu_model_pm->createCpu( h, - host->speed_peak, - host->speed_trace, - host->core_amount, - host->state_trace); + host->speed_per_pstate, + host->core_amount); + if (host->state_trace) + cpu->setStateTrace(host->state_trace); + if (host->speed_trace) + cpu->setSpeedTrace(host->speed_trace); surf_host_model->createHost(host->id, netcard, cpu, host->properties)->attach(h); if (host->pstate != 0) @@ -141,7 +140,8 @@ void sg_platf_new_router(sg_platf_router_cbarg_t router) xbt_assert(nullptr == xbt_lib_get_or_null(as_router_lib, router->id, ROUTING_ASR_LEVEL), "Refusing to create a router named '%s': this name already describes a node.", router->id); - simgrid::surf::NetCard *netcard = new simgrid::surf::NetCardImpl(router->id, SURF_NETWORK_ELEMENT_ROUTER, current_routing); + simgrid::surf::NetCard *netcard = + new simgrid::surf::NetCardImpl(router->id, SURF_NETWORK_ELEMENT_ROUTER, current_routing); netcard->setId(current_routing->addComponent(netcard)); xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) netcard); XBT_DEBUG("Having set name '%s' id '%d'", router->id, netcard->id()); @@ -171,6 +171,27 @@ void sg_platf_new_router(sg_platf_router_cbarg_t router) } void sg_platf_new_link(sg_platf_link_cbarg_t link){ + std::vector names; + + if (link->policy == SURF_LINK_FULLDUPLEX) { + names.push_back(bprintf("%s_UP", link->id)); + names.push_back(bprintf("%s_DOWN", link->id)); + } else { + names.push_back(xbt_strdup(link->id)); + } + for (auto link_name : names) { + Link *l = surf_network_model->createLink(link_name, link->bandwidth, link->latency, link->policy, link->properties); + + if (link->latency_trace) + l->setLatencyTrace(link->latency_trace); + if (link->bandwidth_trace) + l->setBandwidthTrace(link->bandwidth_trace); + if (link->state_trace) + l->setStateTrace(link->state_trace); + + xbt_free(link_name); + } + simgrid::surf::on_link(link); } @@ -270,7 +291,8 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) 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); + if (avail_file && avail_file[0]) + host.speed_trace = tmgr_trace_new_from_file(avail_file); xbt_free(avail_file); } else { XBT_DEBUG("\tavailability_file=\"\""); @@ -279,21 +301,22 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) 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); + if (avail_file && avail_file[0]) + 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.speed_per_pstate = xbt_dynar_new(sizeof(double), NULL); + xbt_dynar_push(host.speed_per_pstate,&cluster->speed); host.pstate = 0; //host.power_peak = cluster->power; host.core_amount = cluster->core_amount; host.coord = ""; sg_platf_new_host(&host); - xbt_dynar_free(&host.speed_peak); + xbt_dynar_free(&host.speed_per_pstate); XBT_DEBUG(""); XBT_DEBUG("", link_id, @@ -425,6 +448,75 @@ void routing_cluster_add_backbone(simgrid::surf::Link* bb) { XBT_DEBUG("Add a backbone to AS '%s'", current_routing->name()); } +void sg_platf_new_cabinet(sg_platf_cabinet_cbarg_t cabinet) +{ + int start, end, i; + char *groups , *host_id , *link_id = NULL; + unsigned int iter; + xbt_dynar_t radical_elements; + xbt_dynar_t radical_ends; + + //Make all hosts + radical_elements = xbt_str_split(cabinet->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; + } + s_sg_platf_host_cbarg_t host = SG_PLATF_HOST_INITIALIZER; + memset(&host, 0, sizeof(host)); + host.pstate = 0; + host.core_amount = 1; + + s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER; + memset(&link, 0, sizeof(link)); + link.policy = SURF_LINK_FULLDUPLEX; + link.latency = cabinet->lat; + link.bandwidth = cabinet->bw; + + s_sg_platf_host_link_cbarg_t host_link = SG_PLATF_HOST_LINK_INITIALIZER; + memset(&host_link, 0, sizeof(host_link)); + + for (i = start; i <= end; i++) { + host_id = bprintf("%s%d%s",cabinet->prefix,i,cabinet->suffix); + link_id = bprintf("link_%s%d%s",cabinet->prefix,i,cabinet->suffix); + host.id = host_id; + link.id = link_id; + host.speed_per_pstate = xbt_dynar_new(sizeof(double), NULL); + xbt_dynar_push(host.speed_per_pstate,&cabinet->speed); + sg_platf_new_host(&host); + xbt_dynar_free(&host.speed_per_pstate); + sg_platf_new_link(&link); + + char* link_up = bprintf("%s_UP",link_id); + char* link_down = bprintf("%s_DOWN",link_id); + host_link.id = host_id; + host_link.link_up = link_up; + host_link.link_down = link_down; + sg_platf_new_hostlink(&host_link); + + free(host_id); + free(link_id); + free(link_up); + free(link_down); + } + + xbt_dynar_free(&radical_ends); + } + xbt_dynar_free(&radical_elements); +} + void sg_platf_new_storage(sg_platf_storage_cbarg_t storage) { xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL), @@ -651,15 +743,15 @@ void sg_platf_new_peer(sg_platf_peer_cbarg_t peer) memset(&host, 0, sizeof(host)); host.id = host_id; - host.speed_peak = xbt_dynar_new(sizeof(double), NULL); - xbt_dynar_push(host.speed_peak,&peer->speed); + host.speed_per_pstate = xbt_dynar_new(sizeof(double), NULL); + xbt_dynar_push(host.speed_per_pstate,&peer->speed); host.pstate = 0; //host.power_peak = peer->power; host.speed_trace = peer->availability_trace; host.state_trace = peer->state_trace; host.core_amount = 1; sg_platf_new_host(&host); - xbt_dynar_free(&host.speed_peak); + xbt_dynar_free(&host.speed_per_pstate); s_sg_platf_link_cbarg_t link = SG_PLATF_LINK_INITIALIZER; memset(&link, 0, sizeof(link)); @@ -667,15 +759,13 @@ void sg_platf_new_peer(sg_platf_peer_cbarg_t peer) link.latency = peer->lat; char* link_up = bprintf("%s_UP",link_id); - XBT_DEBUG("", link_up, - peer->bw_out, peer->lat); + 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("%s_DOWN",link_id); - XBT_DEBUG("", link_down, - peer->bw_in, peer->lat); + XBT_DEBUG("", link_down, peer->bw_in, peer->lat); link.id = link_down; link.bandwidth = peer->bw_in; sg_platf_new_link(&link); @@ -878,7 +968,7 @@ void sg_platf_new_AS_begin(sg_platf_AS_cbarg_t AS) void sg_platf_new_AS_end() { xbt_assert(current_routing, "Cannot seal the current AS: none under construction"); - current_routing->Seal(); + current_routing->seal(); current_routing = static_cast(current_routing->father()); if (TRACE_is_enabled())