X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/073f8bce5afb1febdc3580607be8819b90705280..5dac8b8bdde8be418dedb56d7b05a4ab5ec4d7af:/src/surf/workstation_KCCFLN05.c diff --git a/src/surf/workstation_KCCFLN05.c b/src/surf/workstation_KCCFLN05.c index 382a7e5886..fe5d0490b4 100644 --- a/src/surf/workstation_KCCFLN05.c +++ b/src/surf/workstation_KCCFLN05.c @@ -7,11 +7,92 @@ #include "xbt/ex.h" #include "xbt/dict.h" -#include "workstation_KCCFLN05_private.h" +#include "surf_private.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf, "Logging specific to the SURF workstation module (KCCFLN05)"); +typedef enum { + SURF_WORKSTATION_RESOURCE_CPU, + SURF_WORKSTATION_RESOURCE_LINK, +} e_surf_workstation_model_type_t; + + +/**************************************/ +/********* router object **************/ +/**************************************/ +typedef struct router_KCCFLN05 { + char *name; + unsigned int id; +} s_router_KCCFLN05_t, *router_KCCFLN05_t; + + +/**************************************/ +/********* cpu object *****************/ +/**************************************/ +typedef struct cpu_KCCFLN05 { + surf_model_t model; + e_surf_workstation_model_type_t type; /* Do not move this field */ + char *name; /* Do not move this field */ + lmm_constraint_t constraint; + lmm_constraint_t bus; + double power_scale; + double power_current; + double interference_send; + double interference_recv; + double interference_send_recv; + tmgr_trace_event_t power_event; + e_surf_cpu_state_t state_current; + tmgr_trace_event_t state_event; + int id; /* cpu and network card are a single object... */ + xbt_dynar_t incomming_communications; + xbt_dynar_t outgoing_communications; +} s_cpu_KCCFLN05_t, *cpu_KCCFLN05_t; + +/**************************************/ +/*********** network object ***********/ +/**************************************/ + +typedef struct network_link_KCCFLN05 { + surf_model_t model; + e_surf_workstation_model_type_t type; /* Do not move this field */ + char *name; /* Do not move this field */ + lmm_constraint_t constraint; + double lat_current; + tmgr_trace_event_t lat_event; + double bw_current; + tmgr_trace_event_t bw_event; + e_surf_network_link_state_t state_current; + tmgr_trace_event_t state_event; +} s_network_link_KCCFLN05_t, *network_link_KCCFLN05_t; + + +typedef struct s_route_KCCFLN05 { + double impact_on_src; + double impact_on_dst; + double impact_on_src_with_other_recv; + double impact_on_dst_with_other_send; + network_link_KCCFLN05_t *links; + int size; +} s_route_KCCFLN05_t, *route_KCCFLN05_t; + +/**************************************/ +/*************** actions **************/ +/**************************************/ +typedef struct surf_action_workstation_KCCFLN05 { + s_surf_action_t generic_action; + double latency; + double lat_current; + lmm_variable_t variable; + double rate; + int suspended; + cpu_KCCFLN05_t src; /* could be avoided */ + cpu_KCCFLN05_t dst; /* could be avoided */ +} s_surf_action_workstation_KCCFLN05_t, + *surf_action_workstation_KCCFLN05_t; + + + static int nb_workstation = 0; static s_route_KCCFLN05_t *routing_table = NULL; #define ROUTE(i,j) routing_table[(i)+(j)*nb_workstation] @@ -19,7 +100,7 @@ static network_link_KCCFLN05_t loopback = NULL; static xbt_dict_t parallel_task_network_link_set = NULL; //added to work with GTNETS static xbt_dict_t router_set = NULL; - +static lmm_system_t maxmin_system = NULL; /*xbt_dict_t network_link_set = NULL;*/ @@ -101,12 +182,12 @@ static void *name_service(const char *name) return res; } -static const char *get_model_name(void *model_id) +static const char *get_resource_name(void *resource_id) { /* We can freely cast as a cpu_KCCFLN05_t because it has the same prefix as network_link_KCCFLN05_t. However, only cpu_KCCFLN05_t will theoretically be given as an argument here. */ - return ((cpu_KCCFLN05_t) model_id)->name; + return ((cpu_KCCFLN05_t) resource_id)->name; } /* action_get_state is inherited from the surf module */ @@ -190,7 +271,7 @@ static void action_resume(surf_action_t action) if (((surf_action_workstation_KCCFLN05_t) action)->lat_current == 0.0) lmm_update_variable_weight(maxmin_system, ((surf_action_workstation_KCCFLN05_t) - action)->variable, 1.0); + action)->variable, action->priority); else lmm_update_variable_weight(maxmin_system, ((surf_action_workstation_KCCFLN05_t) @@ -217,9 +298,11 @@ static void action_set_max_duration(surf_action_t action, double duration) static void action_set_priority(surf_action_t action, double priority) -{ /* FIXME: should inherit */ +{ XBT_IN2("(%p,%g)", action, priority); action->priority = priority; + lmm_update_variable_weight(maxmin_system, ((surf_action_workstation_KCCFLN05_t) action)->variable, priority); + XBT_OUT; } @@ -227,35 +310,37 @@ static void action_set_priority(surf_action_t action, double priority) /******* Resource Private **********/ /**************************************/ -static int model_used(void *model_id) +static int resource_used(void *resource_id) { /* We can freely cast as a network_link_KCCFLN05_t because it has the same prefix as cpu_KCCFLN05_t */ - if (((cpu_KCCFLN05_t) model_id)->type == + if (((cpu_KCCFLN05_t) resource_id)->type == SURF_WORKSTATION_RESOURCE_CPU) return (lmm_constraint_used - (maxmin_system, ((cpu_KCCFLN05_t) model_id)->constraint) - || ((((cpu_KCCFLN05_t) model_id)->bus) ? + (maxmin_system, ((cpu_KCCFLN05_t) resource_id)->constraint) + || ((((cpu_KCCFLN05_t) resource_id)->bus) ? lmm_constraint_used(maxmin_system, - ((cpu_KCCFLN05_t) model_id)-> + ((cpu_KCCFLN05_t) resource_id)-> bus) : 0)); else return lmm_constraint_used(maxmin_system, - ((network_link_KCCFLN05_t) model_id)-> + ((network_link_KCCFLN05_t) resource_id)-> constraint); } -static double share_models(double now) +static double share_resources(double now) { s_surf_action_workstation_KCCFLN05_t s_action; surf_action_workstation_KCCFLN05_t action = NULL; xbt_swag_t running_actions = surf_workstation_model->common_public->states.running_action_set; - double min = generic_maxmin_share_models(running_actions, - xbt_swag_offset(s_action, - variable)); + double min = generic_maxmin_share_resources2(running_actions, + xbt_swag_offset(s_action, + variable), + maxmin_system, + lmm_solve); xbt_swag_foreach(action, running_actions) { if (action->latency > 0) { @@ -320,7 +405,7 @@ static void update_actions_state(double now, double delta) action->generic_action.finish = surf_get_clock(); surf_action_change_state((surf_action_t) action, SURF_ACTION_DONE); } else { - /* Need to check that none of the model has failed */ + /* Need to check that none of the resource has failed */ lmm_constraint_t cnst = NULL; int i = 0; void *constraint_id = NULL; @@ -364,7 +449,7 @@ static void update_actions_state(double now, double delta) return; } -static void update_model_state(void *id, +static void update_resource_state(void *id, tmgr_trace_event_t event_type, double value) { @@ -531,7 +616,7 @@ static surf_action_t action_sleep(void *cpu, double duration) return (surf_action_t) action; } -static e_surf_cpu_state_t model_get_state(void *cpu) +static e_surf_cpu_state_t resource_get_state(void *cpu) { return ((cpu_KCCFLN05_t) cpu)->state_current; } @@ -619,7 +704,7 @@ static surf_action_t communicate(void *src, void *dst, double size, } lmm_update_variable_latency(maxmin_system, action->variable, - action->latency); + action->latency); /* Should be useless */ for (i = 0; i < route_size; i++) lmm_expand(maxmin_system, route->links[i]->constraint, @@ -651,7 +736,7 @@ static surf_action_t execute_parallel_task(int workstation_nb, xbt_dict_new_ext(workstation_nb * workstation_nb * 10); } - /* Compute the number of affected models... */ + /* Compute the number of affected resources... */ for (i = 0; i < workstation_nb; i++) { for (j = 0; j < workstation_nb; j++) { cpu_KCCFLN05_t card_src = workstation_list[i]; @@ -682,7 +767,7 @@ static surf_action_t execute_parallel_task(int workstation_nb, action->generic_action.cost = amount; action->generic_action.remains = amount; action->generic_action.max_duration = NO_MAX_DURATION; - action->generic_action.start = -1.0; + action->generic_action.start = surf_get_clock(); action->generic_action.finish = -1.0; action->generic_action.model_type = (surf_model_t) surf_workstation_model; @@ -1161,8 +1246,8 @@ static void model_init_internal(void) xbt_swag_new(xbt_swag_offset(action, state_hookup)); surf_workstation_model->common_public->name_service = name_service; - surf_workstation_model->common_public->get_model_name = - get_model_name; + surf_workstation_model->common_public->get_resource_name = + get_resource_name; surf_workstation_model->common_public->action_get_state = surf_action_get_state; surf_workstation_model->common_public->action_get_start_time = @@ -1188,19 +1273,19 @@ static void model_init_internal(void) action_set_priority; surf_workstation_model->common_public->name = "Workstation KCCFLN05"; - surf_workstation_model->common_private->model_used = model_used; - surf_workstation_model->common_private->share_models = - share_models; + surf_workstation_model->common_private->resource_used = resource_used; + surf_workstation_model->common_private->share_resources = + share_resources; surf_workstation_model->common_private->update_actions_state = update_actions_state; - surf_workstation_model->common_private->update_model_state = - update_model_state; + surf_workstation_model->common_private->update_resource_state = + update_resource_state; surf_workstation_model->common_private->finalize = finalize; surf_workstation_model->extension_public->execute = execute; surf_workstation_model->extension_public->sleep = action_sleep; surf_workstation_model->extension_public->get_state = - model_get_state; + resource_get_state; surf_workstation_model->extension_public->get_speed = get_speed; surf_workstation_model->extension_public->get_available_speed = get_available_speed; @@ -1219,9 +1304,9 @@ static void model_init_internal(void) workstation_set = xbt_dict_new(); router_set = xbt_dict_new(); - network_link_set = xbt_dict_new(); - - xbt_assert0(maxmin_system, "surf_init has to be called first!"); + network_link_set = xbt_dict_new(); + if (!maxmin_system) + maxmin_system = lmm_system_new(); } /**************************************/