From: pini Date: Mon, 6 Dec 2010 13:54:44 +0000 (+0000) Subject: Added sender-side gaps (only activated by default in the SMPI network model, use... X-Git-Tag: v3.6_beta2~909 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/e43a611d100f63b3dde3d4e551da1c9520892492 Added sender-side gaps (only activated by default in the SMPI network model, use --cfg=network/sender_gap:?? to override). git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9014 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/surf/network.c b/src/surf/network.c index e35c649e3d..158c4b388b 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -15,6 +15,7 @@ surf_model_t surf_network_model = NULL; static lmm_system_t network_maxmin_system = NULL; static void (*network_solve) (lmm_system_t) = 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 */ double sg_weight_S_parameter = 0.0; /* default value; can be set by model or from command line */ @@ -22,6 +23,59 @@ double sg_weight_S_parameter = 0.0; /* default value; can be set by model or double sg_tcp_gamma = 0.0; int sg_network_fullduplex = 0; +xbt_dict_t gap_lookup = NULL; + +static double net_get_link_bandwidth(const void *link); + +static void 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(); + } + 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 = last_action->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 gap_remove(surf_action_network_CM02_t action) { + xbt_fifo_t fifo; + size_t size; + + if(sg_sender_gap > 0.0) { + 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_size(gap_lookup); + if(size == 0) { + xbt_dict_free(&gap_lookup); + } + } + } +} /******************************************************************************/ /* Factors callbacks */ @@ -410,11 +464,13 @@ static void net_update_actions_state(double now, double delta) action->generic_action.finish = surf_get_clock(); surf_network_model->action_state_set((surf_action_t) action, SURF_ACTION_DONE); + gap_remove(action); } else if ((action->generic_action.max_duration != NO_MAX_DURATION) && (action->generic_action.max_duration <= 0)) { action->generic_action.finish = surf_get_clock(); surf_network_model->action_state_set((surf_action_t) action, SURF_ACTION_DONE); + gap_remove(action); } } @@ -609,6 +665,12 @@ static surf_action_t net_communicate(const char *src_name, (*bandwidth_constraint_callback) (action->rate, bandwidth_bound, size); + link = *(link_CM02_t*)xbt_dynar_get_ptr(route, 0); + gap_append(size, link, action); + DEBUG5("Comm %p: %s -> %s gap=%f (lat=%f)", + action, src_name, dst_name, action->sender.gap, action->latency); + + /* LARGE PLATFORMS HACK: lmm_variable_new(..., total_route_size) */ if (back_route != NULL) { @@ -803,6 +865,7 @@ void surf_network_model_init_SMPI(const char *filename) xbt_dynar_push(model_list, &surf_network_model); network_solve = lmm_solve; + xbt_cfg_setdefault_double(_surf_cfg_set, "network/sender_gap", 10e-6); xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775); update_model_description(surf_network_model_description, diff --git a/src/surf/network_private.h b/src/surf/network_private.h index b03750e1d8..363bb186c6 100644 --- a/src/surf/network_private.h +++ b/src/surf/network_private.h @@ -9,6 +9,7 @@ #include "surf_private.h" #include "xbt/dict.h" +#include "xbt/fifo.h" typedef struct network_link_CM02 { s_surf_resource_lmm_t lmm_resource; /* must remain first to be added to a trace */ @@ -27,6 +28,12 @@ typedef struct surf_action_network_CM02 { double weight; lmm_variable_t variable; double rate; + struct { + const char* link_name; + double gap; + double size; + xbt_fifo_item_t fifo_item; + } sender; #ifdef HAVE_LATENCY_BOUND_TRACKING int latency_limited; #endif diff --git a/src/surf/surf_config.c b/src/surf/surf_config.c index f43274849d..e0b90daa03 100644 --- a/src/surf/surf_config.c +++ b/src/surf/surf_config.c @@ -144,6 +144,11 @@ static void _surf_cfg_cb__maxmin_precision(const char* name, int pos) sg_maxmin_precision = xbt_cfg_get_double(_surf_cfg_set, name); } +static void _surf_cfg_cb__sender_gap(const char* name, int pos) +{ + sg_sender_gap = xbt_cfg_get_double(_surf_cfg_set, name); +} + static void _surf_cfg_cb__latency_factor(const char *name, int pos) { sg_latency_factor = xbt_cfg_get_double(_surf_cfg_set, name); @@ -285,6 +290,13 @@ void surf_config_init(int *argc, char **argv) xbt_cfg_set_double(_surf_cfg_set, "maxmin/precision", 0.00001); /* The parameters of network models */ + + double_default_value = 0.0; + xbt_cfg_register(&_surf_cfg_set, "network/sender_gap", + "Minimum gap between two overlapping sends", + xbt_cfgelm_double, &double_default_value, 1, 1, + _surf_cfg_cb__sender_gap, NULL); + double_default_value = 1.0; xbt_cfg_register(&_surf_cfg_set, "network/latency_factor", "Correction factor to apply to the provided latency (default value set by network model)", diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index 03a70abdc1..cb7b4c4ee0 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -18,6 +18,7 @@ /* user-visible parameters */ extern double sg_tcp_gamma; +extern double sg_sender_gap; extern double sg_latency_factor; extern double sg_bandwidth_factor; extern double sg_weight_S_parameter;