X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/526747a744ea55946618ab192e053cd508947259..fb17c31966c617a068f0d69d3a419041150d905d:/src/surf/cpu_ti.c diff --git a/src/surf/cpu_ti.c b/src/surf/cpu_ti.c index dd169796e1..6aabfd2f4e 100644 --- a/src/surf/cpu_ti.c +++ b/src/surf/cpu_ti.c @@ -15,7 +15,6 @@ #include "cpu_ti_private.h" #include "xbt/heap.h" - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf, "Logging specific to the SURF CPU TRACE INTEGRATION module"); @@ -144,7 +143,7 @@ static surf_cpu_ti_tgmr_t cpu_ti_parse_trace(tmgr_trace_t power_trace, } -static cpu_ti_t cpu_ti_new(char *name, double power_peak, +static void* cpu_ti_create_resource(const char *name, double power_peak, double power_scale, tmgr_trace_t power_trace, int core, @@ -154,19 +153,19 @@ static cpu_ti_t cpu_ti_new(char *name, double power_peak, { tmgr_trace_t empty_trace; s_tmgr_event_t val; - cpu_ti_t cpu = xbt_new0(s_cpu_ti_t, 1); + cpu_ti_t cpu = NULL; s_surf_action_cpu_ti_t ti_action; - xbt_assert1(!surf_cpu_resource_by_name(name), + xbt_assert(core==1,"Multi-core not handled with this model yet"); + xbt_assert(!surf_cpu_resource_by_name(name), "Host '%s' declared several times in the platform file", name); - xbt_assert0(core==1,"Multi-core not handled with this model yet"); + xbt_assert(core==1,"Multi-core not handled with this model yet"); + cpu = (cpu_ti_t) surf_resource_new(sizeof(s_cpu_ti_t), + surf_cpu_model, name,cpu_properties); cpu->action_set = xbt_swag_new(xbt_swag_offset(ti_action, cpu_list_hookup)); - 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"); + xbt_assert(cpu->power_peak > 0, "Power has to be >0"); XBT_DEBUG("power scale %lf", power_scale); cpu->power_scale = power_scale; cpu->avail_trace = cpu_ti_parse_trace(power_trace, power_scale); @@ -191,33 +190,16 @@ static cpu_ti_t cpu_ti_new(char *name, double power_peak, } -static void parse_cpu_ti_init(void) +static void parse_cpu_ti_init(sg_platf_host_cbarg_t host) { - double power_peak = 0.0; - double power_scale = 0.0; - int core = 0; - tmgr_trace_t power_trace = NULL; - e_surf_resource_state_t state_initial = SURF_RESOURCE_OFF; - tmgr_trace_t state_trace = NULL; - - 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); - surf_parse_get_int(&core, A_surfxml_host_core); - - 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_RESOURCE_ON; - if (A_surfxml_host_state == A_surfxml_host_state_OFF) - state_initial = SURF_RESOURCE_OFF; - state_trace = tmgr_trace_new(A_surfxml_host_state_file); - - cpu_ti_new(xbt_strdup(A_surfxml_host_id), power_peak, power_scale, - power_trace, core, state_initial, state_trace, - current_property_set); - current_property_set = NULL; + 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); } @@ -237,8 +219,8 @@ static void add_traces_cpu_ti(void) tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); cpu_ti_t cpu = surf_cpu_resource_by_name(elm); - xbt_assert1(cpu, "Host %s undefined", elm); - xbt_assert1(trace, "Trace %s undefined", trace_name); + xbt_assert(cpu, "Host %s undefined", elm); + xbt_assert(trace, "Trace %s undefined", trace_name); if (cpu->state_event) { XBT_DEBUG("Trace already configured for this CPU(%s), ignoring it", @@ -253,8 +235,8 @@ static void add_traces_cpu_ti(void) tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name); cpu_ti_t cpu = surf_cpu_resource_by_name(elm); - xbt_assert1(cpu, "Host %s undefined", elm); - xbt_assert1(trace, "Trace %s undefined", trace_name); + xbt_assert(cpu, "Host %s undefined", elm); + xbt_assert(trace, "Trace %s undefined", trace_name); XBT_DEBUG("Add power trace: %s to CPU(%s)", trace_name, elm); if (cpu->avail_trace) @@ -278,10 +260,10 @@ static void add_traces_cpu_ti(void) } } -static void cpu_ti_define_callbacks(const char *file) +static void cpu_ti_define_callbacks() { - surfxml_add_callback(ETag_surfxml_host_cb_list, parse_cpu_ti_init); - surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces_cpu_ti); + sg_platf_host_add_cb(parse_cpu_ti_init); + sg_platf_postparse_add_cb(add_traces_cpu_ti); } static int cpu_ti_resource_used(void *resource_id) @@ -733,7 +715,7 @@ 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, 0, &val); + xbt_dynar_get_cpy(trace->power_trace->event_list, point, &val); return val.value; } @@ -746,19 +728,6 @@ static double cpu_ti_get_available_speed(void *cpu) return CPU->power_scale; } -static void cpu_ti_create_resource(char *name, double power_peak, - double power_scale, - tmgr_trace_t power_trace, - int core, - e_surf_resource_state_t state_initial, - tmgr_trace_t state_trace, - xbt_dict_t cpu_properties) -{ - xbt_assert0(core==1,"Multi-core not handled with this model yet"); - cpu_ti_new(name, power_peak, power_scale, power_trace, core, - state_initial, state_trace, cpu_properties); -} - static void cpu_ti_finalize(void) { void **cpu; @@ -834,12 +803,12 @@ static void surf_cpu_ti_model_init_internal(void) } -void surf_cpu_model_init_ti(const char *filename) +void surf_cpu_model_init_ti() { if (surf_cpu_model) return; surf_cpu_ti_model_init_internal(); - cpu_ti_define_callbacks(filename); + cpu_ti_define_callbacks(); xbt_dynar_push(model_list, &surf_cpu_model); } @@ -1103,18 +1072,21 @@ static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace, static int surf_cpu_ti_binary_search(double *array, double a, int low, int high) { - int mid = low + (high - low) / 2; - XBT_DEBUG("a %lf low %d high %d mid %d value %lf", a, low, high, mid, - array[mid]); - /* a == array[mid] */ - if (array[mid] == a) - return mid; - /* a is between mid and mid+1 */ - if (array[mid] < a && array[mid + 1] > a) - return mid; - - if (array[mid] < a) - return surf_cpu_ti_binary_search(array, a, mid + 1, high); - else - return surf_cpu_ti_binary_search(array, a, low, mid - 1); + xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than" + " high (%d)", low, high); + + int mid; + do { + mid = low + (high - low) / 2; + XBT_DEBUG("a %lf low %d high %d mid %d value %lf", a, low, high, mid, + array[mid]); + + if (array[mid] > a) + high = mid; + else + low = mid; + } + while (low < high - 1); + + return low; }