surf_model_t surf_cpu_model = NULL;
lmm_system_t cpu_maxmin_system = NULL;
e_UM_t cpu_update_mechanism = UM_UNDEFINED;
+static int cpu_selective_update = 0;
+
static xbt_swag_t cpu_modified_cpu = NULL;
static xbt_heap_t cpu_action_heap = NULL;
-extern int sg_maxmin_selective_update;
#undef GENERIC_LMM_ACTION
#undef GENERIC_ACTION
0 ? xbt_heap_maxkey(cpu_action_heap) - now : -1;
}
+static double cpu_share_resources_full(double now) {
+ surf_action_cpu_Cas01_t action;
+ return generic_maxmin_share_resources(surf_cpu_model->states.running_action_set,
+ xbt_swag_offset(*action, generic_lmm_action.variable),
+ cpu_maxmin_system, lmm_solve);
+}
+
static void cpu_update_actions_state_lazy(double now, double delta)
{
surf_action_cpu_Cas01_t action;
return;
}
+static void cpu_update_actions_state_full(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;
+ xbt_swag_foreach_safe(action, next_action, running_actions) {
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ cpu_Cas01_t x =
+ lmm_constraint_id(lmm_get_cnst_from_var
+ (cpu_maxmin_system, GENERIC_LMM_ACTION(action).variable, 0));
+
+ TRACE_surf_host_set_utilization(x->generic_resource.name,
+ GENERIC_ACTION(action).data,
+ (surf_action_t) action,
+ lmm_variable_getvalue
+ (GENERIC_LMM_ACTION(action).variable), now - delta,
+ delta);
+ TRACE_last_timestamp_to_dump = now-delta;
+ }
+#endif
+ double_update(&(GENERIC_ACTION(action).remains),
+ lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable) * delta);
+ if (GENERIC_LMM_ACTION(action).generic_action.max_duration != NO_MAX_DURATION)
+ double_update(&(GENERIC_ACTION(action).max_duration), delta);
+ if ((GENERIC_ACTION(action).remains <= 0) &&
+ (lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0)) {
+ GENERIC_ACTION(action).finish = surf_get_clock();
+ cpu_cpu_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
+ } else if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
+ (GENERIC_ACTION(action).max_duration <= 0)) {
+ GENERIC_ACTION(action).finish = surf_get_clock();
+ cpu_cpu_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
+ }
+ }
+
+ return;
+}
+
static void cpu_update_resource_state(void *id,
tmgr_trace_event_t event_type,
double value, double date)
/* update remains before return it */
if(cpu_update_mechanism == UM_LAZY)
cpu_update_remains(ACTION_GET_CPU(action), surf_get_clock());
- return action->remains;
XBT_OUT();
+ return action->remains;
}
static e_surf_resource_state_t cpu_get_state(void *cpu)
if(cpu_modified_cpu) xbt_swag_free(cpu_modified_cpu);
}
-static void surf_cpu_model_init_internal(const char* name)
+static void surf_cpu_model_init_internal()
{
s_surf_action_t action;
s_cpu_Cas01_t cpu;
cpu_running_action_set_that_does_not_need_being_checked =
xbt_swag_new(xbt_swag_offset(action, state_hookup));
- surf_cpu_model->name = name;
+ surf_cpu_model->name = "cpu";
surf_cpu_model->action_unref = cpu_action_unref;
surf_cpu_model->action_cancel = cpu_action_cancel;
surf_cpu_model->action_state_set = cpu_cpu_action_state_set;
surf_cpu_model->model_private->resource_used = cpu_resource_used;
- surf_cpu_model->model_private->share_resources = generic_share_resources;
- surf_cpu_model->model_private->update_actions_state =
- generic_update_actions_state;
+
+ if(cpu_update_mechanism == UM_LAZY) {
+ surf_cpu_model->model_private->share_resources = cpu_share_resources_lazy;
+ surf_cpu_model->model_private->update_actions_state = cpu_update_actions_state_lazy;
+ } else if (cpu_update_mechanism == UM_FULL) {
+ surf_cpu_model->model_private->share_resources = cpu_share_resources_full;
+ surf_cpu_model->model_private->update_actions_state = cpu_update_actions_state_full;
+ } else
+ xbt_die("Invalid update mechanism!");
+
surf_cpu_model->model_private->update_resource_state =
cpu_update_resource_state;
surf_cpu_model->model_private->finalize = cpu_finalize;
surf_cpu_model->extension.cpu.add_traces = cpu_add_traces_cpu;
if (!cpu_maxmin_system) {
- sg_maxmin_selective_update = 1;
- cpu_maxmin_system = lmm_system_new();
+ cpu_maxmin_system = lmm_system_new(cpu_selective_update);
}
if(cpu_update_mechanism == UM_LAZY){
cpu_action_heap = xbt_heap_new(8, NULL);
void surf_cpu_model_init_Cas01()
{
char *optim = xbt_cfg_get_string(_surf_cfg_set, "cpu/optim");
- char *model = xbt_cfg_get_string(_surf_cfg_set, "cpu/model");
-
- if(!strcmp(model,"Cas01_fullupdate")) {
- XBT_WARN("[*Deprecated*. Use --cfg=cpu/model:Cas01 with option --cfg=cpu/optim:Full instead.]");
- } else if(!strcmp(model,"CpuTI")) {
- XBT_WARN("[*Deprecated*. Use --cfg=cpu/model:Cas01 with option --cfg=cpu/optim:TI instead.]");
- }
+ int select = xbt_cfg_get_int(_surf_cfg_set, "cpu/maxmin_selective_update");
if(!strcmp(optim,"Full")) {
cpu_update_mechanism = UM_FULL;
- } else if (strcmp(optim,"Lazy")) {
+ cpu_selective_update = select;
+ } else if (!strcmp(optim,"Lazy")) {
cpu_update_mechanism = UM_LAZY;
- } else if (strcmp(optim,"TI")) {
+ cpu_selective_update = 1;
+ xbt_assert((select==1) || (xbt_cfg_is_default_value(_surf_cfg_set,"cpu/maxmin_selective_update")),
+ "Disabling selective update while using the lazy update mechanism is dumb!");
+ } else if (!strcmp(optim,"TI")) {
surf_cpu_model_init_ti();
return;
} else {
if (surf_cpu_model)
return;
- surf_cpu_model_init_internal("CPU");
+ surf_cpu_model_init_internal();
cpu_define_callbacks();
xbt_dynar_push(model_list, &surf_cpu_model);
}
-
-double generic_share_resources(double now)
-{
- surf_action_cpu_Cas01_t action;
- if(cpu_update_mechanism == UM_LAZY)
- return cpu_share_resources_lazy(now);
- else if (cpu_update_mechanism == UM_FULL)
- return generic_maxmin_share_resources(surf_cpu_model->states.running_action_set,
- xbt_swag_offset(*action, generic_lmm_action.variable),
- cpu_maxmin_system, lmm_solve);
- else
- xbt_die("Invalide update mechanism!");
-
- return 0;
-}
-
-static void cpu_update_actions_state_full(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;
- xbt_swag_foreach_safe(action, next_action, running_actions) {
-#ifdef HAVE_TRACING
- if (TRACE_is_enabled()) {
- cpu_Cas01_t x =
- lmm_constraint_id(lmm_get_cnst_from_var
- (cpu_maxmin_system, GENERIC_LMM_ACTION(action).variable, 0));
-
- TRACE_surf_host_set_utilization(x->generic_resource.name,
- GENERIC_ACTION(action).data,
- (surf_action_t) action,
- lmm_variable_getvalue
- (GENERIC_LMM_ACTION(action).variable), now - delta,
- delta);
- TRACE_last_timestamp_to_dump = now-delta;
- }
-#endif
- double_update(&(GENERIC_ACTION(action).remains),
- lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable) * delta);
- if (GENERIC_LMM_ACTION(action).generic_action.max_duration != NO_MAX_DURATION)
- double_update(&(GENERIC_ACTION(action).max_duration), delta);
- if ((GENERIC_ACTION(action).remains <= 0) &&
- (lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0)) {
- GENERIC_ACTION(action).finish = surf_get_clock();
- cpu_cpu_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
- } else if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
- (GENERIC_ACTION(action).max_duration <= 0)) {
- GENERIC_ACTION(action).finish = surf_get_clock();
- cpu_cpu_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
- }
- }
-
- return;
-}
-
-void generic_update_actions_state(double now, double delta)
-{
- if(cpu_update_mechanism == UM_LAZY)
- cpu_update_actions_state_lazy(now, delta);
- else if(cpu_update_mechanism == UM_FULL)
- cpu_update_actions_state_full(now, delta);
- else
- xbt_die("Not recognized surf cpu model!");
-}