X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7da2926d0733ff0683f31aeea176ce71e127264f..097befdbebacea302be3a7442afce30ae1a26937:/src/surf/host_ptask_L07.cpp diff --git a/src/surf/host_ptask_L07.cpp b/src/surf/host_ptask_L07.cpp index 39a6de1c6e..69b9b75480 100644 --- a/src/surf/host_ptask_L07.cpp +++ b/src/surf/host_ptask_L07.cpp @@ -4,18 +4,19 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include + +#include + #include "host_ptask_L07.hpp" #include "cpu_interface.hpp" #include "surf_routing.hpp" #include "xbt/lib.h" +#include "src/surf/platform.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_host); - -static int ptask_host_count = 0; -static xbt_dict_t ptask_parallel_task_link_set = NULL; -lmm_system_t ptask_maxmin_system = NULL; - +XBT_LOG_EXTERNAL_CATEGORY(xbt_cfg); /**************************************/ /*** Resource Creation & Destruction **/ @@ -29,49 +30,64 @@ static void ptask_netlink_parse_init(sg_platf_link_cbarg_t link) void surf_host_model_init_ptask_L07(void) { - XBT_INFO("Switching to the L07 model to handle parallel tasks."); + XBT_CINFO(xbt_cfg,"Switching to the L07 model to handle parallel tasks."); xbt_assert(!surf_cpu_model_pm, "CPU model type already defined"); xbt_assert(!surf_network_model, "network model type already defined"); // Define the callbacks to parse the XML - sg_platf_host_add_cb(cpu_parse_init); - sg_platf_host_add_cb(host_parse_init); - sg_platf_link_add_cb(ptask_netlink_parse_init); - sg_platf_postparse_add_cb(host_add_traces); + simgrid::surf::on_link.connect(ptask_netlink_parse_init); + simgrid::surf::on_postparse.connect([](){ + surf_host_model->addTraces(); + }); - surf_host_model = new HostL07Model(); - Model *model = surf_host_model; - xbt_dynar_push(model_list, &model); - xbt_dynar_push(model_list_invoke, &model); + surf_host_model = new simgrid::surf::HostL07Model(); + xbt_dynar_push(all_existing_models, &surf_host_model); } +namespace simgrid { +namespace surf { + HostL07Model::HostL07Model() : HostModel() { - if (!ptask_maxmin_system) - ptask_maxmin_system = lmm_system_new(1); - surf_host_model = NULL; - surf_network_model = new NetworkL07Model(); - surf_cpu_model_pm = new CpuL07Model(); + p_maxminSystem = lmm_system_new(1); + surf_network_model = new NetworkL07Model(this,p_maxminSystem); + surf_cpu_model_pm = new CpuL07Model(this,p_maxminSystem); routing_model_create(surf_network_model->createLink("__loopback__", 498000000, NULL, 0.000015, NULL, - SURF_RESOURCE_ON, NULL, + 1/*ON*/, NULL, SURF_LINK_FATPIPE, NULL)); } HostL07Model::~HostL07Model() { - xbt_dict_free(&ptask_parallel_task_link_set); - delete surf_cpu_model_pm; delete surf_network_model; - ptask_host_count = 0; +} - if (ptask_maxmin_system) { - lmm_system_free(ptask_maxmin_system); - ptask_maxmin_system = NULL; - } +CpuL07Model::CpuL07Model(HostL07Model *hmodel,lmm_system_t sys) + : CpuModel() + , p_hostModel(hmodel) + { + p_maxminSystem = sys; + } +CpuL07Model::~CpuL07Model() { + surf_cpu_model_pm = NULL; + lmm_system_free(p_maxminSystem); + p_maxminSystem = NULL; } +NetworkL07Model::NetworkL07Model(HostL07Model *hmodel, lmm_system_t sys) + : NetworkModel() + , p_hostModel(hmodel) + { + p_maxminSystem = sys; + } +NetworkL07Model::~NetworkL07Model() +{ + surf_network_model = NULL; + p_maxminSystem = NULL; // Avoid multi-free +} + double HostL07Model::shareResources(double /*now*/) { @@ -79,7 +95,7 @@ double HostL07Model::shareResources(double /*now*/) ActionList *running_actions = getRunningActionSet(); double min = this->shareResourcesMaxMin(running_actions, - ptask_maxmin_system, + p_maxminSystem, bottleneck_solve); for(ActionList::iterator it(running_actions->begin()), itend(running_actions->end()) @@ -121,7 +137,7 @@ void HostL07Model::updateActionsState(double /*now*/, double delta) { } if ((action->m_latency == 0.0) && (action->isSuspended() == 0)) { action->updateBound(); - lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 1.0); + lmm_update_variable_weight(p_maxminSystem, action->getVariable(), 1.0); } } XBT_DEBUG("Action (%p) : remains (%g) updated by %g.", @@ -152,10 +168,10 @@ void HostL07Model::updateActionsState(double /*now*/, double delta) { lmm_constraint_t cnst = NULL; int i = 0; - while ((cnst = lmm_get_cnst_from_var(ptask_maxmin_system, action->getVariable(), i++))) { + while ((cnst = lmm_get_cnst_from_var(p_maxminSystem, action->getVariable(), i++))) { void *constraint_id = lmm_constraint_id(cnst); - if (static_cast(constraint_id)->getState() == SURF_RESOURCE_OFF) { + if (static_cast(constraint_id)->isOff()) { XBT_DEBUG("Action (%p) Failed!!", action); action->finish(); action->setState(SURF_ACTION_FAILED); @@ -167,124 +183,110 @@ void HostL07Model::updateActionsState(double /*now*/, double delta) { return; } -Action *HostL07Model::executeParallelTask(int host_nb, - sg_host_t*host_list, - double *flops_amount, - double *bytes_amount, - double rate) +Action *HostL07Model::executeParallelTask(int host_nb, sg_host_t *host_list, + double *flops_amount, double *bytes_amount, + double rate) { + return new L07Action(this, host_nb, host_list, flops_amount, bytes_amount, rate); +} + + +L07Action::L07Action(Model *model, int host_nb, + sg_host_t*host_list, + double *flops_amount, + double *bytes_amount, + double rate) + : CpuAction(model, 1, 0) { - L07Action *action = new L07Action(this, 1, 0); unsigned int cpt; int nb_link = 0; - int nb_host = 0; + int nb_used_host = 0; /* Only the hosts with something to compute (>0 flops) are counted) */ double latency = 0.0; - action->p_edgeList->reserve(host_nb); - for (int i = 0; ip_edgeList->push_back(sg_host_edge(host_list[i])); - - if (ptask_parallel_task_link_set == NULL) - ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL); + xbt_dict_t ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL); - xbt_dict_reset(ptask_parallel_task_link_set); + this->p_netcardList->reserve(host_nb); + for (int i = 0; ip_netcardList->push_back(host_list[i]->pimpl_netcard); /* Compute the number of affected resources... */ - for (int i = 0; i < host_nb; i++) { - for (int j = 0; j < host_nb; j++) { - xbt_dynar_t route=NULL; - - if (bytes_amount[i * host_nb + j] > 0) { - double lat=0.0; - unsigned int cpt; - void *_link; - LinkL07 *link; - - routing_platf->getRouteAndLatency((*action->p_edgeList)[i], (*action->p_edgeList)[j], - &route, &lat); - latency = MAX(latency, lat); - - xbt_dynar_foreach(route, cpt, _link) { - link = static_cast(_link); - xbt_dict_set(ptask_parallel_task_link_set, link->getName(), link, NULL); + if(bytes_amount != NULL) { + for (int i = 0; i < host_nb; i++) { + for (int j = 0; j < host_nb; j++) { + xbt_dynar_t route=NULL; + + if (bytes_amount[i * host_nb + j] > 0) { + double lat=0.0; + unsigned int cpt; + void *_link; + LinkL07 *link; + + routing_platf->getRouteAndLatency((*this->p_netcardList)[i], (*this->p_netcardList)[j], + &route, &lat); + latency = MAX(latency, lat); + + xbt_dynar_foreach(route, cpt, _link) { + link = static_cast(_link); + xbt_dict_set(ptask_parallel_task_link_set, link->getName(), link, NULL); + } } } } } nb_link = xbt_dict_length(ptask_parallel_task_link_set); - xbt_dict_reset(ptask_parallel_task_link_set); + xbt_dict_free(&ptask_parallel_task_link_set); for (int i = 0; i < host_nb; i++) if (flops_amount[i] > 0) - nb_host++; + nb_used_host++; XBT_DEBUG("Creating a parallel task (%p) with %d cpus and %d links.", - action, host_nb, nb_link); - action->m_suspended = 0; /* valgrind seems to want it despite the calloc... */ - action->p_computationAmount = flops_amount; - action->p_communicationAmount = bytes_amount; - action->m_latency = latency; - action->m_rate = rate; - - action->p_variable = lmm_variable_new(ptask_maxmin_system, action, 1.0, + this, host_nb, nb_link); + this->p_computationAmount = flops_amount; + this->p_communicationAmount = bytes_amount; + this->m_latency = latency; + this->m_rate = rate; + + this->p_variable = lmm_variable_new(model->getMaxminSystem(), this, 1.0, (rate > 0 ? rate : -1.0), host_nb + nb_link); - if (action->m_latency > 0) - lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 0.0); + if (this->m_latency > 0) + lmm_update_variable_weight(model->getMaxminSystem(), this->getVariable(), 0.0); for (int i = 0; i < host_nb; i++) - lmm_expand(ptask_maxmin_system, - sg_host_surfcpu(host_list[i])->getConstraint(), - action->getVariable(), flops_amount[i]); - - for (int i = 0; i < host_nb; i++) { - for (int j = 0; j < host_nb; j++) { - void *_link; - - xbt_dynar_t route=NULL; - if (bytes_amount[i * host_nb + j] == 0.0) - continue; - - routing_platf->getRouteAndLatency((*action->p_edgeList)[i], (*action->p_edgeList)[j], - &route, NULL); - - xbt_dynar_foreach(route, cpt, _link) { - LinkL07 *link = static_cast(_link); - lmm_expand_add(ptask_maxmin_system, link->getConstraint(), - action->getVariable(), - bytes_amount[i * host_nb + j]); - } - } - } - - if (nb_link + nb_host == 0) { - action->setCost(1.0); - action->setRemains(0.0); - } - - return action; -} + lmm_expand(model->getMaxminSystem(), + host_list[i]->pimpl_cpu->getConstraint(), + this->getVariable(), flops_amount[i]); -Host *HostL07Model::createHost(const char *name) -{ - HostL07 *wk = NULL; - sg_host_t sg_host = sg_host_by_name(name); + if(bytes_amount != NULL) { + for (int i = 0; i < host_nb; i++) { + for (int j = 0; j < host_nb; j++) { + void *_link; - xbt_assert(!surf_host_resource_priv(sg_host), - "Host '%s' declared several times in the platform file.", - name); + xbt_dynar_t route=NULL; + if (bytes_amount[i * host_nb + j] == 0.0) + continue; - wk = new HostL07(this, name, NULL, - sg_host_edge(sg_host), - sg_host_surfcpu(sg_host)); + routing_platf->getRouteAndLatency((*this->p_netcardList)[i], (*this->p_netcardList)[j], + &route, NULL); - xbt_lib_set(host_lib, name, SURF_HOST_LEVEL, wk); + xbt_dynar_foreach(route, cpt, _link) { + LinkL07 *link = static_cast(_link); + lmm_expand_add(model->getMaxminSystem(), link->getConstraint(), + this->getVariable(), bytes_amount[i * host_nb + j]); + } + } + } + } - return wk; + if (nb_link + nb_used_host == 0) { + this->setCost(1.0); + this->setRemains(0.0); + } } -Action *NetworkL07Model::communicate(RoutingEdge *src, RoutingEdge *dst, +Action *NetworkL07Model::communicate(NetCard *src, NetCard *dst, double size, double rate) { sg_host_t*host_list = xbt_new0(sg_host_t, 2); @@ -303,34 +305,14 @@ Action *NetworkL07Model::communicate(RoutingEdge *src, RoutingEdge *dst, return res; } -xbt_dynar_t HostL07Model::getRoute(Host *src, Host *dst) -{ - xbt_dynar_t route=NULL; - routing_platf->getRouteAndLatency(src->p_netElm, dst->p_netElm, &route, NULL); - return route; -} - -Cpu *CpuL07Model::createCpu(const char *name, xbt_dynar_t powerPeak, +Cpu *CpuL07Model::createCpu(simgrid::s4u::Host *host, xbt_dynar_t powerPeakList, int pstate, 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) + int initiallyOn, + tmgr_trace_t state_trace) { - double power_initial = xbt_dynar_get_as(powerPeak, pstate, double); - xbt_dynar_free(&powerPeak); // kill memory leak - sg_host_t sg_host = sg_host_by_name(name); - - xbt_assert(!surf_host_resource_priv(sg_host), - "Host '%s' declared several times in the platform file.", - name); - - CpuL07 *cpu = new CpuL07(this, name, cpu_properties, - power_initial, power_scale, power_trace, - core, state_initial, state_trace); - - sg_host_surfcpu_set(sg_host, cpu); - + CpuL07 *cpu = new CpuL07(this, host, powerPeakList, pstate, power_scale, power_trace, + core, initiallyOn, state_trace); return cpu; } @@ -339,7 +321,7 @@ Link* NetworkL07Model::createLink(const char *name, tmgr_trace_t bw_trace, double lat_initial, tmgr_trace_t lat_trace, - e_surf_resource_state_t state_initial, + int initiallyOn, tmgr_trace_t state_trace, e_surf_link_sharing_policy_t policy, xbt_dict_t properties) @@ -347,11 +329,13 @@ Link* NetworkL07Model::createLink(const char *name, xbt_assert(!Link::byName(name), "Link '%s' declared several times in the platform file.", name); - return new LinkL07(this, name, properties, + Link* link = new LinkL07(this, name, properties, bw_initial, bw_trace, lat_initial, lat_trace, - state_initial, state_trace, + initiallyOn, state_trace, policy); + Link::onCreation(link); + return link; } void HostL07Model::addTraces() @@ -365,22 +349,22 @@ void HostL07Model::addTraces() /* Connect traces relative to cpu */ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); - CpuL07 *host = static_cast(sg_host_surfcpu(sg_host_by_name(elm))); + CpuL07 *host = static_cast(sg_host_by_name(elm)->pimpl_cpu); xbt_assert(host, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - host->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, host); + host->p_stateEvent = future_evt_set->add_trace(trace, 0.0, host); } xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); - CpuL07 *host = static_cast(sg_host_surfcpu(sg_host_by_name(elm))); + CpuL07 *host = static_cast(sg_host_by_name(elm)->pimpl_cpu); xbt_assert(host, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - host->p_powerEvent = tmgr_history_add_trace(history, trace, 0.0, 0, host); + host->p_speedEvent = future_evt_set->add_trace(trace, 0.0, host); } /* Connect traces relative to network */ @@ -391,7 +375,7 @@ void HostL07Model::addTraces() xbt_assert(link, "Link %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_stateEvent = future_evt_set->add_trace(trace, 0.0, link); } xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) { @@ -401,7 +385,7 @@ void HostL07Model::addTraces() xbt_assert(link, "Link %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - link->p_bwEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_bwEvent = future_evt_set->add_trace(trace, 0.0, link); } xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) { @@ -411,7 +395,7 @@ void HostL07Model::addTraces() xbt_assert(link, "Link %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_latEvent = future_evt_set->add_trace(trace, 0.0, link); } } @@ -419,52 +403,24 @@ void HostL07Model::addTraces() * Resource * ************/ -HostL07::HostL07(HostModel *model, const char* name, xbt_dict_t props, RoutingEdge *netElm, Cpu *cpu) - : Host(model, name, props, NULL, netElm, cpu) +CpuL07::CpuL07(CpuL07Model *model, simgrid::s4u::Host *host, + xbt_dynar_t speedPeakList, int pstate, + double speedScale, tmgr_trace_t speedTrace, + int core, int initiallyOn, tmgr_trace_t state_trace) + : Cpu(model, host, speedPeakList, pstate, + core, xbt_dynar_get_as(speedPeakList,pstate,double), speedScale, initiallyOn) { -} + p_constraint = lmm_constraint_new(model->getMaxminSystem(), this, xbt_dynar_get_as(speedPeakList,pstate,double) * speedScale); -double HostL07::getPowerPeakAt(int /*pstate_index*/) -{ - THROW_UNIMPLEMENTED; -} + if (speedTrace) + p_speedEvent = future_evt_set->add_trace(speedTrace, 0.0, this); -int HostL07::getNbPstates() -{ - THROW_UNIMPLEMENTED; -} - -void HostL07::setPstate(int /*pstate_index*/) -{ - THROW_UNIMPLEMENTED; -} - -int HostL07::getPstate() -{ - THROW_UNIMPLEMENTED; + if (state_trace) + p_stateEvent = future_evt_set->add_trace(state_trace, 0.0, this); } -double HostL07::getConsumedEnergy() +CpuL07::~CpuL07() { - THROW_UNIMPLEMENTED; -} - -CpuL07::CpuL07(CpuL07Model *model, const char* name, xbt_dict_t props, - double power_initial, double power_scale, tmgr_trace_t power_trace, - int core, e_surf_resource_state_t state_initial, tmgr_trace_t state_trace) - : Cpu(model, name, props, lmm_constraint_new(ptask_maxmin_system, this, power_initial * power_scale), - core, power_initial, power_scale) -{ - xbt_assert(m_powerScale > 0, "Power has to be >0"); - - if (power_trace) - p_powerEvent = tmgr_history_add_trace(history, power_trace, 0.0, 0, this); - else - p_powerEvent = NULL; - - setState(state_initial); - if (state_trace) - p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, this); } LinkL07::LinkL07(NetworkL07Model *model, const char* name, xbt_dict_t props, @@ -472,97 +428,43 @@ LinkL07::LinkL07(NetworkL07Model *model, const char* name, xbt_dict_t props, tmgr_trace_t bw_trace, double lat_initial, tmgr_trace_t lat_trace, - e_surf_resource_state_t state_initial, + int initiallyOn, tmgr_trace_t state_trace, e_surf_link_sharing_policy_t policy) - : Link(model, name, props, lmm_constraint_new(ptask_maxmin_system, this, bw_initial), history, state_trace) + : Link(model, name, props, lmm_constraint_new(model->getMaxminSystem(), this, bw_initial), future_evt_set, state_trace) { m_bwCurrent = bw_initial; if (bw_trace) - p_bwEvent = tmgr_history_add_trace(history, bw_trace, 0.0, 0, this); + p_bwEvent = future_evt_set->add_trace(bw_trace, 0.0, this); - setState(state_initial); + if (initiallyOn) + turnOn(); + else + turnOff(); m_latCurrent = lat_initial; if (lat_trace) - p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, this); + p_latEvent = future_evt_set->add_trace(lat_trace, 0.0, this); if (policy == SURF_LINK_FATPIPE) lmm_constraint_shared(getConstraint()); } -bool CpuL07::isUsed(){ - return lmm_constraint_used(ptask_maxmin_system, getConstraint()); -} - -bool LinkL07::isUsed(){ - return lmm_constraint_used(ptask_maxmin_system, getConstraint()); -} - -void CpuL07::updateState(tmgr_trace_event_t event_type, double value, double /*date*/){ - XBT_DEBUG("Updating cpu %s (%p) with value %g", getName(), this, value); - if (event_type == p_powerEvent) { - m_powerScale = value; - lmm_update_constraint_bound(ptask_maxmin_system, getConstraint(), m_powerPeak * m_powerScale); - if (tmgr_trace_event_free(event_type)) - p_powerEvent = NULL; - } else if (event_type == p_stateEvent) { - if (value > 0) - setState(SURF_RESOURCE_ON); - else - setState(SURF_RESOURCE_OFF); - if (tmgr_trace_event_free(event_type)) - p_stateEvent = NULL; - } else { - XBT_CRITICAL("Unknown event ! \n"); - xbt_abort(); - } - return; -} - -void LinkL07::updateState(tmgr_trace_event_t event_type, double value, double date) { - XBT_DEBUG("Updating link %s (%p) with value=%f for date=%g", getName(), this, value, date); - if (event_type == p_bwEvent) { - updateBandwidth(value, date); - if (tmgr_trace_event_free(event_type)) - p_bwEvent = NULL; - } else if (event_type == p_latEvent) { - updateLatency(value, date); - if (tmgr_trace_event_free(event_type)) - p_latEvent = NULL; - } else if (event_type == p_stateEvent) { - if (value > 0) - setState(SURF_RESOURCE_ON); - else - setState(SURF_RESOURCE_OFF); - if (tmgr_trace_event_free(event_type)) - p_stateEvent = NULL; - } else { - XBT_CRITICAL("Unknown event ! \n"); - xbt_abort(); - } - return; -} - -e_surf_resource_state_t HostL07::getState() { - return p_cpu->getState(); -} - -Action *HostL07::execute(double size) +Action *CpuL07::execute(double size) { sg_host_t*host_list = xbt_new0(sg_host_t, 1); double *flops_amount = xbt_new0(double, 1); double *bytes_amount = xbt_new0(double, 1); - host_list[0] = sg_host_by_name(getName()); + host_list[0] = getHost(); flops_amount[0] = size; - return static_cast(getModel())->executeParallelTask(1, host_list, - flops_amount, - bytes_amount, -1); + return static_cast(getModel()) + ->p_hostModel + ->executeParallelTask( 1, host_list, flops_amount, bytes_amount, -1); } -Action *HostL07::sleep(double duration) +Action *CpuL07::sleep(double duration) { L07Action *action = NULL; @@ -571,12 +473,75 @@ Action *HostL07::sleep(double duration) action = static_cast(execute(1.0)); action->m_maxDuration = duration; action->m_suspended = 2; - lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 0.0); + lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), 0.0); XBT_OUT(); return action; } +bool CpuL07::isUsed(){ + return lmm_constraint_used(getModel()->getMaxminSystem(), getConstraint()); +} + +/** @brief take into account changes of speed (either load or max) */ +void CpuL07::onSpeedChange() { + lmm_variable_t var = NULL; + lmm_element_t elem = NULL; + + lmm_update_constraint_bound(getModel()->getMaxminSystem(), getConstraint(), m_speedPeak * m_speedScale); + while ((var = lmm_get_var_from_cnst + (getModel()->getMaxminSystem(), getConstraint(), &elem))) { + Action *action = static_cast(lmm_variable_id(var)); + + lmm_update_variable_bound(getModel()->getMaxminSystem(), + action->getVariable(), + m_speedScale * m_speedPeak); + } + + Cpu::onSpeedChange(); +} + + +bool LinkL07::isUsed(){ + return lmm_constraint_used(getModel()->getMaxminSystem(), getConstraint()); +} + +void CpuL07::updateState(tmgr_trace_iterator_t triggered, double value, double /*date*/){ + XBT_DEBUG("Updating cpu %s (%p) with value %g", getName(), this, value); + if (triggered == p_speedEvent) { + m_speedScale = value; + onSpeedChange(); + tmgr_trace_event_unref(&p_speedEvent); + } else if (triggered == p_stateEvent) { + if (value > 0) + turnOn(); + else + turnOff(); + tmgr_trace_event_unref(&p_stateEvent); + } else { + xbt_die("Unknown event!\n"); + } +} + +void LinkL07::updateState(tmgr_trace_iterator_t triggered, double value, double date) { + XBT_DEBUG("Updating link %s (%p) with value=%f for date=%g", getName(), this, value, date); + if (triggered == p_bwEvent) { + updateBandwidth(value, date); + tmgr_trace_event_unref(&p_bwEvent); + } else if (triggered == p_latEvent) { + updateLatency(value, date); + tmgr_trace_event_unref(&p_latEvent); + } else if (triggered == p_stateEvent) { + if (value > 0) + turnOn(); + else + turnOff(); + tmgr_trace_event_unref(&p_stateEvent); + } else { + xbt_die("Unknown event ! \n"); + } +} + double LinkL07::getBandwidth() { return m_bwCurrent; @@ -585,12 +550,7 @@ double LinkL07::getBandwidth() void LinkL07::updateBandwidth(double value, double date) { m_bwCurrent = value; - lmm_update_constraint_bound(ptask_maxmin_system, getConstraint(), m_bwCurrent); -} - -double LinkL07::getLatency() -{ - return m_latCurrent; + lmm_update_constraint_bound(getModel()->getMaxminSystem(), getConstraint(), m_bwCurrent); } void LinkL07::updateLatency(double value, double date) @@ -600,24 +560,19 @@ void LinkL07::updateLatency(double value, double date) lmm_element_t elem = NULL; m_latCurrent = value; - while ((var = lmm_get_var_from_cnst(ptask_maxmin_system, getConstraint(), &elem))) { + while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) { action = static_cast(lmm_variable_id(var)); action->updateBound(); } } - -bool LinkL07::isShared() -{ - return lmm_constraint_is_shared(getConstraint()); -} - /********** * Action * **********/ L07Action::~L07Action(){ - free(p_communicationAmount); + if (p_communicationAmount != NULL) + free(p_communicationAmount); free(p_computationAmount); } @@ -627,18 +582,20 @@ void L07Action::updateBound() double lat_bound = -1.0; int i, j; - int hostNb = p_edgeList->size(); + int hostNb = p_netcardList->size(); - for (i = 0; i < hostNb; i++) { - for (j = 0; j < hostNb; j++) { - xbt_dynar_t route=NULL; + if (p_communicationAmount != NULL) { + for (i = 0; i < hostNb; i++) { + for (j = 0; j < hostNb; j++) { + xbt_dynar_t route=NULL; - if (p_communicationAmount[i * hostNb + j] > 0) { - double lat = 0.0; - routing_platf->getRouteAndLatency((*p_edgeList)[i], (*p_edgeList)[j], - &route, &lat); + if (p_communicationAmount[i * hostNb + j] > 0) { + double lat = 0.0; + routing_platf->getRouteAndLatency((*p_netcardList)[i], (*p_netcardList)[j], + &route, &lat); - lat_current = MAX(lat_current, lat * p_communicationAmount[i * hostNb + j]); + lat_current = MAX(lat_current, lat * p_communicationAmount[i * hostNb + j]); + } } } } @@ -646,9 +603,10 @@ void L07Action::updateBound() XBT_DEBUG("action (%p) : lat_bound = %g", this, lat_bound); if ((m_latency == 0.0) && (m_suspended == 0)) { if (m_rate < 0) - lmm_update_variable_bound(ptask_maxmin_system, getVariable(), lat_bound); + lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), lat_bound); else - lmm_update_variable_bound(ptask_maxmin_system, getVariable(), min(m_rate, lat_bound)); + lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), + std::min(m_rate, lat_bound)); } } @@ -659,25 +617,19 @@ int L07Action::unref() if (action_hook.is_linked()) p_stateSet->erase(p_stateSet->iterator_to(*this)); if (getVariable()) - lmm_variable_free(ptask_maxmin_system, getVariable()); + lmm_variable_free(getModel()->getMaxminSystem(), getVariable()); delete this; return 1; } return 0; } -void L07Action::cancel() -{ - setState(SURF_ACTION_FAILED); - return; -} - void L07Action::suspend() { XBT_IN("(%p))", this); if (m_suspended != 2) { m_suspended = 1; - lmm_update_variable_weight(ptask_maxmin_system, getVariable(), 0.0); + lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 0.0); } XBT_OUT(); } @@ -686,17 +638,12 @@ void L07Action::resume() { XBT_IN("(%p)", this); if (m_suspended != 2) { - lmm_update_variable_weight(ptask_maxmin_system, getVariable(), 1.0); + lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 1.0); m_suspended = 0; } XBT_OUT(); } -bool L07Action::isSuspended() -{ - return m_suspended == 1; -} - void L07Action::setMaxDuration(double duration) { /* FIXME: should inherit */ XBT_IN("(%p,%g)", this, duration); @@ -717,3 +664,6 @@ double L07Action::getRemains() XBT_OUT(); return m_remains; } + +} +}