series->trace_value[series->nb_points] = next_time;
event_lost = 0;
} else {
- series->values[series->nb_points] = val.value;
series->trace_index[series->nb_points] = -1;
+ series->values[series->nb_points] = val.value;
}
(series->nb_points)++;
previous_time += spacing;
if (event_lost) {
series->trace_index[series->nb_points] = next_index;
series->trace_value[series->nb_points] = next_time;
- } else {
+ } else
series->trace_index[series->nb_points] = -1;
- }
(series->nb_points)++;
}
return series;
return 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);
+ trace->type = TRACE_FIXED;
+ trace->value = val.value;
+ return trace;
+ }
+
/* count the total time of trace file */
xbt_dynar_foreach(power_trace->event_list, cpt, val) {
total_time += val.delta;
trace->last_time =
power_trace->timestep * ((double) (trace->levels[0]->nb_points));
- trace->total = surf_cpu_integrate_trace(trace, 0.0, trace->last_time);
+ trace->total =
+ surf_cpu_integrate_trace(trace, 0.0, trace->actual_last_time);
DEBUG3("Total integral %lf, last_time %lf actual_last_time %lf",
trace->total, trace->last_time, trace->actual_last_time);
e_surf_resource_state_t state_initial,
tmgr_trace_t state_trace, xbt_dict_t cpu_properties)
{
+ tmgr_trace_t empty_trace;
+ s_tmgr_event_t val;
cpu_ti_t cpu = xbt_new0(s_cpu_ti_t, 1);
s_surf_action_cpu_ti_t ti_action;
xbt_assert1(!surf_model_resource_by_name(surf_cpu_model, name),
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) {
+ /* 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);
+ if (val.delta == 0) {
+ empty_trace = tmgr_empty_trace_new();
+ cpu->power_event =
+ tmgr_history_add_trace(history, empty_trace,
+ cpu->avail_trace->actual_last_time, 0, cpu);
+ }
+ }
xbt_dict_set(surf_model_resource_set(surf_cpu_model), name, cpu,
surf_resource_free);
double area_total;
surf_action_cpu_ti_t action;
-/* alrealdy updated */
- if (cpu->last_update == now)
+/* already updated */
+ if (cpu->last_update >= now)
return;
/* calcule the surface */
{
cpu_ti_t cpu = id;
surf_action_cpu_ti_t action;
- if (event_type == cpu->state_event) {
+
+ if (event_type == cpu->power_event) {
+ tmgr_trace_t power_trace;
+ surf_cpu_ti_tgmr_t trace;
+ s_tmgr_event_t val;
+
+ DEBUG3("Finish trace date: %lf value %lf date %lf", surf_get_clock(),
+ value, date);
+ /* update remaining of actions and put in modified cpu swag */
+ cpu_update_remaining_amount(cpu, date);
+ xbt_swag_insert(cpu, modified_cpu);
+
+ power_trace = cpu->avail_trace->levels[0]->power_trace;
+ xbt_dynar_get_cpy(power_trace->event_list,
+ xbt_dynar_length(power_trace->event_list) - 1, &val);
+ /* free old trace */
+ surf_cpu_free_trace(cpu->avail_trace);
+ cpu->power_scale = val.value;
+
+ trace = xbt_new0(s_surf_cpu_ti_tgmr_t, 1);
+ trace->type = TRACE_FIXED;
+ trace->value = val.value;
+ DEBUG1("value %lf", val.value);
+
+ cpu->avail_trace = trace;
+
+ if (tmgr_trace_event_free(event_type))
+ cpu->power_event = NULL;
+ } else if (event_type == cpu->state_event) {
if (value > 0)
cpu->state_current = SURF_RESOURCE_ON;
else {
/* Are a and b BOTH in the same chunk of level 0 ? */
if (l_bounds[0] > u_bounds[0]) {
+ return surf_cpu_integrate_exactly(trace, u_bounds[0], a, b);
+#if 0
return (b - a) * (trace->levels[0]->values[u_bounds[0]]);
+#endif
}
/* first sub-level amount */
break;
current_spacing = trace->levels[i]->spacing;
- index = u_bounds[i + 1] * (trace->levels[i + 1]->spacing /
- current_spacing);
+ index = rint(u_bounds[i + 1] * (trace->levels[i + 1]->spacing /
+ current_spacing));
DEBUG1("L%d:", i);
while (double_positive
((u_bounds[i]) * current_spacing - index * current_spacing)) {
/* Little piece at the end */
+#if 0
integral += (b - u_bounds[0] * (trace->levels[0]->spacing)) *
(trace->levels[0]->values[u_bounds[0]]);
+#endif
+ integral +=
+ surf_cpu_integrate_exactly(trace, u_bounds[0],
+ u_bounds[0] * (trace->levels[0]->spacing), b);
DEBUG1("After last bit : %.2f", integral);
return integral;
double tmgr_date;
s_tmgr_event_t elem;
+ /* already at the end */
+ if (index >= trace->levels[0]->nb_points && !double_positive(b - a))
+ return 0.0;
tmgr_index = trace->levels[0]->trace_index[index];
tmgr_date = trace->levels[0]->trace_value[index];
xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list, tmgr_index,
&elem);
tmgr_date += elem.delta;
- if (a <= tmgr_date)
- break;
tmgr_index++;
}
/* sum first slice [a, tmgr_date[ */
xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list, tmgr_index,
&elem);
tmgr_date += elem.delta;
- if (a <= tmgr_date)
- break;
tmgr_index++;
}
/* sum first slice [a, tmgr_date[ */