X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/19e67d323e30e6407725d0d0ebbc625a341a0838..2b02a57e5d484b2be62c0d4b88e83fed748127f3:/src/surf/cpu.c?ds=sidebyside diff --git a/src/surf/cpu.c b/src/surf/cpu.c index ee3ab22c52..d8580f8780 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -7,23 +7,16 @@ #include "surf_private.h" -typedef struct surf_action_cpu_Cas01 { - s_surf_action_t generic_action; - lmm_variable_t variable; - int suspended; -} s_surf_action_cpu_Cas01_t, *surf_action_cpu_Cas01_t; +typedef s_surf_action_lmm_t s_surf_action_cpu_Cas01_t, *surf_action_cpu_Cas01_t; typedef struct cpu_Cas01 { s_surf_resource_t generic_resource; - char *name; + double power_peak; double power_scale; - double power_current; tmgr_trace_event_t power_event; - e_surf_cpu_state_t state_current; + e_surf_resource_state_t state_current; tmgr_trace_event_t state_event; lmm_constraint_t constraint; - /*Handles the properties that can be added to cpu's */ - xbt_dict_t properties; } s_cpu_Cas01_t, *cpu_Cas01_t; XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu, surf, @@ -37,16 +30,10 @@ lmm_system_t cpu_maxmin_system = NULL; static xbt_swag_t running_action_set_that_does_not_need_being_checked = NULL; -static void cpu_free(void *cpu) -{ - xbt_dict_free(&(((cpu_Cas01_t) cpu)->properties)); - surf_resource_free(cpu); -} - -static cpu_Cas01_t cpu_new(char *name, double power_scale, - double power_initial, +static cpu_Cas01_t cpu_new(char *name, double power_peak, + double power_scale, tmgr_trace_t power_trace, - e_surf_cpu_state_t state_initial, + e_surf_resource_state_t state_initial, tmgr_trace_t state_trace, xbt_dict_t cpu_properties) { @@ -55,9 +42,10 @@ static cpu_Cas01_t cpu_new(char *name, double power_scale, "Host '%s' declared several times in the platform file", name); cpu->generic_resource.model = surf_cpu_model; cpu->generic_resource.name = name; + cpu->generic_resource.properties = cpu_properties; + cpu->power_peak = power_peak; + xbt_assert0(cpu->power_peak > 0, "Power has to be >0"); cpu->power_scale = power_scale; - xbt_assert0(cpu->power_scale > 0, "Power has to be >0"); - cpu->power_current = power_initial; if (power_trace) cpu->power_event = tmgr_history_add_trace(history, power_trace, 0.0, 0, cpu); @@ -69,14 +57,9 @@ static cpu_Cas01_t cpu_new(char *name, double power_scale, cpu->constraint = lmm_constraint_new(cpu_maxmin_system, cpu, - cpu->power_current * cpu->power_scale); + cpu->power_scale * cpu->power_peak); - /*add the property set */ - cpu->properties = cpu_properties; - - current_property_set = cpu_properties; - - xbt_dict_set(surf_model_resource_set(surf_cpu_model), name, cpu, cpu_free); + xbt_dict_set(surf_model_resource_set(surf_cpu_model), name, cpu, surf_resource_free); return cpu; } @@ -84,27 +67,27 @@ static cpu_Cas01_t cpu_new(char *name, double power_scale, static void parse_cpu_init(void) { + double power_peak = 0.0; double power_scale = 0.0; - double power_initial = 0.0; tmgr_trace_t power_trace = NULL; - e_surf_cpu_state_t state_initial = SURF_CPU_OFF; + e_surf_resource_state_t state_initial = SURF_RESOURCE_OFF; tmgr_trace_t state_trace = NULL; - power_scale = get_cpu_power(A_surfxml_host_power); - surf_parse_get_double(&power_initial, A_surfxml_host_availability); - surf_parse_get_trace(&power_trace, A_surfxml_host_availability_file); + power_peak = get_cpu_power(A_surfxml_host_power); + surf_parse_get_double(&power_scale, A_surfxml_host_availability); + power_trace = tmgr_trace_new(A_surfxml_host_availability_file); xbt_assert0((A_surfxml_host_state == A_surfxml_host_state_ON) || (A_surfxml_host_state == A_surfxml_host_state_OFF), "Invalid state"); if (A_surfxml_host_state == A_surfxml_host_state_ON) - state_initial = SURF_CPU_ON; + state_initial = SURF_RESOURCE_ON; if (A_surfxml_host_state == A_surfxml_host_state_OFF) - state_initial = SURF_CPU_OFF; - surf_parse_get_trace(&state_trace, A_surfxml_host_state_file); + state_initial = SURF_RESOURCE_OFF; + state_trace = tmgr_trace_new(A_surfxml_host_state_file); current_property_set = xbt_dict_new(); - cpu_new(xbt_strdup(A_surfxml_host_id), power_scale, power_initial, + cpu_new(xbt_strdup(A_surfxml_host_id), power_peak, power_scale, power_trace, state_initial, state_trace, current_property_set); } @@ -202,10 +185,6 @@ static void update_actions_state(double now, double delta) surf_action_cpu_Cas01_t action = NULL; surf_action_cpu_Cas01_t next_action = NULL; xbt_swag_t running_actions = surf_cpu_model->states.running_action_set; - /* FIXME: UNUSED - xbt_swag_t failed_actions = - surf_cpu_model->states.failed_action_set; - */ xbt_swag_foreach_safe(action, next_action, running_actions) { double_update(&(action->generic_action.remains), @@ -233,18 +212,18 @@ static void update_resource_state(void *id, cpu_Cas01_t cpu = id; if (event_type == cpu->power_event) { - cpu->power_current = value; + cpu->power_scale = value; lmm_update_constraint_bound(cpu_maxmin_system, cpu->constraint, - cpu->power_current * cpu->power_scale); + cpu->power_scale * cpu->power_peak); } else if (event_type == cpu->state_event) { if (value > 0) - cpu->state_current = SURF_CPU_ON; + cpu->state_current = SURF_RESOURCE_ON; else { lmm_constraint_t cnst = cpu->constraint; lmm_variable_t var = NULL; lmm_element_t elem = NULL; - cpu->state_current = SURF_CPU_OFF; + cpu->state_current = SURF_RESOURCE_OFF; while ((var = lmm_get_var_from_cnst(cpu_maxmin_system, cnst, &elem))) { surf_action_t action = lmm_variable_id(var); @@ -270,29 +249,13 @@ static surf_action_t execute(void *cpu, double size) surf_action_cpu_Cas01_t action = NULL; cpu_Cas01_t CPU = cpu; - XBT_IN2("(%s,%g)", CPU->name, size); - action = xbt_new0(s_surf_action_cpu_Cas01_t, 1); - - action->generic_action.refcount = 1; - action->generic_action.cost = size; - action->generic_action.remains = size; - action->generic_action.priority = 1.0; - action->generic_action.max_duration = NO_MAX_DURATION; - action->generic_action.start = surf_get_clock(); - action->generic_action.finish = -1.0; - action->generic_action.model_type = surf_cpu_model; + XBT_IN2("(%s,%g)", surf_resource_name(CPU), size); + action = surf_action_new(sizeof(s_surf_action_cpu_Cas01_t),size,surf_cpu_model, + CPU->state_current != SURF_RESOURCE_ON); + action->suspended = 0; /* Should be useless because of the calloc but it seems to help valgrind... */ - if (CPU->state_current == SURF_CPU_ON) - action->generic_action.state_set = - surf_cpu_model->states.running_action_set; - else - action->generic_action.state_set = - surf_cpu_model->states.failed_action_set; - - xbt_swag_insert(action, action->generic_action.state_set); - action->variable = lmm_variable_new(cpu_maxmin_system, action, action->generic_action.priority, -1.0, 1); @@ -308,7 +271,7 @@ static surf_action_t action_sleep(void *cpu, double duration) if (duration > 0) duration = MAX(duration, MAXMIN_PRECISION); - XBT_IN2("(%s,%g)", ((cpu_Cas01_t) cpu)->name, duration); + XBT_IN2("(%s,%g)", surf_resource_name(cpu), duration); action = (surf_action_cpu_Cas01_t) execute(cpu, 1.0); action->generic_action.max_duration = duration; action->suspended = 2; @@ -373,25 +336,20 @@ static void action_set_priority(surf_action_t action, double priority) XBT_OUT; } -static e_surf_cpu_state_t get_state(void *cpu) +static e_surf_resource_state_t get_state(void *cpu) { return ((cpu_Cas01_t) cpu)->state_current; } static double get_speed(void *cpu, double load) { - return load * (((cpu_Cas01_t) cpu)->power_scale); + return load * (((cpu_Cas01_t) cpu)->power_peak); } static double get_available_speed(void *cpu) { /* number between 0 and 1 */ - return ((cpu_Cas01_t) cpu)->power_current; -} - -static xbt_dict_t get_properties(void *cpu) -{ - return ((cpu_Cas01_t) cpu)->properties; + return ((cpu_Cas01_t) cpu)->power_scale; } static void finalize(void) @@ -439,8 +397,6 @@ static void surf_cpu_model_init_internal(void) surf_cpu_model->extension.cpu.get_state = get_state; surf_cpu_model->extension.cpu.get_speed = get_speed; surf_cpu_model->extension.cpu.get_available_speed = get_available_speed; - /*manage the properties of the cpu */ - surf_cpu_model->get_properties = get_properties; if (!cpu_maxmin_system) cpu_maxmin_system = lmm_system_new();