From 9070feda0eec90cf10d562ece376fcd6a777ff7c Mon Sep 17 00:00:00 2001 From: alegrand Date: Sat, 15 Jan 2005 00:46:32 +0000 Subject: [PATCH 1/1] Now surf communications come with a maximum rate. Also fixed a bug in network.c (was using 1 instead of SG_TCP_CTE_GAMMA when updating link characteristics) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@758 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/include/surf/surf.h | 22 ++++---- src/surf/cpu.c | 7 +-- src/surf/network.c | 26 ++++++--- src/surf/network_private.h | 1 + src/surf/workstation.c | 24 +++++---- src/surf/workstation_KCCFLN05.c | 96 +++++++++++++++++++-------------- 6 files changed, 101 insertions(+), 75 deletions(-) diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 6223c5e059..6690309406 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -69,6 +69,9 @@ typedef struct surf_resource_public { e_surf_action_state_t state); void (*action_set_data) (surf_action_t action, void *data); + void (*suspend) (surf_action_t action); + void (*resume) (surf_action_t action); + int (*is_suspended) (surf_action_t action); const char *name; } s_surf_resource_public_t, *surf_resource_public_t; @@ -95,9 +98,6 @@ typedef struct surf_cpu_resource_extension_private typedef struct surf_cpu_resource_extension_public { surf_action_t(*execute) (void *cpu, double size); surf_action_t(*sleep) (void *cpu, double duration); - void (*suspend) (surf_action_t action); - void (*resume) (surf_action_t action); - int (*is_suspended) (surf_action_t action); e_surf_cpu_state_t(*get_state) (void *cpu); } s_surf_cpu_resource_extension_public_t, *surf_cpu_resource_extension_public_t; @@ -114,10 +114,8 @@ void surf_cpu_resource_init_Cas01(const char *filename); typedef struct surf_network_resource_extension_private *surf_network_resource_extension_private_t; typedef struct surf_network_resource_extension_public { - surf_action_t(*communicate) (void *src, void *dst, double size); - void (*suspend) (surf_action_t action); - void (*resume) (surf_action_t action); - int (*is_suspended) (surf_action_t action); + surf_action_t(*communicate) (void *src, void *dst, double size, + double max_rate); } s_surf_network_resource_extension_public_t, *surf_network_resource_extension_public_t; @@ -136,12 +134,10 @@ typedef struct surf_workstation_resource_extension_private typedef struct surf_workstation_resource_extension_public { surf_action_t(*execute) (void *workstation, double size); surf_action_t(*sleep) (void *workstation, double duration); - void (*suspend) (surf_action_t action); - void (*resume) (surf_action_t action); - int (*is_suspended) (surf_action_t action); - e_surf_cpu_state_t(*get_state) (void *workstation); - surf_action_t(*communicate) (void *workstation_src, - void *workstation_dst, double size); + e_surf_cpu_state_t(*get_state) (void *workstation); + surf_action_t(*communicate) (void *workstation_src, + void *workstation_dst, double size, + double max_rate); } s_surf_workstation_resource_extension_public_t, *surf_workstation_resource_extension_public_t; diff --git a/src/surf/cpu.c b/src/surf/cpu.c index 1f79ef6c25..d748240560 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -331,11 +331,12 @@ static void surf_cpu_resource_init_internal(void) update_resource_state; surf_cpu_resource->common_private->finalize = finalize; + surf_cpu_resource->common_public->suspend = action_suspend; + surf_cpu_resource->common_public->resume = action_resume; + surf_cpu_resource->common_public->is_suspended = action_is_suspended; + surf_cpu_resource->extension_public->execute = execute; surf_cpu_resource->extension_public->sleep = action_sleep; - surf_cpu_resource->extension_public->suspend = action_suspend; - surf_cpu_resource->extension_public->resume = action_resume; - surf_cpu_resource->extension_public->is_suspended = action_is_suspended; surf_cpu_resource->extension_public->get_state = get_state; diff --git a/src/surf/network.c b/src/surf/network.c index 56b4dd8d2b..278237da76 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -339,8 +339,12 @@ static void update_resource_state(void *id, while (lmm_get_var_from_cnst(maxmin_system, nw_link->constraint, &var)) { action = lmm_variable_id(var); action->lat_current += delta; - lmm_update_variable_bound(maxmin_system, var, - 1 / (action->lat_current)); + if(action->rate<0) + lmm_update_variable_bound(maxmin_system, action->variable, + SG_TCP_CTE_GAMMA / action->lat_current); + else + lmm_update_variable_bound(maxmin_system, action->variable, + min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current)); } } else if (event_type == nw_link->state_event) { if (value > 0) @@ -355,7 +359,7 @@ static void update_resource_state(void *id, return; } -static surf_action_t communicate(void *src, void *dst, double size) +static surf_action_t communicate(void *src, void *dst, double size, double rate) { surf_action_network_t action = NULL; network_card_t card_src = src; @@ -378,6 +382,7 @@ static surf_action_t communicate(void *src, void *dst, double size) surf_network_resource->common_public->states.running_action_set; xbt_swag_insert(action, action->generic_action.state_set); + action->rate = rate; action->latency = 0.0; for (i = 0; i < route_size; i++) @@ -391,8 +396,12 @@ static surf_action_t communicate(void *src, void *dst, double size) action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0, route_size); - lmm_update_variable_bound(maxmin_system, action->variable, - SG_TCP_CTE_GAMMA / action->lat_current); + if(action->rate<0) + lmm_update_variable_bound(maxmin_system, action->variable, + SG_TCP_CTE_GAMMA / action->lat_current); + else + lmm_update_variable_bound(maxmin_system, action->variable, + min(action->rate,SG_TCP_CTE_GAMMA / action->lat_current)); for (i = 0; i < route_size; i++) lmm_expand(maxmin_system, route[i]->constraint, action->variable, 1.0); @@ -493,10 +502,11 @@ static void surf_network_resource_init_internal(void) update_resource_state; surf_network_resource->common_private->finalize = finalize; + surf_network_resource->common_public->suspend = action_suspend; + surf_network_resource->common_public->resume = action_resume; + surf_network_resource->common_public->is_suspended = action_is_suspended; + surf_network_resource->extension_public->communicate = communicate; - surf_network_resource->extension_public->suspend = action_suspend; - surf_network_resource->extension_public->resume = action_resume; - surf_network_resource->extension_public->is_suspended = action_is_suspended; network_link_set = xbt_dict_new(); network_card_set = xbt_dict_new(); diff --git a/src/surf/network_private.h b/src/surf/network_private.h index 898857becd..c9dd0b54e8 100644 --- a/src/surf/network_private.h +++ b/src/surf/network_private.h @@ -42,6 +42,7 @@ typedef struct surf_action_network { double latency; double lat_current; lmm_variable_t variable; + double rate; int suspended; network_card_t src; network_card_t dst; diff --git a/src/surf/workstation.c b/src/surf/workstation.c index 4a5cb42af4..0bfebdbe3b 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -128,36 +128,37 @@ static surf_action_t action_sleep(void *workstation, double duration) static void action_suspend(surf_action_t action) { if(action->resource_type==(surf_resource_t)surf_network_resource) - surf_network_resource->extension_public->suspend(action); + surf_network_resource->common_public->suspend(action); else if(action->resource_type==(surf_resource_t)surf_cpu_resource) - surf_cpu_resource->extension_public->suspend(action); + surf_cpu_resource->common_public->suspend(action); else DIE_IMPOSSIBLE; } static void action_resume(surf_action_t action) { if(action->resource_type==(surf_resource_t)surf_network_resource) - surf_network_resource->extension_public->resume(action); + surf_network_resource->common_public->resume(action); else if(action->resource_type==(surf_resource_t)surf_cpu_resource) - surf_cpu_resource->extension_public->resume(action); + surf_cpu_resource->common_public->resume(action); else DIE_IMPOSSIBLE; } static int action_is_suspended(surf_action_t action) { if(action->resource_type==(surf_resource_t)surf_network_resource) - return surf_network_resource->extension_public->is_suspended(action); + return surf_network_resource->common_public->is_suspended(action); if(action->resource_type==(surf_resource_t)surf_cpu_resource) - return surf_cpu_resource->extension_public->is_suspended(action); + return surf_cpu_resource->common_public->is_suspended(action); DIE_IMPOSSIBLE; } static surf_action_t communicate(void *workstation_src, - void *workstation_dst, double size) + void *workstation_dst, double size, + double rate) { return surf_network_resource->extension_public-> communicate(((workstation_t) workstation_src)->network_card, - ((workstation_t) workstation_dst)->network_card, size); + ((workstation_t) workstation_dst)->network_card, size, rate); } static e_surf_cpu_state_t get_state(void *workstation) @@ -230,11 +231,12 @@ static void surf_workstation_resource_init_internal(void) update_resource_state; surf_workstation_resource->common_private->finalize = finalize; + surf_workstation_resource->common_public->suspend = action_suspend; + surf_workstation_resource->common_public->resume = action_resume; + surf_workstation_resource->common_public->is_suspended = action_is_suspended; + surf_workstation_resource->extension_public->execute = execute; surf_workstation_resource->extension_public->sleep = action_sleep; - surf_workstation_resource->extension_public->suspend = action_suspend; - surf_workstation_resource->extension_public->resume = action_resume; - surf_workstation_resource->extension_public->is_suspended = action_is_suspended; surf_workstation_resource->extension_public->get_state = get_state; surf_workstation_resource->extension_public->communicate = communicate; diff --git a/src/surf/workstation_KCCFLN05.c b/src/surf/workstation_KCCFLN05.c index f3c9115c39..fc740c24ca 100644 --- a/src/surf/workstation_KCCFLN05.c +++ b/src/surf/workstation_KCCFLN05.c @@ -423,7 +423,8 @@ static void update_actions_network_KCCFLN05_state(double now, double delta) return; } -static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size) +static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size, + double rate) { surf_action_network_KCCFLN05_t action = NULL; workstation_KCCFLN05_t card_src = src; @@ -446,8 +447,12 @@ static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size) xbt_swag_insert(action, action->generic_action.state_set); - action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, -1.0, - route->size); + if(rate>0) + action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, rate, + route->size); + else + action->variable = lmm_variable_new(maxmin_system_network_KCCFLN05, action, 1.0, -1.0, + route->size); for (i = 0; i < route->size; i++) lmm_expand(maxmin_system_network_KCCFLN05, route->links[i]->constraint, @@ -462,6 +467,23 @@ static surf_action_t communicate_KCCFLN05(void *src, void *dst, double size) return (surf_action_t) action; } +static void network_KCCFLN05_action_suspend(surf_action_t action) +{ + lmm_update_variable_weight(maxmin_system_network_KCCFLN05, + ((surf_action_network_KCCFLN05_t) action)->variable, 0.0); +} + +static void network_KCCFLN05_action_resume(surf_action_t action) +{ + lmm_update_variable_weight(maxmin_system_network_KCCFLN05, + ((surf_action_network_KCCFLN05_t) action)->variable, 1.0); +} + +static int network_KCCFLN05_action_is_suspended(surf_action_t action) +{ + return (lmm_get_variable_weight(((surf_action_network_KCCFLN05_t) action)->variable) == 0.0); +} + /***************** CPU ****************/ static void action_cpu_KCCFLN05_free(surf_action_t action) { @@ -618,33 +640,19 @@ static surf_action_t execute_KCCFLN05(void *cpu, double size) static void cpu_KCCFLN05_action_suspend(surf_action_t action) { - if(action->resource_type==(surf_resource_t)surf_network_resource) - lmm_update_variable_weight(maxmin_system_network_KCCFLN05, - ((surf_action_network_KCCFLN05_t) action)->variable, 0.0); - else if(action->resource_type==(surf_resource_t)surf_cpu_resource) - lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05, - ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0); - else DIE_IMPOSSIBLE; + lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05, + ((surf_action_cpu_KCCFLN05_t) action)->variable, 0.0); } static void cpu_KCCFLN05_action_resume(surf_action_t action) { - if(action->resource_type==(surf_resource_t)surf_network_resource) - lmm_update_variable_weight(maxmin_system_network_KCCFLN05, - ((surf_action_network_KCCFLN05_t) action)->variable, 1.0); - else if(action->resource_type==(surf_resource_t)surf_cpu_resource) - lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05, - ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0); - else DIE_IMPOSSIBLE; + lmm_update_variable_weight(maxmin_system_cpu_KCCFLN05, + ((surf_action_cpu_KCCFLN05_t) action)->variable, 1.0); } static int cpu_KCCFLN05_action_is_suspended(surf_action_t action) { - if(action->resource_type==(surf_resource_t)surf_network_resource) - return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0); - if(action->resource_type==(surf_resource_t)surf_cpu_resource) - return (lmm_get_variable_weight(((surf_action_network_KCCFLN05_t) action)->variable) == 0.0); - DIE_IMPOSSIBLE; + return (lmm_get_variable_weight(((surf_action_cpu_KCCFLN05_t) action)->variable) == 0.0); } /************* workstation ************/ @@ -688,30 +696,31 @@ static void update_resource_state(void *id, static void action_suspend(surf_action_t action) { - xbt_assert0(action->resource_type == - ((surf_resource_t) surf_cpu_resource), - "Resource type mismatch"); - surf_cpu_resource->extension_public->suspend(action); + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->suspend(action); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->suspend(action); + else DIE_IMPOSSIBLE; } static void action_resume(surf_action_t action) { - xbt_assert0(action->resource_type == - ((surf_resource_t) surf_cpu_resource), - "Resource type mismatch"); - surf_cpu_resource->extension_public->resume(action); + if(action->resource_type==(surf_resource_t)surf_network_resource) + surf_network_resource->common_public->resume(action); + else if(action->resource_type==(surf_resource_t)surf_cpu_resource) + surf_cpu_resource->common_public->resume(action); + else DIE_IMPOSSIBLE; } static int action_is_suspended(surf_action_t action) { if(action->resource_type==(surf_resource_t)surf_network_resource) - return 0; + return surf_network_resource->common_public->is_suspended(action); if(action->resource_type==(surf_resource_t)surf_cpu_resource) - return surf_cpu_resource->extension_public->is_suspended(action); + return surf_cpu_resource->common_public->is_suspended(action); DIE_IMPOSSIBLE; } - /**************************************/ /********* Module creation ***********/ /**************************************/ @@ -781,9 +790,10 @@ static void cpu_KCCFLN05_resource_init_internal(void) surf_cpu_resource->extension_public->execute = execute_KCCFLN05; /*FIXME*//* surf_cpu_resource->extension_public->sleep = action_sleep; */ - surf_cpu_resource->extension_public->suspend = cpu_KCCFLN05_action_suspend; - surf_cpu_resource->extension_public->resume = cpu_KCCFLN05_action_resume; - surf_cpu_resource->extension_public->is_suspended = cpu_KCCFLN05_action_is_suspended; + + surf_cpu_resource->common_public->suspend = cpu_KCCFLN05_action_suspend; + surf_cpu_resource->common_public->resume = cpu_KCCFLN05_action_resume; + surf_cpu_resource->common_public->is_suspended = cpu_KCCFLN05_action_is_suspended; surf_cpu_resource->extension_public->get_state = get_state; @@ -866,7 +876,11 @@ static void network_KCCFLN05_resource_init_internal(void) update_network_KCCFLN05_state; surf_network_resource->common_private->finalize = network_KCCFLN05_finalize; - surf_network_resource->extension_public->communicate = communicate_KCCFLN05; + surf_network_resource->common_public->suspend = network_KCCFLN05_action_suspend; + surf_network_resource->common_public->resume = network_KCCFLN05_action_resume; + surf_network_resource->common_public->is_suspended = network_KCCFLN05_action_is_suspended; + + surf_network_resource->extension_public->communicate = communicate_KCCFLN05; network_link_set = xbt_dict_new(); @@ -929,11 +943,13 @@ static void workstation_KCCFLN05_resource_init_internal(void) surf_workstation_resource->common_private->update_resource_state = update_resource_state; surf_workstation_resource->common_private->finalize = workstation_KCCFLN05_finalize; + + surf_workstation_resource->common_public->suspend = action_suspend; + surf_workstation_resource->common_public->resume = action_resume; + surf_workstation_resource->common_public->is_suspended = action_is_suspended; + surf_workstation_resource->extension_public->execute = execute_KCCFLN05; /*FIXME*//* surf_workstation_resource->extension_public->sleep = action_sleep; */ - surf_workstation_resource->extension_public->suspend = action_suspend; - surf_workstation_resource->extension_public->resume = action_resume; - surf_workstation_resource->extension_public->is_suspended = action_is_suspended; surf_workstation_resource->extension_public->get_state = get_state; surf_workstation_resource->extension_public->communicate = communicate_KCCFLN05; } -- 2.20.1