From: Paul Bédaride Date: Fri, 29 Nov 2013 16:57:31 +0000 (+0100) Subject: Restructure surf++ cpu and network X-Git-Tag: v3_11_beta~204 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/5e2c8aeab0ec45fb9945018b9de3cab5c1019875?hp=1adbcb0ce38e18e5bab8a699236e5128f506e603 Restructure surf++ cpu and network --- diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 1ba8ed9005..471a5ad85e 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -40,16 +40,17 @@ set(EXTRA_DIST src/smpi/colls/coll_tuned_topo.h src/smpi/private.h src/smpi/smpi_mpi_dt_private.h - src/surf/cpu.hpp + src/surf/cpu_interface.hpp src/surf/cpu_ti.hpp src/surf/cpu_cas01.hpp src/surf/gtnets/gtnets_interface.h src/surf/gtnets/gtnets_simulator.h src/surf/gtnets/gtnets_topology.h src/surf/maxmin_private.h + src/surf/network_interface.hpp src/surf/network_gtnets.hpp src/surf/network_ns3_private.h - src/surf/network.hpp + src/surf/network_cm02.hpp src/surf/network_smpi.hpp src/surf/network_constant.hpp src/surf/ns3/my-point-to-point-helper.h @@ -295,7 +296,7 @@ set(NS3_SRC ) set(SURF_SRC - src/surf/cpu.cpp + src/surf/cpu_interface.cpp src/surf/cpu_ti.cpp src/surf/cpu_cas01.cpp src/surf/fair_bottleneck.c @@ -303,7 +304,8 @@ set(SURF_SRC src/surf/instr_surf.c src/surf/lagrange.c src/surf/maxmin.c - src/surf/network.cpp + src/surf/network_interface.cpp + src/surf/network_cm02.cpp src/surf/network_smpi.cpp src/surf/network_constant.cpp src/surf/platf_generator.c @@ -311,7 +313,7 @@ set(SURF_SRC src/surf/sg_platf.c src/surf/storage.cpp src/surf/surf.cpp - src/surf/surf_interface.cpp + src/surf/surf_c_bindings.cpp src/surf/surf_routing.cpp src/surf/surf_routing_cluster.cpp src/surf/surf_routing_dijkstra.cpp diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index c9b5fd6980..11f247252c 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -48,7 +48,7 @@ class Model; class CpuModel; class WorkstationModel; class WorkstationVMModel; -class NetworkCm02Model; +class NetworkModel; class StorageModel; class Resource; class ResourceLmm; @@ -66,7 +66,7 @@ typedef struct Model Model; typedef struct CpuModel CpuModel; typedef struct WorkstationModel WorkstationModel; typedef struct WorkstationVMModel WorkstationVMModel; -typedef struct NetworkCm02Model NetworkCm02Model; +typedef struct NetworkModel NetworkModel; typedef struct StorageModel StorageModel; typedef struct Resource Resource; typedef struct ResourceLmm ResourceLmm; @@ -92,7 +92,7 @@ typedef CpuModel *surf_cpu_model_t; typedef WorkstationModel *surf_workstation_model_t; typedef WorkstationVMModel *surf_vm_workstation_model_t; -typedef NetworkCm02Model *surf_network_model_t; +typedef NetworkModel *surf_network_model_t; typedef StorageModel *surf_storage_model_t; typedef xbt_dictelm_t surf_resource_t; diff --git a/src/surf/cpu_cas01.hpp b/src/surf/cpu_cas01.hpp index 8ed959fb76..5f52ef56b5 100644 --- a/src/surf/cpu_cas01.hpp +++ b/src/surf/cpu_cas01.hpp @@ -1,4 +1,4 @@ -#include "cpu.hpp" +#include "cpu_interface.hpp" /*********** * Classes * diff --git a/src/surf/cpu.cpp b/src/surf/cpu_interface.cpp similarity index 99% rename from src/surf/cpu.cpp rename to src/surf/cpu_interface.cpp index 0c9a2f3d7a..c80c77abde 100644 --- a/src/surf/cpu.cpp +++ b/src/surf/cpu_interface.cpp @@ -1,4 +1,4 @@ -#include "cpu.hpp" +#include "cpu_interface.hpp" extern "C" { XBT_LOG_EXTERNAL_CATEGORY(surf_kernel); diff --git a/src/surf/cpu.hpp b/src/surf/cpu_interface.hpp similarity index 100% rename from src/surf/cpu.hpp rename to src/surf/cpu_interface.hpp diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index 8cf2280cc7..568dd75612 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -426,10 +426,6 @@ CpuTiModel::CpuTiModel() : CpuModel("cpu_ti") CpuTiModel::~CpuTiModel() { - void **cpu; - xbt_lib_cursor_t cursor; - char *key; - surf_cpu_model_pm = NULL; xbt_swag_free(p_runningActionSetThatDoesNotNeedBeingChecked); diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp index edf240efa7..9a14110c97 100644 --- a/src/surf/cpu_ti.hpp +++ b/src/surf/cpu_ti.hpp @@ -1,4 +1,4 @@ -#include "cpu.hpp" +#include "cpu_interface.hpp" #include "trace_mgr_private.h" #include "surf/surf_routing.h" diff --git a/src/surf/network.c b/src/surf/network.c deleted file mode 100644 index c959b37d8b..0000000000 --- a/src/surf/network.c +++ /dev/null @@ -1,992 +0,0 @@ - -/* - * Network with improved management of tasks, IM (Improved Management). - * Uses a heap to store actions so that the share_resources is faster. - * This model automatically sets the selective update flag to 1 and is - * highly dependent on the maxmin lmm module. - */ - -/* Copyright (c) 2004-2013. 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 "network_private.h" -#include "xbt/log.h" -#include "xbt/str.h" - -#include "surf_private.h" -#include "xbt/dict.h" -#include "maxmin_private.h" -#include "surf/surfxml_parse_values.h" -#include "surf/surf_resource.h" -#include "surf/surf_resource_lmm.h" -#include "simgrid/sg_config.h" - -#undef GENERIC_LMM_ACTION -#undef GENERIC_ACTION -#define GENERIC_LMM_ACTION(action) (action)->generic_lmm_action -#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action - - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf, - "Logging specific to the SURF network module"); - -surf_model_t surf_network_model = NULL; -static void (*network_solve) (lmm_system_t) = NULL; - -xbt_dynar_t smpi_bw_factor = NULL; -xbt_dynar_t smpi_lat_factor = NULL; - -typedef struct s_smpi_factor *smpi_factor_t; -typedef struct s_smpi_factor { - long factor; - double value; -} s_smpi_factor_t; - - -double sg_sender_gap = 0.0; -double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */ -double sg_bandwidth_factor = 1.0; /* default value; can be set by model or from command line */ -double sg_weight_S_parameter = 0.0; /* default value; can be set by model or from command line */ - -double sg_tcp_gamma = 0.0; -int sg_network_crosstraffic = 0; - -xbt_dict_t gap_lookup = NULL; - -/******************************************************************************/ -/* Factors callbacks */ -/******************************************************************************/ -static double constant_latency_factor(double size) -{ - return sg_latency_factor; -} - -static double constant_bandwidth_factor(double size) -{ - return sg_bandwidth_factor; -} - -static double constant_bandwidth_constraint(double rate, double bound, - double size) -{ - return rate; -} - -/**********************/ -/* SMPI callbacks */ -/**********************/ - -static int factor_cmp(const void *pa, const void *pb) -{ - return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 : - (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0; -} - - -static xbt_dynar_t parse_factor(const char *smpi_coef_string) -{ - char *value = NULL; - unsigned int iter = 0; - s_smpi_factor_t fact; - xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL; - - smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL); - radical_elements = xbt_str_split(smpi_coef_string, ";"); - xbt_dynar_foreach(radical_elements, iter, value) { - - radical_elements2 = xbt_str_split(value, ":"); - if (xbt_dynar_length(radical_elements2) != 2) - xbt_die("Malformed radical for smpi factor!"); - fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *)); - fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *)); - xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact); - XBT_DEBUG("smpi_factor:\t%ld : %f", fact.factor, fact.value); - xbt_dynar_free(&radical_elements2); - } - xbt_dynar_free(&radical_elements); - iter=0; - xbt_dynar_sort(smpi_factor, &factor_cmp); - xbt_dynar_foreach(smpi_factor, iter, fact) { - XBT_DEBUG("ordered smpi_factor:\t%ld : %f", fact.factor, fact.value); - - } - return smpi_factor; -} - -static double smpi_bandwidth_factor(double size) -{ - if (!smpi_bw_factor) - smpi_bw_factor = - parse_factor(sg_cfg_get_string("smpi/bw_factor")); - - unsigned int iter = 0; - s_smpi_factor_t fact; - double current=1.0; - xbt_dynar_foreach(smpi_bw_factor, iter, fact) { - if (size <= fact.factor) { - XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current); - return current; - }else - current=fact.value; - } - XBT_DEBUG("%f > %ld return %f", size, fact.factor, current); - - return current; -} - -static double smpi_latency_factor(double size) -{ - if (!smpi_lat_factor) - smpi_lat_factor = - parse_factor(sg_cfg_get_string("smpi/lat_factor")); - - unsigned int iter = 0; - s_smpi_factor_t fact; - double current=1.0; - xbt_dynar_foreach(smpi_lat_factor, iter, fact) { - if (size <= fact.factor) { - XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current); - return current; - }else - current=fact.value; - } - XBT_DEBUG("%f > %ld return %f", size, fact.factor, current); - - return current; -} - -/**--------- -----------*/ - -static double smpi_bandwidth_constraint(double rate, double bound, - double size) -{ - return rate < 0 ? bound : min(bound, rate * smpi_bandwidth_factor(size)); -} - -static double (*latency_factor_callback) (double) = - &constant_latency_factor; -static double (*bandwidth_factor_callback) (double) = - &constant_bandwidth_factor; -static double (*bandwidth_constraint_callback) (double, double, double) = - &constant_bandwidth_constraint; - -static void (*gap_append) (double, const link_CM02_t, - surf_action_network_CM02_t) = NULL; - -static void *net_create_resource(const char *name, - double bw_initial, - tmgr_trace_t bw_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_resource_state_t - state_initial, - tmgr_trace_t state_trace, - e_surf_link_sharing_policy_t - policy, xbt_dict_t properties) -{ - link_CM02_t nw_link = (link_CM02_t) - surf_resource_lmm_new(sizeof(s_link_CM02_t), - surf_network_model, name, properties, - surf_network_model->model_private->maxmin_system, - sg_bandwidth_factor * bw_initial, - history, - state_initial, state_trace, - bw_initial, bw_trace); - - xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL), - "Link '%s' declared several times in the platform file.", - name); - - nw_link->lat_current = lat_initial; - if (lat_trace) - nw_link->lat_event = - tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link); - - if (policy == SURF_LINK_FATPIPE) - lmm_constraint_shared(nw_link->lmm_resource.constraint); - - xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, nw_link); - XBT_DEBUG("Create link '%s'",name); - - return nw_link; -} - -static void net_parse_link_init(sg_platf_link_cbarg_t link) -{ - if (link->policy == SURF_LINK_FULLDUPLEX) { - char *link_id; - link_id = bprintf("%s_UP", link->id); - net_create_resource(link_id, - link->bandwidth, - link->bandwidth_trace, - link->latency, - link->latency_trace, - link->state, - link->state_trace, link->policy, link->properties); - xbt_free(link_id); - link_id = bprintf("%s_DOWN", link->id); - net_create_resource(link_id, - link->bandwidth, - link->bandwidth_trace, - link->latency, - link->latency_trace, - link->state, - link->state_trace, link->policy, link->properties); - xbt_free(link_id); - } else { - net_create_resource(link->id, - link->bandwidth, - link->bandwidth_trace, - link->latency, - link->latency_trace, - link->state, - link->state_trace, link->policy, link->properties); - } -} - -static void net_add_traces(void) -{ - xbt_dict_cursor_t cursor = NULL; - char *trace_name, *elm; - - static int called = 0; - if (called) - return; - called = 1; - - /* connect all traces relative to network */ - xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) { - tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); - link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL); - - xbt_assert(link, "Cannot connect trace %s to link %s: link undefined", - trace_name, elm); - xbt_assert(trace, - "Cannot connect trace %s to link %s: trace undefined", - trace_name, elm); - - link->lmm_resource.state_event = - tmgr_history_add_trace(history, trace, 0.0, 0, link); - } - - xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) { - tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); - link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL); - - xbt_assert(link, "Cannot connect trace %s to link %s: link undefined", - trace_name, elm); - xbt_assert(trace, - "Cannot connect trace %s to link %s: trace undefined", - trace_name, elm); - - link->lmm_resource.power.event = - tmgr_history_add_trace(history, trace, 0.0, 0, link); - } - - xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) { - tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); - link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL); - - xbt_assert(link, "Cannot connect trace %s to link %s: link undefined", - trace_name, elm); - xbt_assert(trace, - "Cannot connect trace %s to link %s: trace undefined", - trace_name, elm); - - link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link); - } -} - -static void net_define_callbacks(void) -{ - /* Figuring out the network links */ - sg_platf_link_add_cb(net_parse_link_init); - sg_platf_postparse_add_cb(net_add_traces); -} - -static int net_resource_used(void *resource_id) -{ - return lmm_constraint_used(surf_network_model->model_private->maxmin_system, ((surf_resource_lmm_t) - resource_id)-> - constraint); -} - -void net_action_recycle(surf_action_t action) -{ - return; -} - -#ifdef HAVE_LATENCY_BOUND_TRACKING -int net_get_link_latency_limited(surf_action_t action) -{ - return action->latency_limited; -} -#endif - -static double net_share_resources_full(surf_model_t network_model, double now) -{ - s_surf_action_lmm_t s_action; - surf_action_network_CM02_t action = NULL; - xbt_swag_t running_actions = - network_model->states.running_action_set; - double min; - - min = generic_maxmin_share_resources(running_actions, - xbt_swag_offset(s_action, - variable), - network_model->model_private->maxmin_system, - network_solve); - -#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + xbt_swag_offset(s_action, variable) ))) - - xbt_swag_foreach(action, running_actions) { -#ifdef HAVE_LATENCY_BOUND_TRACKING - if (lmm_is_variable_limited_by_latency(GENERIC_LMM_ACTION(action).variable)) { - action->latency_limited = 1; - } else { - action->latency_limited = 0; - } -#endif - if (action->latency > 0) { - min = (min < 0) ? action->latency : min(min, action->latency); - } - } - - XBT_DEBUG("Min of share resources %f", min); - - return min; -} - -static double net_share_resources_lazy(surf_model_t network_model, double now) -{ - return generic_share_resources_lazy(now, network_model); -} - -static void net_update_actions_state_full(surf_model_t network_model, double now, double delta) -{ - generic_update_actions_state_full(now, delta, network_model); -} - -static void net_update_actions_state_lazy(surf_model_t network_model, double now, double delta) -{ - generic_update_actions_state_lazy(now, delta, network_model); -} - -static void net_update_resource_state(void *id, - tmgr_trace_event_t event_type, - double value, double date) -{ - link_CM02_t nw_link = id; - /* printf("[" "%g" "] Asking to update network card \"%s\" with value " */ - /* "%g" " for event %p\n", surf_get_clock(), nw_link->name, */ - /* value, event_type); */ - - if (event_type == nw_link->lmm_resource.power.event) { - double delta = - sg_weight_S_parameter / value - sg_weight_S_parameter / - (nw_link->lmm_resource.power.peak * - nw_link->lmm_resource.power.scale); - lmm_variable_t var = NULL; - lmm_element_t elem = NULL; - surf_action_network_CM02_t action = NULL; - - nw_link->lmm_resource.power.peak = value; - lmm_update_constraint_bound(surf_network_model->model_private->maxmin_system, - nw_link->lmm_resource.constraint, - sg_bandwidth_factor * - (nw_link->lmm_resource.power.peak * - nw_link->lmm_resource.power.scale)); -#ifdef HAVE_TRACING - TRACE_surf_link_set_bandwidth(date, - (char - *) (((nw_link->lmm_resource). - generic_resource).name), - sg_bandwidth_factor * - (nw_link->lmm_resource.power.peak * - nw_link->lmm_resource.power.scale)); -#endif - if (sg_weight_S_parameter > 0) { - while ((var = lmm_get_var_from_cnst - (surf_network_model->model_private->maxmin_system, nw_link->lmm_resource.constraint, - &elem))) { - action = lmm_variable_id(var); - action->weight += delta; - if (!(GENERIC_LMM_ACTION(action).suspended)) - lmm_update_variable_weight(surf_network_model->model_private->maxmin_system, - GENERIC_LMM_ACTION(action).variable, action->weight); - } - } - if (tmgr_trace_event_free(event_type)) - nw_link->lmm_resource.power.event = NULL; - } else if (event_type == nw_link->lat_event) { - double delta = value - nw_link->lat_current; - lmm_variable_t var = NULL; - lmm_element_t elem = NULL; - surf_action_network_CM02_t action = NULL; - - nw_link->lat_current = value; - while ((var = lmm_get_var_from_cnst - (surf_network_model->model_private->maxmin_system, nw_link->lmm_resource.constraint, - &elem))) { - action = lmm_variable_id(var); - action->lat_current += delta; - action->weight += delta; - if (action->rate < 0) - lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable, - sg_tcp_gamma / (2.0 * - action->lat_current)); - else { - lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable, - min(action->rate, - sg_tcp_gamma / (2.0 * - action-> - lat_current))); - - if (action->rate < sg_tcp_gamma / (2.0 * action->lat_current)) { - XBT_INFO("Flow is limited BYBANDWIDTH"); - } else { - XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", - action->lat_current); - } - } - if (!(GENERIC_LMM_ACTION(action).suspended)) - lmm_update_variable_weight(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable, - action->weight); - - } - if (tmgr_trace_event_free(event_type)) - nw_link->lat_event = NULL; - } else if (event_type == nw_link->lmm_resource.state_event) { - if (value > 0) - nw_link->lmm_resource.state_current = SURF_RESOURCE_ON; - else { - lmm_constraint_t cnst = nw_link->lmm_resource.constraint; - lmm_variable_t var = NULL; - lmm_element_t elem = NULL; - - nw_link->lmm_resource.state_current = SURF_RESOURCE_OFF; - while ((var = lmm_get_var_from_cnst - (surf_network_model->model_private->maxmin_system, cnst, &elem))) { - surf_action_t action = lmm_variable_id(var); - - if (surf_action_state_get(action) == SURF_ACTION_RUNNING || - surf_action_state_get(action) == SURF_ACTION_READY) { - action->finish = date; - surf_network_model->action_state_set(action, SURF_ACTION_FAILED); - } - } - } - if (tmgr_trace_event_free(event_type)) - nw_link->lmm_resource.state_event = NULL; - } else { - XBT_CRITICAL("Unknown event ! \n"); - xbt_abort(); - } - - XBT_DEBUG - ("There were a resource state event, need to update actions related to the constraint (%p)", - nw_link->lmm_resource.constraint); - return; -} - - -static surf_action_t net_communicate(sg_routing_edge_t src, - sg_routing_edge_t dst, - double size, double rate) -{ - unsigned int i; - link_CM02_t link; - int failed = 0; - surf_action_network_CM02_t action = NULL; - double bandwidth_bound; - double latency = 0.0; - xbt_dynar_t back_route = NULL; - int constraints_per_variable = 0; - - xbt_dynar_t route = xbt_dynar_new(sizeof(sg_routing_link_t), NULL); - - XBT_IN("(%s,%s,%g,%g)", src->name, dst->name, size, rate); - - routing_get_route_and_latency(src, dst, &route, &latency); - xbt_assert(!xbt_dynar_is_empty(route) || latency, - "You're trying to send data from %s to %s but there is no connection at all between these two hosts.", - src->name, dst->name); - - xbt_dynar_foreach(route, i, link) { - if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) { - failed = 1; - break; - } - } - if (sg_network_crosstraffic == 1) { - routing_get_route_and_latency(dst, src, &back_route, NULL); - xbt_dynar_foreach(back_route, i, link) { - if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) { - failed = 1; - break; - } - } - } - - action = - surf_action_new(sizeof(s_surf_action_network_CM02_t), size, - surf_network_model, failed); -#ifdef HAVE_LATENCY_BOUND_TRACKING - action->latency_limited = 0; -#endif - action->weight = action->latency = latency; - - xbt_swag_insert(action, ((surf_action_t)action)->state_set); - action->rate = rate; - if (surf_network_model->model_private->update_mechanism == UM_LAZY) { - GENERIC_LMM_ACTION(action).index_heap = -1; - GENERIC_LMM_ACTION(action).last_update = surf_get_clock(); - } - - bandwidth_bound = -1.0; - if (sg_weight_S_parameter > 0) { - xbt_dynar_foreach(route, i, link) { - action->weight += - sg_weight_S_parameter / - (link->lmm_resource.power.peak * link->lmm_resource.power.scale); - } - } - xbt_dynar_foreach(route, i, link) { - double bb = bandwidth_factor_callback(size) * - (link->lmm_resource.power.peak * link->lmm_resource.power.scale); - bandwidth_bound = - (bandwidth_bound < 0.0) ? bb : min(bandwidth_bound, bb); - } - - action->lat_current = action->latency; - action->latency *= latency_factor_callback(size); - action->rate = - bandwidth_constraint_callback(action->rate, bandwidth_bound, size); - if (gap_append) { - xbt_assert(!xbt_dynar_is_empty(route), - "Using a model with a gap (e.g., SMPI) with a platform without links (e.g. vivaldi)!!!"); - - link = *(link_CM02_t *) xbt_dynar_get_ptr(route, 0); - gap_append(size, link, action); - XBT_DEBUG("Comm %p: %s -> %s gap=%f (lat=%f)", - action, src->name, dst->name, action->sender.gap, - action->latency); - } - - constraints_per_variable = xbt_dynar_length(route); - if (back_route != NULL) - constraints_per_variable += xbt_dynar_length(back_route); - - if (action->latency > 0) { - GENERIC_LMM_ACTION(action).variable = - lmm_variable_new(surf_network_model->model_private->maxmin_system, action, 0.0, -1.0, - constraints_per_variable); - if (surf_network_model->model_private->update_mechanism == UM_LAZY) { - // add to the heap the event when the latency is payed - XBT_DEBUG("Added action (%p) one latency event at date %f", action, - action->latency + GENERIC_LMM_ACTION(action).last_update); - surf_action_lmm_heap_insert(surf_network_model->model_private->action_heap,(surf_action_lmm_t)action, action->latency + GENERIC_LMM_ACTION(action).last_update, - xbt_dynar_is_empty(route) ? NORMAL : LATENCY); - } - } else - GENERIC_LMM_ACTION(action).variable = - lmm_variable_new(surf_network_model->model_private->maxmin_system, action, 1.0, -1.0, - constraints_per_variable); - - if (action->rate < 0) { - lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable, - (action->lat_current > 0) ? - sg_tcp_gamma / (2.0 * - action->lat_current) : -1.0); - } else { - lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable, - (action->lat_current > 0) ? - min(action->rate, - sg_tcp_gamma / (2.0 * - action->lat_current)) - : action->rate); - } - - xbt_dynar_foreach(route, i, link) { - lmm_expand(surf_network_model->model_private->maxmin_system, link->lmm_resource.constraint, - GENERIC_LMM_ACTION(action).variable, 1.0); - } - - if (sg_network_crosstraffic == 1) { - XBT_DEBUG("Fullduplex active adding backward flow using 5%%"); - xbt_dynar_foreach(back_route, i, link) { - lmm_expand(surf_network_model->model_private->maxmin_system, link->lmm_resource.constraint, - GENERIC_LMM_ACTION(action).variable, .05); - } - } - - xbt_dynar_free(&route); - XBT_OUT(); - - return (surf_action_t) action; -} - -static xbt_dynar_t net_get_route(void *src, void *dst) -{ - xbt_dynar_t route = NULL; - routing_get_route_and_latency(src, dst, &route, NULL); - return route; -} - -static double net_get_link_bandwidth(const void *link) -{ - surf_resource_lmm_t lmm = (surf_resource_lmm_t) link; - return lmm->power.peak * lmm->power.scale; -} - -static double net_get_link_latency(const void *link) -{ - return ((link_CM02_t) link)->lat_current; -} - -static int net_link_shared(const void *link) -{ - return - lmm_constraint_is_shared(((surf_resource_lmm_t) link)->constraint); -} - -static void net_finalize(surf_model_t network_model) -{ - lmm_system_free(network_model->model_private->maxmin_system); - network_model->model_private->maxmin_system = NULL; - - if (network_model->model_private->update_mechanism == UM_LAZY) { - xbt_heap_free(network_model->model_private->action_heap); - xbt_swag_free(network_model->model_private->modified_set); - } - - surf_model_exit(network_model); - network_model = NULL; - - xbt_dict_free(&gap_lookup); - xbt_dynar_free(&smpi_bw_factor); - xbt_dynar_free(&smpi_lat_factor); -} - -static void smpi_gap_append(double size, const link_CM02_t link, - surf_action_network_CM02_t action) -{ - const char *src = link->lmm_resource.generic_resource.name; - xbt_fifo_t fifo; - //surf_action_network_CM02_t last_action; - //double bw; - - if (sg_sender_gap > 0.0) { - if (!gap_lookup) { - gap_lookup = xbt_dict_new_homogeneous(NULL); - } - fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src); - action->sender.gap = 0.0; - if (fifo && xbt_fifo_size(fifo) > 0) { - /* Compute gap from last send */ - /*last_action = - (surf_action_network_CM02_t) - xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));*/ - // bw = net_get_link_bandwidth(link); - action->sender.gap = sg_sender_gap; - /* max(sg_sender_gap,last_action->sender.size / bw);*/ - action->latency += action->sender.gap; - } - /* Append action as last send */ - /*action->sender.link_name = link->lmm_resource.generic_resource.name; - fifo = - (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, - action->sender.link_name); - if (!fifo) { - fifo = xbt_fifo_new(); - xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL); - } - action->sender.fifo_item = xbt_fifo_push(fifo, action);*/ - action->sender.size = size; - } -} - -static void smpi_gap_remove(surf_action_lmm_t lmm_action) -{ - xbt_fifo_t fifo; - size_t size; - surf_action_network_CM02_t action = (surf_action_network_CM02_t)(lmm_action); - - if (sg_sender_gap > 0.0 && action->sender.link_name - && action->sender.fifo_item) { - fifo = - (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, - action->sender.link_name); - xbt_fifo_remove_item(fifo, action->sender.fifo_item); - size = xbt_fifo_size(fifo); - if (size == 0) { - xbt_fifo_free(fifo); - xbt_dict_remove(gap_lookup, action->sender.link_name); - size = xbt_dict_length(gap_lookup); - if (size == 0) { - xbt_dict_free(&gap_lookup); - } - } - } -} - -static void set_update_mechanism(void) -{ - char *optim = xbt_cfg_get_string(_sg_cfg_set, "network/optim"); - int select = - xbt_cfg_get_boolean(_sg_cfg_set, "network/maxmin_selective_update"); - - if (!strcmp(optim, "Full")) { - surf_network_model->model_private->update_mechanism = UM_FULL; - surf_network_model->model_private->selective_update = select; - } else if (!strcmp(optim, "Lazy")) { - surf_network_model->model_private->update_mechanism = UM_LAZY; - surf_network_model->model_private->selective_update = 1; - xbt_assert((select == 1) - || - (xbt_cfg_is_default_value - (_sg_cfg_set, "network/maxmin_selective_update")), - "Disabling selective update while using the lazy update mechanism is dumb!"); - } else { - xbt_die("Unsupported optimization (%s) for this model", optim); - } -} - -static void surf_network_model_init_internal(void) -{ - s_surf_action_network_CM02_t comm; - surf_network_model = surf_model_init(); - - set_update_mechanism(); - - surf_network_model->name = "network"; - surf_network_model->type = SURF_MODEL_TYPE_NETWORK; - surf_network_model->action_unref = surf_action_unref; - surf_network_model->action_cancel = surf_action_cancel; - surf_network_model->action_recycle = net_action_recycle; - - surf_network_model->get_remains = surf_action_get_remains; - -#ifdef HAVE_LATENCY_BOUND_TRACKING - surf_network_model->get_latency_limited = net_get_link_latency_limited; -#endif -#ifdef HAVE_TRACING - surf_network_model->set_category = surf_action_set_category; -#endif - - surf_network_model->model_private->resource_used = net_resource_used; - if (surf_network_model->model_private->update_mechanism == UM_LAZY) { - surf_network_model->model_private->share_resources = - net_share_resources_lazy; - surf_network_model->model_private->update_actions_state = - net_update_actions_state_lazy; - } else if (surf_network_model->model_private->update_mechanism == UM_FULL) { - surf_network_model->model_private->share_resources = - net_share_resources_full; - surf_network_model->model_private->update_actions_state = - net_update_actions_state_full; - } - - surf_network_model->model_private->update_resource_state = - net_update_resource_state; - surf_network_model->model_private->finalize = net_finalize; - - surf_network_model->suspend = surf_action_suspend; - surf_network_model->resume = surf_action_resume; - surf_network_model->is_suspended = surf_action_is_suspended; - - xbt_assert(surf_cpu_model_pm); - xbt_assert(surf_cpu_model_vm); - surf_cpu_model_pm->set_max_duration = surf_action_set_max_duration; - surf_cpu_model_vm->set_max_duration = surf_action_set_max_duration; - - surf_network_model->extension.network.communicate = net_communicate; - surf_network_model->extension.network.get_route = net_get_route; - surf_network_model->extension.network.get_link_bandwidth = - net_get_link_bandwidth; - surf_network_model->extension.network.get_link_latency = - net_get_link_latency; - surf_network_model->extension.network.link_shared = net_link_shared; - surf_network_model->extension.network.add_traces = net_add_traces; - - if (!surf_network_model->model_private->maxmin_system) - surf_network_model->model_private->maxmin_system = lmm_system_new(surf_network_model->model_private->selective_update); - - routing_model_create(net_create_resource("__loopback__", - 498000000, NULL, 0.000015, NULL, - SURF_RESOURCE_ON, NULL, - SURF_LINK_FATPIPE, NULL)); - - if (surf_network_model->model_private->update_mechanism == UM_LAZY) { - surf_network_model->model_private->action_heap = xbt_heap_new(8, NULL); - xbt_heap_set_update_callback(surf_network_model->model_private->action_heap, - surf_action_lmm_update_index_heap); - surf_network_model->model_private->modified_set = - xbt_swag_new(xbt_swag_offset(comm, generic_lmm_action.action_list_hookup)); - surf_network_model->model_private->maxmin_system->keep_track = surf_network_model->model_private->modified_set; - } - - surf_network_model->gap_remove = NULL; -} - -/************************************************************************/ -/* New model based on LV08 and experimental results of MPI ping-pongs */ -/************************************************************************/ -/* @Inproceedings{smpi_ipdps, */ -/* author={Pierre-Nicolas Clauss and Mark Stillwell and Stéphane Genaud and Frédéric Suter and Henri Casanova and Martin Quinson}, */ -/* title={Single Node On-Line Simulation of {MPI} Applications with SMPI}, */ -/* booktitle={25th IEEE International Parallel and Distributed Processing Symposium (IPDPS'11)}, */ -/* address={Anchorage (Alaska) USA}, */ -/* month=may, */ -/* year={2011} */ -/* } */ -void surf_network_model_init_SMPI(void) -{ - - if (surf_network_model) - return; - - surf_network_model_init_internal(); - latency_factor_callback = &smpi_latency_factor; - bandwidth_factor_callback = &smpi_bandwidth_factor; - bandwidth_constraint_callback = &smpi_bandwidth_constraint; - gap_append = &smpi_gap_append; - surf_network_model->gap_remove = &smpi_gap_remove; - net_define_callbacks(); - xbt_dynar_push(model_list, &surf_network_model); - network_solve = lmm_solve; - - xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", 10e-6); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775); -} - -/************************************************************************/ -/* New model based on optimizations discussed during Pedro Velho's thesis*/ -/************************************************************************/ -/* @techreport{VELHO:2011:HAL-00646896:1, */ -/* url = {http://hal.inria.fr/hal-00646896/en/}, */ -/* title = {{Flow-level network models: have we reached the limits?}}, */ -/* author = {Velho, Pedro and Schnorr, Lucas and Casanova, Henri and Legrand, Arnaud}, */ -/* type = {Rapport de recherche}, */ -/* institution = {INRIA}, */ -/* number = {RR-7821}, */ -/* year = {2011}, */ -/* month = Nov, */ -/* pdf = {http://hal.inria.fr/hal-00646896/PDF/rr-validity.pdf}, */ -/* } */ -void surf_network_model_init_LegrandVelho(void) -{ - if (surf_network_model) - return; - - surf_network_model_init_internal(); - net_define_callbacks(); - xbt_dynar_push(model_list, &surf_network_model); - network_solve = lmm_solve; - - xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", - 13.01); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor", - 0.97); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 20537); -} - -/***************************************************************************/ -/* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */ -/***************************************************************************/ -/* @TechReport{ rr-lip2002-40, */ -/* author = {Henri Casanova and Loris Marchal}, */ -/* institution = {LIP}, */ -/* title = {A Network Model for Simulation of Grid Application}, */ -/* number = {2002-40}, */ -/* month = {oct}, */ -/* year = {2002} */ -/* } */ -void surf_network_model_init_CM02(void) -{ - - if (surf_network_model) - return; - - surf_network_model_init_internal(); - net_define_callbacks(); - xbt_dynar_push(model_list, &surf_network_model); - network_solve = lmm_solve; - - xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 1.0); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor", - 1.0); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 0.0); -} - -/***************************************************************************/ -/* The models from Steven H. Low */ -/***************************************************************************/ -/* @article{Low03, */ -/* author={Steven H. Low}, */ -/* title={A Duality Model of {TCP} and Queue Management Algorithms}, */ -/* year={2003}, */ -/* journal={{IEEE/ACM} Transactions on Networking}, */ -/* volume={11}, number={4}, */ -/* } */ -void surf_network_model_init_Reno(void) -{ - if (surf_network_model) - return; - - surf_network_model_init_internal(); - net_define_callbacks(); - - xbt_dynar_push(model_list, &surf_network_model); - lmm_set_default_protocol_function(func_reno_f, func_reno_fp, - func_reno_fpi); - network_solve = lagrange_solve; - - xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor", - 0.92); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775); -} - - -void surf_network_model_init_Reno2(void) -{ - if (surf_network_model) - return; - - surf_network_model_init_internal(); - net_define_callbacks(); - - xbt_dynar_push(model_list, &surf_network_model); - lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp, - func_reno2_fpi); - network_solve = lagrange_solve; - - xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor", - 0.92); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S_parameter", - 8775); -} - -void surf_network_model_init_Vegas(void) -{ - if (surf_network_model) - return; - - surf_network_model_init_internal(); - net_define_callbacks(); - - xbt_dynar_push(model_list, &surf_network_model); - lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp, - func_vegas_fpi); - network_solve = lagrange_solve; - - xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor", - 0.92); - xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775); -} diff --git a/src/surf/network.hpp b/src/surf/network.hpp deleted file mode 100644 index 5acdb1216d..0000000000 --- a/src/surf/network.hpp +++ /dev/null @@ -1,153 +0,0 @@ -#include "surf.hpp" -#include "xbt/fifo.h" -#include "xbt/graph.h" -#include "surf_routing.hpp" - -#ifndef SURF_MODEL_NETWORK_H_ -#define SURF_MODEL_NETWORK_H_ - -/*********** - * Classes * - ***********/ -class NetworkCm02Model; -typedef NetworkCm02Model *NetworkCm02ModelPtr; - -class NetworkCm02Link; -typedef NetworkCm02Link *NetworkCm02LinkPtr; - -class NetworkCm02LinkLmm; -typedef NetworkCm02LinkLmm *NetworkCm02LinkLmmPtr; - -class NetworkCm02Action; -typedef NetworkCm02Action *NetworkCm02ActionPtr; - -class NetworkCm02ActionLmm; -typedef NetworkCm02ActionLmm *NetworkCm02ActionLmmPtr; - -/********* - * Tools * - *********/ -extern NetworkCm02ModelPtr surf_network_model; - -void net_define_callbacks(void); - -/********* - * Model * - *********/ -class NetworkCm02Model : public Model { -private: - void initialize(); -public: - NetworkCm02Model(int /*i*/) : Model("network") { - f_networkSolve = lmm_solve; - m_haveGap = false; - };//FIXME: add network clean interface - NetworkCm02Model(string name) : Model(name) { - this->initialize(); - } - NetworkCm02Model() : Model("network") { - this->initialize(); - } - ~NetworkCm02Model() { - if (p_maxminSystem) - lmm_system_free(p_maxminSystem); - if (p_actionHeap) - xbt_heap_free(p_actionHeap); - if (p_modifiedSet) - xbt_swag_free(p_modifiedSet); - } - //FIXME:NetworkCm02LinkPtr createResource(string name); - NetworkCm02LinkLmmPtr createResource(const char *name, - double bw_initial, - tmgr_trace_t bw_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_resource_state_t state_initial, - tmgr_trace_t state_trace, - e_surf_link_sharing_policy_t policy, - xbt_dict_t properties); - void updateActionsStateLazy(double now, double delta); - virtual void gapAppend(double /*size*/, const NetworkCm02LinkLmmPtr /*link*/, NetworkCm02ActionLmmPtr /*action*/) {}; - virtual ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst, - double size, double rate); - xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst); //FIXME: kill field? That is done by the routing nowadays - //FIXME: virtual void addTraces() =0; - void (*f_networkSolve)(lmm_system_t); - virtual double latencyFactor(double size); - virtual double bandwidthFactor(double size); - virtual double bandwidthConstraint(double rate, double bound, double size); - bool m_haveGap; -}; - -/************ - * Resource * - ************/ - -class NetworkCm02Link : virtual public Resource { -public: - NetworkCm02Link() : p_latEvent(NULL) {}; - NetworkCm02Link(NetworkCm02ModelPtr model, const char* name, xbt_dict_t properties) - : Resource(model, name, properties), p_latEvent(NULL) {}; - virtual double getBandwidth()=0; - virtual double getLatency(); - virtual bool isShared()=0; - /* Using this object with the public part of - model does not make sense */ - double m_latCurrent; - tmgr_trace_event_t p_latEvent; -}; - -class NetworkCm02LinkLmm : public ResourceLmm, public NetworkCm02Link { -public: - NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char* name, xbt_dict_t properties) - : ResourceLmm(), NetworkCm02Link(model, name, properties) {}; - NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props, - lmm_system_t system, - double constraint_value, - tmgr_history_t history, - e_surf_resource_state_t state_init, - tmgr_trace_t state_trace, - double metric_peak, - tmgr_trace_t metric_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_link_sharing_policy_t policy); - bool isShared(); - bool isUsed(); - double getBandwidth(); - void updateState(tmgr_trace_event_t event_type, double value, double date); -}; - - -/********** - * Action * - **********/ -class NetworkCm02Action : virtual public Action { -public: - NetworkCm02Action(ModelPtr model, double cost, bool failed) - : Action(model, cost, failed) {}; - double m_latency; - double m_latCurrent; - double m_weight; - double m_rate; - const char* p_senderLinkName; - double m_senderGap; - double m_senderSize; - xbt_fifo_item_t p_senderFifoItem; -#ifdef HAVE_LATENCY_BOUND_TRACKING - int m_latencyLimited; -#endif - -}; - -class NetworkCm02ActionLmm : public ActionLmm, public NetworkCm02Action { -public: - NetworkCm02ActionLmm(ModelPtr model, double cost, bool failed) - : Action(model, cost, failed), - ActionLmm(model, cost, failed), - NetworkCm02Action(model, cost, failed) {}; - void updateRemainingLazy(double now); - void recycle(); -}; - -#endif /* SURF_MODEL_NETWORK_H_ */ diff --git a/src/surf/network.cpp b/src/surf/network_cm02.cpp similarity index 95% rename from src/surf/network.cpp rename to src/surf/network_cm02.cpp index a158d7fd72..624b104b18 100644 --- a/src/surf/network.cpp +++ b/src/surf/network_cm02.cpp @@ -1,4 +1,4 @@ -#include "network.hpp" +#include "network_cm02.hpp" #include "maxmin_private.h" #include "simgrid/sg_config.h" @@ -7,8 +7,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf, "Logging specific to the SURF network module"); } -NetworkCm02ModelPtr surf_network_model = NULL; - double sg_sender_gap = 0.0; double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */ double sg_bandwidth_factor = 1.0; /* default value; can be set by model or from command line */ @@ -290,7 +288,7 @@ void NetworkCm02Model::initialize() m_haveGap = false; } -NetworkCm02LinkLmmPtr NetworkCm02Model::createResource(const char *name, +NetworkLinkPtr NetworkCm02Model::createResource(const char *name, double bw_initial, tmgr_trace_t bw_trace, double lat_initial, @@ -330,7 +328,7 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) lmm_constraint_t constraint = lmm_get_cnst_from_var(p_maxminSystem, action->p_variable, i); - NetworkCm02LinkPtr link = static_cast(lmm_constraint_id(constraint)); + NetworkCm02LinkLmmPtr link = static_cast(lmm_constraint_id(constraint)); TRACE_surf_link_set_utilization(link->m_name, action->p_category, (lmm_variable_getvalue(action->p_variable)* @@ -368,13 +366,6 @@ void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/) return; } -xbt_dynar_t NetworkCm02Model::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst) -{ - xbt_dynar_t route = NULL; - routing_platf->getRouteAndLatency(src, dst, &route, NULL); - return route; -} - ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate) { @@ -501,17 +492,7 @@ ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, return action; } -double NetworkCm02Model::latencyFactor(double /*size*/) { - return sg_latency_factor; -} -double NetworkCm02Model::bandwidthFactor(double /*size*/) { - return sg_bandwidth_factor; -} - -double NetworkCm02Model::bandwidthConstraint(double rate, double /*bound*/, double /*size*/) { - return rate; -} /************ * Resource * @@ -528,8 +509,7 @@ NetworkCm02LinkLmm::NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char *na tmgr_trace_t lat_trace, e_surf_link_sharing_policy_t policy) : Resource(model, name, props), - ResourceLmm(model, name, props, system, constraint_value, history, state_init, state_trace, metric_peak, metric_trace), - NetworkCm02Link(model, name, props) + NetworkLinkLmm(system, constraint_value, history, state_init, state_trace, metric_peak, metric_trace) { m_latCurrent = lat_initial; if (lat_trace) @@ -539,25 +519,7 @@ NetworkCm02LinkLmm::NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char *na lmm_constraint_shared(p_constraint); } -bool NetworkCm02LinkLmm::isUsed() -{ - return lmm_constraint_used(p_model->p_maxminSystem, p_constraint); -} - -double NetworkCm02Link::getLatency() -{ - return m_latCurrent; -} -double NetworkCm02LinkLmm::getBandwidth() -{ - return p_power.peak * p_power.scale; -} - -bool NetworkCm02LinkLmm::isShared() -{ - return lmm_constraint_is_shared(p_constraint); -} void NetworkCm02LinkLmm::updateState(tmgr_trace_event_t event_type, double value, double date) diff --git a/src/surf/network_cm02.hpp b/src/surf/network_cm02.hpp new file mode 100644 index 0000000000..bd8821aca5 --- /dev/null +++ b/src/surf/network_cm02.hpp @@ -0,0 +1,93 @@ +#include "network_interface.hpp" +#include "xbt/fifo.h" +#include "xbt/graph.h" + +#ifndef SURF_NETWORK_CM02_HPP_ +#define SURF_NETWORK_CM02_HPP_ + +/*********** + * Classes * + ***********/ +class NetworkCm02Model; +typedef NetworkCm02Model *NetworkCm02ModelPtr; + +class NetworkCm02LinkLmm; +typedef NetworkCm02LinkLmm *NetworkCm02LinkLmmPtr; + +class NetworkCm02ActionLmm; +typedef NetworkCm02ActionLmm *NetworkCm02ActionLmmPtr; + +/********* + * Tools * + *********/ + +void net_define_callbacks(void); + +/********* + * Model * + *********/ +class NetworkCm02Model : public NetworkModel { +private: + void initialize(); +public: + NetworkCm02Model(int /*i*/) : NetworkModel("network") { + f_networkSolve = lmm_solve; + m_haveGap = false; + };//FIXME: add network clean interface + NetworkCm02Model(string name) : NetworkModel(name) { + this->initialize(); + } + NetworkCm02Model() : NetworkModel("network") { + this->initialize(); + } + ~NetworkCm02Model() { + } + NetworkLinkPtr createResource(const char *name, + double bw_initial, + tmgr_trace_t bw_trace, + double lat_initial, + tmgr_trace_t lat_trace, + e_surf_resource_state_t state_initial, + tmgr_trace_t state_trace, + e_surf_link_sharing_policy_t policy, + xbt_dict_t properties); + void updateActionsStateLazy(double now, double delta); + void gapAppend(double /*size*/, const NetworkCm02LinkLmmPtr /*link*/, NetworkCm02ActionLmmPtr /*action*/) {}; + ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst, + double size, double rate); +}; + +/************ + * Resource * + ************/ + +class NetworkCm02LinkLmm : public NetworkLinkLmm { +public: + NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props, + lmm_system_t system, + double constraint_value, + tmgr_history_t history, + e_surf_resource_state_t state_init, + tmgr_trace_t state_trace, + double metric_peak, + tmgr_trace_t metric_trace, + double lat_initial, + tmgr_trace_t lat_trace, + e_surf_link_sharing_policy_t policy); + void updateState(tmgr_trace_event_t event_type, double value, double date); +}; + + +/********** + * Action * + **********/ + +class NetworkCm02ActionLmm : public NetworkActionLmm { +public: + NetworkCm02ActionLmm(ModelPtr model, double cost, bool failed) + : Action(model, cost, failed) {}; + void updateRemainingLazy(double now); + void recycle(); +}; + +#endif /* SURF_NETWORK_CM02_HPP_ */ diff --git a/src/surf/network_constant.hpp b/src/surf/network_constant.hpp index dc1c41606b..f9b8605333 100644 --- a/src/surf/network_constant.hpp +++ b/src/surf/network_constant.hpp @@ -1,4 +1,4 @@ -#include "network.hpp" +#include "network_cm02.hpp" #ifndef NETWORK_CONSTANT_HPP_ #define NETWORK_CONSTANT_HPP_ diff --git a/src/surf/network_smpi.hpp b/src/surf/network_smpi.hpp index 54b2b9bd95..e16ba5e2c0 100644 --- a/src/surf/network_smpi.hpp +++ b/src/surf/network_smpi.hpp @@ -1,4 +1,4 @@ -#include "network.hpp" +#include "network_cm02.hpp" /*********** * Classes * diff --git a/src/surf/surf.cpp b/src/surf/surf.cpp index ac32b8d7d9..4c1ff82683 100644 --- a/src/surf/surf.cpp +++ b/src/surf/surf.cpp @@ -1,7 +1,7 @@ #include "surf_private.h" #include "surf.hpp" -#include "network.hpp" -#include "cpu.hpp" +#include "network_interface.hpp" +#include "cpu_interface.hpp" #include "workstation.hpp" #include "vm_workstation.hpp" #include "simix/smx_host_private.h" @@ -314,7 +314,7 @@ static XBT_INLINE void surf_cpu_free(void *r) static XBT_INLINE void surf_link_free(void *r) { - delete dynamic_cast(static_cast(r)); + delete dynamic_cast(static_cast(r)); } static XBT_INLINE void surf_workstation_free(void *r) @@ -717,15 +717,13 @@ void Resource::turnOff() } } -ResourceLmm::ResourceLmm(surf_model_t model, const char *name, xbt_dict_t props, - lmm_system_t system, +ResourceLmm::ResourceLmm(lmm_system_t system, double constraint_value, tmgr_history_t history, e_surf_resource_state_t state_init, tmgr_trace_t state_trace, double metric_peak, tmgr_trace_t metric_trace) - : Resource(model, name, props) { p_constraint = lmm_constraint_new(system, this, constraint_value); p_stateCurrent = state_init; diff --git a/src/surf/surf.hpp b/src/surf/surf.hpp index 8415040197..8f4d918410 100644 --- a/src/surf/surf.hpp +++ b/src/surf/surf.hpp @@ -208,14 +208,13 @@ public: ResourceLmm() : p_constraint(NULL) { p_power.event = NULL; }; - ResourceLmm(surf_model_t model, const char *name, xbt_dict_t props, - lmm_system_t system, - double constraint_value, - tmgr_history_t history, - e_surf_resource_state_t state_init, - tmgr_trace_t state_trace, - double metric_peak, - tmgr_trace_t metric_trace); + ResourceLmm(lmm_system_t system, + double constraint_value, + tmgr_history_t history, + e_surf_resource_state_t state_init, + tmgr_trace_t state_trace, + double metric_peak, + tmgr_trace_t metric_trace); ~ResourceLmm() { }; lmm_constraint_t p_constraint; diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_c_bindings.cpp similarity index 98% rename from src/surf/surf_interface.cpp rename to src/surf/surf_c_bindings.cpp index f2ac787a7d..4882897af0 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_c_bindings.cpp @@ -1,7 +1,7 @@ #include "surf.hpp" #include "workstation.hpp" #include "vm_workstation.hpp" -#include "network.hpp" +#include "network_interface.hpp" #include "surf_routing_cluster.hpp" #include "instr/instr_private.h" @@ -220,7 +220,7 @@ void *surf_as_cluster_get_backbone(AS_t as){ } void surf_as_cluster_set_backbone(AS_t as, void* backbone){ - static_cast(as)->p_backbone = dynamic_cast(static_cast(backbone)); + static_cast(as)->p_backbone = dynamic_cast(static_cast(backbone)); } const char *surf_model_name(surf_model_t model){ @@ -426,15 +426,15 @@ void surf_vm_workstation_set_affinity(surf_resource_t resource, surf_resource_t } int surf_network_link_is_shared(surf_cpp_resource_t link){ - return dynamic_cast(link)->isShared(); + return dynamic_cast(link)->isShared(); } double surf_network_link_get_bandwidth(surf_cpp_resource_t link){ - return dynamic_cast(link)->getBandwidth(); + return dynamic_cast(link)->getBandwidth(); } double surf_network_link_get_latency(surf_cpp_resource_t link){ - return dynamic_cast(link)->getLatency(); + return dynamic_cast(link)->getLatency(); } xbt_dict_t surf_storage_get_content(surf_resource_t resource){ diff --git a/src/surf/surf_routing_cluster.cpp b/src/surf/surf_routing_cluster.cpp index 33bbf7309d..ec647c837b 100644 --- a/src/surf/surf_routing_cluster.cpp +++ b/src/surf/surf_routing_cluster.cpp @@ -40,7 +40,7 @@ void AsCluster::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_pl if((src->m_id == dst->m_id) && info.loopback_link ){ xbt_dynar_push_as(route->link_list, void *, info.loopback_link); if (lat) - *lat += dynamic_cast(static_cast(info.loopback_link))->getLatency(); + *lat += dynamic_cast(static_cast(info.loopback_link))->getLatency(); return; } @@ -51,7 +51,7 @@ void AsCluster::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_pl if (info.link_up) { // link up xbt_dynar_push_as(route->link_list, void *, info.link_up); if (lat) - *lat += dynamic_cast(static_cast(info.link_up))->getLatency(); + *lat += dynamic_cast(static_cast(info.link_up))->getLatency(); } } @@ -67,7 +67,7 @@ void AsCluster::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_pl if (info.link_down) { // link down xbt_dynar_push_as(route->link_list, void *, info.link_down); if (lat) - *lat += dynamic_cast(static_cast(info.link_down))->getLatency(); + *lat += dynamic_cast(static_cast(info.link_down))->getLatency(); } if (info.limiter_link) // limiter for receiver diff --git a/src/surf/surf_routing_cluster.hpp b/src/surf/surf_routing_cluster.hpp index 90d13787cb..b134050a02 100644 --- a/src/surf/surf_routing_cluster.hpp +++ b/src/surf/surf_routing_cluster.hpp @@ -1,5 +1,5 @@ #include "surf_routing_none.hpp" -#include "network.hpp" +#include "network_interface.hpp" #ifndef SURF_ROUTING_CLUSTER_HPP_ #define SURF_ROUTING_CLUSTER_HPP_ @@ -33,7 +33,7 @@ public: int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */ int parseAS(RoutingEdgePtr elm); - NetworkCm02LinkPtr p_backbone; + NetworkLinkPtr p_backbone; void *p_loopback; RoutingEdgePtr p_router; }; diff --git a/src/surf/surf_routing_dijkstra.cpp b/src/surf/surf_routing_dijkstra.cpp index f5f720640d..9cececcbce 100644 --- a/src/surf/surf_routing_dijkstra.cpp +++ b/src/surf/surf_routing_dijkstra.cpp @@ -5,7 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "surf_routing_dijkstra.hpp" -#include "network.hpp" +#include "network_interface.hpp" /* Global vars */ extern routing_platf_t routing_platf; @@ -258,7 +258,7 @@ void AsDijkstra::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_p xbt_dynar_foreach(links, cpt, link) { xbt_dynar_unshift(route->link_list, &link); if (lat) - *lat += dynamic_cast(static_cast(link))->getLatency(); + *lat += dynamic_cast(static_cast(link))->getLatency(); } } @@ -366,7 +366,7 @@ void AsDijkstra::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_p xbt_dynar_foreach(links, cpt, link) { xbt_dynar_insert_at(route->link_list, pos, &link); if (lat) - *lat += dynamic_cast(static_cast(link))->getLatency(); + *lat += dynamic_cast(static_cast(link))->getLatency(); pos++; } } @@ -375,7 +375,7 @@ void AsDijkstra::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_p xbt_dynar_foreach(links, cpt, link) { xbt_dynar_unshift(route->link_list, &link); if (lat) - *lat += dynamic_cast(static_cast(link))->getLatency(); + *lat += dynamic_cast(static_cast(link))->getLatency(); } size++; } diff --git a/src/surf/surf_routing_floyd.cpp b/src/surf/surf_routing_floyd.cpp index 5c97ba5450..9c578379b0 100644 --- a/src/surf/surf_routing_floyd.cpp +++ b/src/surf/surf_routing_floyd.cpp @@ -5,7 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "surf_routing_floyd.hpp" -#include "network.hpp" +#include "network_interface.hpp" extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_floyd, surf, "Routing part of surf"); @@ -123,7 +123,7 @@ void AsFloyd::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_plat xbt_dynar_foreach(links, cpt, link) { xbt_dynar_push_as(res->link_list, sg_routing_link_t, link); if (lat) - *lat += dynamic_cast(static_cast(link))->getLatency(); + *lat += dynamic_cast(static_cast(link))->getLatency(); } prev_dst_gw = e_route->gw_dst; diff --git a/src/surf/surf_routing_full.cpp b/src/surf/surf_routing_full.cpp index 835583fe96..420f237a4b 100644 --- a/src/surf/surf_routing_full.cpp +++ b/src/surf/surf_routing_full.cpp @@ -5,7 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "surf_routing_full.hpp" -#include "network.hpp" +#include "network_interface.hpp" extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_full, surf, "Routing part of surf"); @@ -127,7 +127,7 @@ void AsFull::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf xbt_dynar_foreach(e_route->link_list, cpt, link) { xbt_dynar_push(res->link_list, &link); if (lat) - *lat += dynamic_cast(static_cast(link))->getLatency(); + *lat += dynamic_cast(static_cast(link))->getLatency(); } } } diff --git a/src/surf/surf_routing_generic.cpp b/src/surf/surf_routing_generic.cpp index 6debb30f0c..09bda40bd2 100644 --- a/src/surf/surf_routing_generic.cpp +++ b/src/surf/surf_routing_generic.cpp @@ -7,7 +7,7 @@ #include "simgrid/platf_interface.h" // platform creation API internal interface #include "surf_routing_generic.hpp" -#include "network.hpp" +#include "network_interface.hpp" #include "xbt/graph.h" extern "C" { @@ -323,7 +323,7 @@ sg_platf_route_cbarg_t AsGeneric::getBypassRoute(RoutingEdgePtr src, sg_platf_route_cbarg_t new_e_route = NULL; if (e_route_bypass) { - NetworkCm02LinkPtr link; + NetworkLinkPtr link; unsigned int cpt = 0; new_e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1); new_e_route->gw_src = e_route_bypass->gw_src; diff --git a/src/surf/surf_routing_vivaldi.cpp b/src/surf/surf_routing_vivaldi.cpp index 00e0552d8f..c55d9b035a 100644 --- a/src/surf/surf_routing_vivaldi.cpp +++ b/src/surf/surf_routing_vivaldi.cpp @@ -1,4 +1,5 @@ #include "surf_routing_vivaldi.hpp" +#include "network_interface.hpp" extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf"); @@ -42,7 +43,7 @@ void AsVivaldi::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_pl if(info.link_up) { // link up xbt_dynar_push_as(route->link_list, void*, info.link_up); if (lat) - *lat += dynamic_cast(static_cast(info.link_up))->getLatency(); + *lat += dynamic_cast(static_cast(info.link_up))->getLatency(); } } src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_src_name, COORD_HOST_LEVEL); @@ -64,7 +65,7 @@ void AsVivaldi::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_pl if(info.link_down) { // link down xbt_dynar_push_as(route->link_list,void*,info.link_down); if (lat) - *lat += dynamic_cast(static_cast(info.link_down))->getLatency(); + *lat += dynamic_cast(static_cast(info.link_down))->getLatency(); } } dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_dst_name, COORD_HOST_LEVEL); diff --git a/src/surf/surf_routing_vivaldi.hpp b/src/surf/surf_routing_vivaldi.hpp index c71cb008a6..a40350ef28 100644 --- a/src/surf/surf_routing_vivaldi.hpp +++ b/src/surf/surf_routing_vivaldi.hpp @@ -1,5 +1,4 @@ #include "surf_routing_generic.hpp" -#include "network.hpp" #ifndef SURF_ROUTING_VIVALDI_HPP_ #define SURF_ROUTING_VIVALDI_HPP_ diff --git a/src/surf/workstation.hpp b/src/surf/workstation.hpp index 568f60c736..f70781bae7 100644 --- a/src/surf/workstation.hpp +++ b/src/surf/workstation.hpp @@ -1,7 +1,7 @@ #include "surf.hpp" #include "storage.hpp" -#include "cpu.hpp" -#include "network.hpp" +#include "cpu_interface.hpp" +#include "network_interface.hpp" #ifndef WORKSTATION_HPP_ #define WORKSTATION_HPP_ @@ -100,7 +100,7 @@ public: xbt_dynar_t p_storage; RoutingEdgePtr p_netElm; CpuPtr p_cpu; - NetworkCm02LinkPtr p_network; + NetworkLinkPtr p_network; xbt_dynar_t getVms(); diff --git a/src/surf/workstation_ptask_L07.cpp b/src/surf/workstation_ptask_L07.cpp index 383ff7785b..926990f758 100644 --- a/src/surf/workstation_ptask_L07.cpp +++ b/src/surf/workstation_ptask_L07.cpp @@ -5,7 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "workstation_ptask_L07.hpp" -#include "cpu.hpp" +#include "cpu_interface.hpp" #include "surf_routing.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_workstation); @@ -20,11 +20,11 @@ WorkstationL07Model::WorkstationL07Model() : WorkstationModel("Workstation ptask surf_workstation_model = NULL; surf_network_model = new NetworkL07Model(); surf_cpu_model_pm = new CpuL07Model(); - routing_model_create(p_networkModel->createResource("__loopback__", + routing_model_create(static_cast(surf_network_model->createResource("__loopback__", 498000000, NULL, 0.000015, NULL, SURF_RESOURCE_ON, NULL, - SURF_LINK_FATPIPE, NULL)); + SURF_LINK_FATPIPE, NULL))); p_cpuModel = surf_cpu_model_pm; } @@ -328,7 +328,7 @@ ResourcePtr CpuL07Model::createResource(const char *name, double power_scale, return cpu;//FIXME:xbt_lib_get_elm_or_null(host_lib, name); } -ResourcePtr NetworkL07Model::createResource(const char *name, +NetworkLinkPtr NetworkL07Model::createResource(const char *name, double bw_initial, tmgr_trace_t bw_trace, double lat_initial, @@ -475,7 +475,7 @@ CpuL07::CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t props) } LinkL07::LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props) - : Resource(model, name, props), NetworkCm02LinkLmm(model, name, props) { + : Resource(model, name, props), NetworkLinkLmm() { } diff --git a/src/surf/workstation_ptask_L07.hpp b/src/surf/workstation_ptask_L07.hpp index 19ca9864bc..eef274c826 100644 --- a/src/surf/workstation_ptask_L07.hpp +++ b/src/surf/workstation_ptask_L07.hpp @@ -56,7 +56,7 @@ public: xbt_dynar_t getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst); ActionPtr communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, double size, double rate); void addTraces(); - NetworkL07ModelPtr p_networkModel; + NetworkModelPtr p_networkModel; }; class CpuL07Model : public CpuModel { @@ -74,11 +74,11 @@ public: WorkstationL07ModelPtr p_workstationModel; }; -class NetworkL07Model : public NetworkCm02Model { +class NetworkL07Model : public NetworkModel { public: - NetworkL07Model() : NetworkCm02Model(0) {}; + NetworkL07Model() : NetworkModel() {}; ~NetworkL07Model() {surf_network_model = NULL;}; - ResourcePtr createResource(const char *name, + NetworkLinkPtr createResource(const char *name, double bw_initial, tmgr_trace_t bw_trace, double lat_initial, @@ -135,7 +135,7 @@ public: double m_powerCurrent; }; -class LinkL07 : public NetworkCm02LinkLmm { +class LinkL07 : public NetworkLinkLmm { public: LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props); ~LinkL07(){