X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2f810149832a2d855c33d0df5b02d736c2081e41..48eda6a2033423e980783b6e40bc35824808bb9a:/src/surf/cpu_ti.c diff --git a/src/surf/cpu_ti.c b/src/surf/cpu_ti.c index 0b9f2624d9..b44fd4d035 100644 --- a/src/surf/cpu_ti.c +++ b/src/surf/cpu_ti.c @@ -6,8 +6,8 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ /* - commit: e2d6799c4182f00443b3013aadb1c2412372460f - This commit retrieves the old implementation of CPU_TI with multi-levels. + commit: e2d6799c4182f00443b3013aadb1c2412372460f + This commit retrieves the old implementation of CPU_TI with multi-levels. */ #include "surf_private.h" @@ -73,12 +73,12 @@ static surf_cpu_ti_trace_t surf_cpu_ti_trace_new(tmgr_trace_t power_trace) trace = xbt_new0(s_surf_cpu_ti_trace_t, 1); trace->time_points = xbt_malloc0(sizeof(double) * - (xbt_dynar_length(power_trace->event_list) + 1)); + (xbt_dynar_length(power_trace->s_list.event_list) + 1)); trace->integral = xbt_malloc0(sizeof(double) * - (xbt_dynar_length(power_trace->event_list) + 1)); - trace->nb_points = xbt_dynar_length(power_trace->event_list); - xbt_dynar_foreach(power_trace->event_list, cpt, val) { + (xbt_dynar_length(power_trace->s_list.event_list) + 1)); + trace->nb_points = xbt_dynar_length(power_trace->s_list.event_list); + xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) { trace->time_points[i] = time; trace->integral[i] = integral; integral += val.delta * val.value; @@ -93,10 +93,10 @@ static surf_cpu_ti_trace_t surf_cpu_ti_trace_new(tmgr_trace_t power_trace) /** * \brief Creates a new integration trace from a tmgr_trace_t * -* \param power_trace CPU availability trace -* \param value Percentage of CPU power available (useful to fixed tracing) -* \param spacing Initial spacing -* \return Integration trace structure +* \param power_trace CPU availability trace +* \param value Percentage of CPU power available (useful to fixed tracing) +* \param spacing Initial spacing +* \return Integration trace structure */ static surf_cpu_ti_tgmr_t cpu_ti_parse_trace(tmgr_trace_t power_trace, double value) @@ -116,8 +116,8 @@ static surf_cpu_ti_tgmr_t cpu_ti_parse_trace(tmgr_trace_t power_trace, } /* only one point available, fixed trace */ - if (xbt_dynar_length(power_trace->event_list) == 1) { - xbt_dynar_get_cpy(power_trace->event_list, 0, &val); + if (xbt_dynar_length(power_trace->s_list.event_list) == 1) { + xbt_dynar_get_cpy(power_trace->s_list.event_list, 0, &val); trace->type = TRACE_FIXED; trace->value = val.value; return trace; @@ -127,7 +127,7 @@ static surf_cpu_ti_tgmr_t cpu_ti_parse_trace(tmgr_trace_t power_trace, trace->power_trace = power_trace; /* count the total time of trace file */ - xbt_dynar_foreach(power_trace->event_list, cpt, val) { + xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) { total_time += val.delta; } trace->trace = surf_cpu_ti_trace_new(power_trace); @@ -155,7 +155,7 @@ static void* cpu_ti_create_resource(const char *name, double power_peak, cpu_ti_t cpu = NULL; s_surf_action_cpu_ti_t ti_action; xbt_assert(core==1,"Multi-core not handled with this model yet"); - xbt_assert(!surf_cpu_resource_by_name(name), + xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)), "Host '%s' declared several times in the platform file", name); xbt_assert(core==1,"Multi-core not handled with this model yet"); @@ -172,10 +172,10 @@ static void* cpu_ti_create_resource(const char *name, double power_peak, if (state_trace) cpu->state_event = tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu); - if (power_trace && xbt_dynar_length(power_trace->event_list) > 1) { + if (power_trace && xbt_dynar_length(power_trace->s_list.event_list) > 1) { /* add a fake trace event if periodicity == 0 */ - xbt_dynar_get_cpy(power_trace->event_list, - xbt_dynar_length(power_trace->event_list) - 1, &val); + xbt_dynar_get_cpy(power_trace->s_list.event_list, + xbt_dynar_length(power_trace->s_list.event_list) - 1, &val); if (val.delta == 0) { empty_trace = tmgr_empty_trace_new(); cpu->power_event = @@ -185,20 +185,20 @@ static void* cpu_ti_create_resource(const char *name, double power_peak, } xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu); - return cpu; + return xbt_lib_get_elm_or_null(host_lib, name); } static void parse_cpu_ti_init(sg_platf_host_cbarg_t host) { cpu_ti_create_resource(host->id, - host->power_peak, - host->power_scale, - host->power_trace, - host->core_amount, - host->initial_state, - host->state_trace, - host->properties); + host->power_peak, + host->power_scale, + host->power_trace, + host->core_amount, + host->initial_state, + host->state_trace, + host->properties); } @@ -216,7 +216,7 @@ static void add_traces_cpu_ti(void) /* connect all traces relative to hosts */ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) { tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); - cpu_ti_t cpu = surf_cpu_resource_by_name(elm); + cpu_ti_t cpu = surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)); xbt_assert(cpu, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); @@ -232,7 +232,7 @@ static void add_traces_cpu_ti(void) xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) { tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); - cpu_ti_t cpu = surf_cpu_resource_by_name(elm); + cpu_ti_t cpu = surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)); xbt_assert(cpu, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); @@ -244,10 +244,10 @@ static void add_traces_cpu_ti(void) cpu->avail_trace = cpu_ti_parse_trace(trace, cpu->power_scale); /* add a fake trace event if periodicity == 0 */ - if (trace && xbt_dynar_length(trace->event_list) > 1) { + if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) { s_tmgr_event_t val; - xbt_dynar_get_cpy(trace->event_list, - xbt_dynar_length(trace->event_list) - 1, &val); + xbt_dynar_get_cpy(trace->s_list.event_list, + xbt_dynar_length(trace->s_list.event_list) - 1, &val); if (val.delta == 0) { tmgr_trace_t empty_trace; empty_trace = tmgr_empty_trace_new(); @@ -277,11 +277,11 @@ static int cpu_ti_action_unref(surf_action_t action) if (!action->refcount) { xbt_swag_remove(action, action->state_set); /* remove from action_set */ - xbt_swag_remove(action, ACTION_GET_CPU(action)->action_set); + xbt_swag_remove(action, ((cpu_ti_t)surf_cpu_resource_priv(ACTION_GET_CPU(action)))->action_set); /* remove from heap */ xbt_heap_remove(cpu_ti_action_heap, ((surf_action_cpu_ti_t) action)->index_heap); - xbt_swag_insert(ACTION_GET_CPU(action), cpu_ti_modified_cpu); + xbt_swag_insert(((cpu_ti_t)surf_cpu_resource_priv(ACTION_GET_CPU(action))), cpu_ti_modified_cpu); surf_action_free(&action); return 1; } @@ -293,7 +293,7 @@ static void cpu_ti_action_cancel(surf_action_t action) surf_action_state_set(action, SURF_ACTION_FAILED); xbt_heap_remove(cpu_ti_action_heap, ((surf_action_cpu_ti_t) action)->index_heap); - xbt_swag_insert(ACTION_GET_CPU(action), cpu_ti_modified_cpu); + xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu); return; } @@ -301,19 +301,18 @@ static void cpu_ti_action_state_set(surf_action_t action, e_surf_action_state_t state) { surf_action_state_set(action, state); - xbt_swag_insert(ACTION_GET_CPU(action), cpu_ti_modified_cpu); + xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu); return; } /** * \brief Update the remaining amount of actions * -* \param cpu Cpu on which the actions are running -* \param now Current time +* \param cpu Cpu on which the actions are running +* \param now Current time */ static void cpu_ti_update_remaining_amount(cpu_ti_t cpu, double now) { -#define GENERIC_ACTION(action) action->generic_action double area_total; surf_action_cpu_ti_t action; @@ -329,13 +328,14 @@ static void cpu_ti_update_remaining_amount(cpu_ti_t cpu, double now) cpu->last_update); xbt_swag_foreach(action, cpu->action_set) { + surf_action_t generic = (surf_action_t)action; /* action not running, skip it */ - if (GENERIC_ACTION(action).state_set != + if (generic->state_set != surf_cpu_model->states.running_action_set) continue; /* bogus priority, skip it */ - if (GENERIC_ACTION(action).priority <= 0) + if (generic->priority <= 0) continue; /* action suspended, skip it */ @@ -343,20 +343,20 @@ static void cpu_ti_update_remaining_amount(cpu_ti_t cpu, double now) continue; /* action don't need update */ - if (GENERIC_ACTION(action).start >= now) + if (generic->start >= now) continue; /* skip action that are finishing now */ - if (GENERIC_ACTION(action).finish >= 0 - && GENERIC_ACTION(action).finish <= now) + if (generic->finish >= 0 + && generic->finish <= now) continue; /* update remaining */ - double_update(&(GENERIC_ACTION(action).remains), + double_update(&(generic->remains), area_total / (cpu->sum_priority * - GENERIC_ACTION(action).priority)); + generic->priority)); XBT_DEBUG("Update remaining action(%p) remaining %lf", action, - GENERIC_ACTION(action).remains); + generic->remains); } cpu->last_update = now; #undef GENERIC_ACTION @@ -365,8 +365,8 @@ static void cpu_ti_update_remaining_amount(cpu_ti_t cpu, double now) /** * \brief Update the finish date of action if necessary * -* \param cpu Cpu on which the actions are running -* \param now Current time +* \param cpu Cpu on which the actions are running +* \param now Current time */ static void cpu_ti_update_action_finish_date(cpu_ti_t cpu, double now) { @@ -482,7 +482,7 @@ static void cpu_ti_update_actions_state(double now, double delta) GENERIC_ACTION(action).remains = 0; cpu_ti_action_state_set((surf_action_t) action, SURF_ACTION_DONE); /* update remaining amout of all actions */ - cpu_ti_update_remaining_amount(action->cpu, surf_get_clock()); + cpu_ti_update_remaining_amount(surf_cpu_resource_priv(action->cpu), surf_get_clock()); } #undef GENERIC_ACTION } @@ -494,6 +494,8 @@ static void cpu_ti_update_resource_state(void *id, cpu_ti_t cpu = id; surf_action_cpu_ti_t action; + surf_watched_hosts(); + if (event_type == cpu->power_event) { tmgr_trace_t power_trace; surf_cpu_ti_tgmr_t trace; @@ -506,8 +508,8 @@ static void cpu_ti_update_resource_state(void *id, xbt_swag_insert(cpu, cpu_ti_modified_cpu); power_trace = cpu->avail_trace->power_trace; - xbt_dynar_get_cpy(power_trace->event_list, - xbt_dynar_length(power_trace->event_list) - 1, &val); + xbt_dynar_get_cpy(power_trace->s_list.event_list, + xbt_dynar_length(power_trace->s_list.event_list) - 1, &val); /* free old trace */ surf_cpu_ti_free_tmgr(cpu->avail_trace); cpu->power_scale = val.value; @@ -561,7 +563,7 @@ static void cpu_ti_update_resource_state(void *id, static surf_action_t cpu_ti_execute(void *cpu, double size) { surf_action_cpu_ti_t action = NULL; - cpu_ti_t CPU = cpu; + cpu_ti_t CPU = surf_cpu_resource_priv(cpu); XBT_IN("(%s,%g)", surf_resource_name(CPU), size); action = @@ -593,7 +595,7 @@ static surf_action_t cpu_ti_action_sleep(void *cpu, double duration) if (duration > 0) duration = MAX(duration, MAXMIN_PRECISION); - XBT_IN("(%s,%g)", surf_resource_name(cpu), duration); + XBT_IN("(%s,%g)", surf_resource_name(surf_cpu_resource_priv(cpu)), duration); action = (surf_action_cpu_ti_t) cpu_ti_execute(cpu, 1.0); action->generic_action.max_duration = duration; action->suspended = 2; @@ -616,7 +618,7 @@ static void cpu_ti_action_suspend(surf_action_t action) ((surf_action_cpu_ti_t) action)->suspended = 1; xbt_heap_remove(cpu_ti_action_heap, ((surf_action_cpu_ti_t) action)->index_heap); - xbt_swag_insert(ACTION_GET_CPU(action), cpu_ti_modified_cpu); + xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu); } XBT_OUT(); } @@ -626,7 +628,7 @@ static void cpu_ti_action_resume(surf_action_t action) XBT_IN("(%p)", action); if (((surf_action_cpu_ti_t) action)->suspended != 2) { ((surf_action_cpu_ti_t) action)->suspended = 0; - xbt_swag_insert(ACTION_GET_CPU(action), cpu_ti_modified_cpu); + xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu); } XBT_OUT(); } @@ -671,7 +673,7 @@ static void cpu_ti_action_set_priority(surf_action_t action, { XBT_IN("(%p,%g)", action, priority); action->priority = priority; - xbt_swag_insert(ACTION_GET_CPU(action), cpu_ti_modified_cpu); + xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu); XBT_OUT(); } @@ -687,20 +689,20 @@ static double cpu_ti_action_get_remains(surf_action_t action) static e_surf_resource_state_t cpu_ti_get_state(void *cpu) { - return ((cpu_ti_t) cpu)->state_current; + return ((cpu_ti_t)surf_cpu_resource_priv(cpu))->state_current; } static double cpu_ti_get_speed(void *cpu, double load) { - return load * (((cpu_ti_t) cpu)->power_peak); + return load * ((cpu_ti_t)surf_cpu_resource_priv(cpu))->power_peak; } /** * \brief Auxiliary function to update the CPU power scale. * -* This function uses the trace structure to return the power scale at the determined time a. -* \param trace Trace structure to search the updated power scale -* \param a Time +* This function uses the trace structure to return the power scale at the determined time a. +* \param trace Trace structure to search the updated power scale +* \param a Time * \return CPU power scale */ static double surf_cpu_ti_get_power_scale(surf_cpu_ti_tgmr_t trace, @@ -714,13 +716,13 @@ static double surf_cpu_ti_get_power_scale(surf_cpu_ti_tgmr_t trace, point = surf_cpu_ti_binary_search(trace->trace->time_points, reduced_a, 0, trace->trace->nb_points - 1); - xbt_dynar_get_cpy(trace->power_trace->event_list, point, &val); + xbt_dynar_get_cpy(trace->power_trace->s_list.event_list, point, &val); return val.value; } static double cpu_ti_get_available_speed(void *cpu) { - cpu_ti_t CPU = cpu; + cpu_ti_t CPU = surf_cpu_resource_priv(cpu); CPU->power_scale = surf_cpu_ti_get_power_scale(CPU->avail_trace, surf_get_clock()); /* number between 0 and 1 */ @@ -734,12 +736,12 @@ static void cpu_ti_finalize(void) char *key; xbt_lib_foreach(host_lib, cursor, key, cpu){ - if(cpu[SURF_CPU_LEVEL]) - { - cpu_ti_t CPU = cpu[SURF_CPU_LEVEL]; - xbt_swag_free(CPU->action_set); - surf_cpu_ti_free_tmgr(CPU->avail_trace); - } + if(cpu[SURF_CPU_LEVEL]) + { + cpu_ti_t CPU = cpu[SURF_CPU_LEVEL]; + xbt_swag_free(CPU->action_set); + surf_cpu_ti_free_tmgr(CPU->avail_trace); + } } surf_model_exit(surf_cpu_model); @@ -793,7 +795,6 @@ static void surf_cpu_ti_model_init_internal(void) surf_cpu_model->extension.cpu.get_speed = cpu_ti_get_speed; surf_cpu_model->extension.cpu.get_available_speed = cpu_ti_get_available_speed; - surf_cpu_model->extension.cpu.create_resource = cpu_ti_create_resource; surf_cpu_model->extension.cpu.add_traces = add_traces_cpu_ti; cpu_ti_action_heap = xbt_heap_new(8, NULL); @@ -804,8 +805,7 @@ static void surf_cpu_ti_model_init_internal(void) void surf_cpu_model_init_ti() { - if (surf_cpu_model) - return; + xbt_assert(!surf_cpu_model,"CPU model already initialized. This should not happen."); surf_cpu_ti_model_init_internal(); cpu_ti_define_callbacks(); xbt_dynar_push(model_list, &surf_cpu_model); @@ -819,8 +819,8 @@ void surf_cpu_model_init_ti() * the cyclic effect. * * \param trace Trace structure. -* \param a Begin of interval -* \param b End of interval +* \param a Begin of interval +* \param b End of interval * \return the integrate value. -1 if an error occurs. */ static double surf_cpu_ti_integrate_trace(surf_cpu_ti_tgmr_t trace, @@ -880,12 +880,12 @@ static double surf_cpu_ti_integrate_trace(surf_cpu_ti_tgmr_t trace, /** * \brief Auxiliary function to calculate the integral between a and b. - * It simply calculates the integral at point a and b and returns the difference - * between them. - * \param trace Trace structure - * \param a Initial point - * \param b Final point - * \return Integral + * It simply calculates the integral at point a and b and returns the difference + * between them. + * \param trace Trace structure + * \param a Initial point + * \param b Final point + * \return Integral */ static double surf_cpu_ti_integrate_trace_simple(surf_cpu_ti_trace_t trace, double a, double b) @@ -897,9 +897,9 @@ static double surf_cpu_ti_integrate_trace_simple(surf_cpu_ti_trace_t trace, /** * \brief Auxiliary function to calculate the integral at point a. - * \param trace Trace structure - * \param a point - * \return Integral + * \param trace Trace structure + * \param a point + * \return Integral */ static double surf_cpu_ti_integrate_trace_simple_point(surf_cpu_ti_trace_t trace, double a) @@ -934,10 +934,10 @@ static double surf_cpu_ti_integrate_trace_simple_point(surf_cpu_ti_trace_t * * Here, amount can span multiple trace periods * -* \param trace CPU trace structure -* \param a Initial time -* \param amount Amount to be executed -* \return End time +* \param trace CPU trace structure +* \param a Initial time +* \param amount Amount to be executed +* \return End time */ static double surf_cpu_ti_solve_trace(surf_cpu_ti_tgmr_t trace, double a, double amount) @@ -986,8 +986,8 @@ static double surf_cpu_ti_solve_trace(surf_cpu_ti_tgmr_t trace, double a, /* Now solve for new_amount which is <= trace_total */ /* - fprintf(stderr,"reduced_a = %.2f\n",reduced_a); - fprintf(stderr,"reduced_amount = %.2f\n",reduced_amount); + fprintf(stderr,"reduced_a = %.2f\n",reduced_a); + fprintf(stderr,"reduced_amount = %.2f\n",reduced_amount); */ reduced_b = surf_cpu_ti_solve_trace_somewhat_simple(trace, reduced_a, @@ -1017,7 +1017,7 @@ static double surf_cpu_ti_solve_trace_somewhat_simple(surf_cpu_ti_tgmr_t amount_till_end = surf_cpu_ti_integrate_trace(trace, a, trace->last_time); /* - fprintf(stderr,"amount_till_end=%.2f\n",amount_till_end); + fprintf(stderr,"amount_till_end=%.2f\n",amount_till_end); */ if (amount_till_end > amount) { @@ -1032,10 +1032,10 @@ static double surf_cpu_ti_solve_trace_somewhat_simple(surf_cpu_ti_tgmr_t /** * \brief Auxiliary function to solve integral. - * It returns the date when the requested amount of flops is available - * \param trace Trace structure - * \param a Initial point - * \param amount Amount of flops + * It returns the date when the requested amount of flops is available + * \param trace Trace structure + * \param a Initial point + * \param amount Amount of flops * \return The date when amount is available. */ static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace, @@ -1061,11 +1061,11 @@ static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace, /** * \brief Binary search in array. - * It returns the first point of the interval in which "a" is. - * \param array Array - * \param a Value to search - * \param low Low bound to search in array - * \param high Upper bound to search in array + * It returns the first point of the interval in which "a" is. + * \param array Array + * \param a Value to search + * \param low Low bound to search in array + * \param high Upper bound to search in array * \return Index of point */ static int surf_cpu_ti_binary_search(double *array, double a, int low,