X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5fa8d6780a107eb5ae1ff8a233b0dd23cb065f8a..9b73466ada27682d1729f394549479da83ef4a99:/src/surf/surf_action.c?ds=sidebyside diff --git a/src/surf/surf_action.c b/src/surf/surf_action.c index e05e199402..0189b49801 100644 --- a/src/surf/surf_action.c +++ b/src/surf/surf_action.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010. The SimGrid Team. +/* Copyright (c) 2009-2013. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -6,6 +6,9 @@ #include "surf_private.h" #include "network_private.h" +#include "maxmin_private.h" +#include "surf/datatypes.h" +#include "cpu_cas01_private.h" #include "xbt/mallocator.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_kernel); @@ -74,7 +77,7 @@ void *surf_action_new(size_t size, double cost, surf_model_t model, action->max_duration = NO_MAX_DURATION; action->start = surf_get_clock(); action->finish = -1.0; - action->model_type = model; + action->model_obj = model; #ifdef HAVE_TRACING action->category = NULL; #endif @@ -91,7 +94,7 @@ void *surf_action_new(size_t size, double cost, surf_model_t model, e_surf_action_state_t surf_action_state_get(surf_action_t action) { - surf_action_state_t action_state = &(action->model_type->states); + surf_action_state_t action_state = &(action->model_obj->states); if (action->state_set == action_state->ready_action_set) return SURF_ACTION_READY; @@ -124,7 +127,7 @@ XBT_INLINE void surf_action_free(surf_action_t * action) void surf_action_state_set(surf_action_t action, e_surf_action_state_t state) { - surf_action_state_t action_state = &(action->model_type->states); + surf_action_state_t action_state = &(action->model_obj->states); XBT_IN("(%p,%s)", action, surf_action_state_names[state]); xbt_swag_remove(action, action->state_set); @@ -187,7 +190,7 @@ void surf_action_lmm_heap_remove(xbt_heap_t heap, surf_action_lmm_t action) void surf_action_cancel(surf_action_t action) { - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; surf_action_state_set(action, SURF_ACTION_FAILED); if (model->model_private->update_mechanism == UM_LAZY) { xbt_swag_remove(action, model->model_private->modified_set); @@ -198,7 +201,7 @@ void surf_action_cancel(surf_action_t action) int surf_action_unref(surf_action_t action) { - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; action->refcount--; if (!action->refcount) { xbt_swag_remove(action, action->state_set); @@ -221,7 +224,7 @@ int surf_action_unref(surf_action_t action) void surf_action_suspend(surf_action_t action) { - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; XBT_IN("(%p)", action); if (((surf_action_lmm_t) action)->suspended != 2) { lmm_update_variable_weight(model->model_private->maxmin_system, @@ -236,7 +239,7 @@ void surf_action_suspend(surf_action_t action) void surf_action_resume(surf_action_t action) { - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; XBT_IN("(%p)", action); if (((surf_action_lmm_t) action)->suspended != 2) { lmm_update_variable_weight(model->model_private->maxmin_system, @@ -256,7 +259,7 @@ int surf_action_is_suspended(surf_action_t action) void surf_action_set_max_duration(surf_action_t action, double duration) { - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; XBT_IN("(%p,%g)", action, duration); action->max_duration = duration; if (model->model_private->update_mechanism == UM_LAZY) // remove action from the heap @@ -266,7 +269,7 @@ void surf_action_set_max_duration(surf_action_t action, double duration) void surf_action_set_priority(surf_action_t action, double priority) { - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; XBT_IN("(%p,%g)", action, priority); action->priority = priority; lmm_update_variable_weight(model->model_private->maxmin_system, @@ -278,6 +281,18 @@ void surf_action_set_priority(surf_action_t action, double priority) XBT_OUT(); } +void surf_action_set_bound(surf_action_t action, double bound) +{ + surf_model_t model = action->model_obj; + XBT_IN("(%p,%g)", action, bound); + action->bound = bound; + lmm_update_variable_bound(model->model_private->maxmin_system, ((surf_action_lmm_t) action)->variable, bound); + + if (model->model_private->update_mechanism == UM_LAZY) + surf_action_lmm_heap_remove(model->model_private->action_heap, (surf_action_lmm_t) action); + XBT_OUT(); +} + #ifdef HAVE_TRACING void surf_action_set_category(surf_action_t action, const char *category) @@ -291,7 +306,7 @@ void surf_action_set_category(surf_action_t action, void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now) { double delta = 0.0; - surf_model_t model = action->generic_action.model_type; + surf_model_t model = action->generic_action.model_obj; if(model == surf_network_model) { @@ -311,12 +326,12 @@ void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now) delta = now - action->last_update; if (action->generic_action.remains > 0) { - XBT_DEBUG("Updating action(%p): remains was %lf, last_update was: %lf", action, action->generic_action.remains, action->last_update); + XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", action, action->generic_action.remains, action->last_update); double_update(&(action->generic_action.remains), action->last_value * delta); #ifdef HAVE_TRACING - if (model == surf_cpu_model && TRACE_is_enabled()) { + if (model->type == SURF_MODEL_TYPE_CPU && TRACE_is_enabled()) { surf_resource_t cpu = lmm_constraint_id(lmm_get_cnst_from_var (model->model_private->maxmin_system, @@ -328,7 +343,7 @@ void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now) now - action->last_update); } #endif - XBT_DEBUG("Updating action(%p): remains is now %lf", action, + XBT_DEBUG("Updating action(%p): remains is now %f", action, action->generic_action.remains); } @@ -360,7 +375,7 @@ void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now) double surf_action_get_remains(surf_action_t action) { XBT_IN("(%p)", action); - surf_model_t model = action->model_type; + surf_model_t model = action->model_obj; /* update remains before return it */ if (model->model_private->update_mechanism == UM_LAZY) /* update remains before return it */ generic_update_action_remaining_lazy((surf_action_lmm_t)action, surf_get_clock()); @@ -368,17 +383,37 @@ double surf_action_get_remains(surf_action_t action) return action->remains; } +/** + * Update the CPU total energy for a finished action + * + */ +void update_resource_energy(surf_model_t model, surf_action_lmm_t action) +{ + if(model->type == SURF_MODEL_TYPE_CPU){ + cpu_Cas01_t cpu_model = (cpu_Cas01_t)lmm_constraint_id(lmm_get_cnst_from_var + (model->model_private->maxmin_system, + action->variable, 0)); + + if( cpu_model->energy->last_updated < surf_get_clock()) { + double load = lmm_constraint_get_usage(cpu_model->constraint) / cpu_model->power_peak; + cpu_update_energy(cpu_model, load); + } + } +} + + + + void generic_update_actions_state_lazy(double now, double delta, surf_model_t model) { surf_action_lmm_t action; while ((xbt_heap_size(model->model_private->action_heap) > 0) && (double_equals(xbt_heap_maxkey(model->model_private->action_heap), now))) { action = xbt_heap_pop(model->model_private->action_heap); - XBT_DEBUG("Action %p: finish", action); - action->generic_action.finish = surf_get_clock(); + XBT_DEBUG("Something happened to action %p", action); #ifdef HAVE_TRACING if (TRACE_is_enabled()) { - if(model == surf_cpu_model){ + if(model->type == SURF_MODEL_TYPE_CPU){ surf_resource_t cpu = lmm_constraint_id(lmm_get_cnst_from_var (model->model_private->maxmin_system, @@ -410,7 +445,11 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo } #endif - if(model == surf_cpu_model){ + if(model->type == SURF_MODEL_TYPE_CPU){ + action->generic_action.finish = surf_get_clock(); + + update_resource_energy(model, action); + /* set the remains to 0 due to precision problems when updating the remaining amount */ action->generic_action.remains = 0; surf_action_state_set((surf_action_t) action, SURF_ACTION_DONE); @@ -419,6 +458,7 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo else{ // if I am wearing a latency hat if (action->hat == LATENCY) { + XBT_DEBUG("Latency paid for action %p. Activating", action); lmm_update_variable_weight(model->model_private->maxmin_system, action->variable, ((surf_action_network_CM02_t)(action))->weight); surf_action_lmm_heap_remove(model->model_private->action_heap,action); @@ -429,7 +469,9 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo action->hat == NORMAL) { // no need to communicate anymore // assume that flows that reached max_duration have remaining of 0 - action->generic_action.remains = 0; + action->generic_action.finish = surf_get_clock(); + XBT_DEBUG("Action %p finished", action); + action->generic_action.remains = 0; ((surf_action_t)action)->finish = surf_get_clock(); model->action_state_set((surf_action_t) action, SURF_ACTION_DONE); @@ -441,7 +483,7 @@ void generic_update_actions_state_lazy(double now, double delta, surf_model_t mo } } #ifdef HAVE_TRACING - if (TRACE_is_enabled() && model == surf_cpu_model) { + if (TRACE_is_enabled() && model->type == SURF_MODEL_TYPE_CPU) { //defining the last timestamp that we can safely dump to trace file //without losing the event ascending order (considering all CPU's) double smaller = -1; @@ -559,6 +601,8 @@ void generic_update_actions_state_full(double now, double delta, surf_model_t mo if (model->gap_remove && model == surf_network_model) model->gap_remove(action); } + + update_resource_energy(model, action); } return;