X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d0b9afc4d105022cc05b5b13ec06af6479dda020..9caf173e476622d309cc5653a83d224d05787cc7:/src/surf/network_cm02.cpp diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index 72bce2129b..64f405bd87 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -7,7 +7,7 @@ #include "network_cm02.hpp" #include "simgrid/s4u/Host.hpp" -#include "simgrid/sg_config.h" +#include "simgrid/sg_config.hpp" #include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals #include "src/kernel/lmm/maxmin.hpp" @@ -134,27 +134,21 @@ void surf_network_model_init_Vegas() namespace simgrid { namespace surf { -NetworkCm02Model::NetworkCm02Model(kernel::lmm::System* (*make_new_lmm_system)(bool)) : NetworkModel() +NetworkCm02Model::NetworkCm02Model(kernel::lmm::System* (*make_new_lmm_system)(bool)) + : NetworkModel(xbt_cfg_get_string("network/optim") == "Full" ? kernel::resource::Model::UpdateAlgo::Full + : kernel::resource::Model::UpdateAlgo::Lazy) { std::string optim = xbt_cfg_get_string("network/optim"); bool select = xbt_cfg_get_boolean("network/maxmin-selective-update"); - if (optim == "Full") { - setUpdateMechanism(kernel::resource::Model::UpdateAlgo::Full); - } else if (optim == "Lazy") { + if (optim == "Lazy") { xbt_assert(select || xbt_cfg_is_default_value("network/maxmin-selective-update"), "You cannot disable network selective update when using the lazy update mechanism"); select = true; - setUpdateMechanism(kernel::resource::Model::UpdateAlgo::Lazy); - } else { - xbt_die("Unsupported optimization (%s) for this model. Accepted: Full, Lazy.", optim.c_str()); } set_maxmin_system(make_new_lmm_system(select)); loopback_ = NetworkCm02Model::createLink("__loopback__", 498000000, 0.000015, SURF_LINK_FATPIPE); - - if (getUpdateMechanism() == kernel::resource::Model::UpdateAlgo::Lazy) - get_maxmin_system()->modified_set_ = new kernel::resource::Action::ModifiedSet(); } LinkImpl* NetworkCm02Model::createLink(const std::string& name, double bandwidth, double latency, @@ -165,9 +159,9 @@ LinkImpl* NetworkCm02Model::createLink(const std::string& name, double bandwidth void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/) { - while (not actionHeapIsEmpty() && double_equals(actionHeapTopDate(), now, sg_surf_precision)) { + while (not get_action_heap().empty() && double_equals(get_action_heap().top_date(), now, sg_surf_precision)) { - NetworkCm02Action* action = static_cast(actionHeapPop()); + NetworkCm02Action* action = static_cast(get_action_heap().pop()); XBT_DEBUG("Something happened to action %p", action); if (TRACE_is_enabled()) { int n = action->get_variable()->get_number_of_constraint(); @@ -176,26 +170,26 @@ void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/) kernel::lmm::Constraint* constraint = action->get_variable()->get_constraint(i); NetworkCm02Link* link = static_cast(constraint->get_id()); double value = action->get_variable()->get_value() * action->get_variable()->get_constraint_weight(i); - TRACE_surf_link_set_utilization(link->getCname(), action->get_category(), value, action->get_last_update(), + TRACE_surf_link_set_utilization(link->get_cname(), action->get_category(), value, action->get_last_update(), now - action->get_last_update()); } } // if I am wearing a latency hat - if (action->get_type() == kernel::resource::Action::Type::LATENCY) { + if (action->get_type() == kernel::resource::ActionHeap::Type::latency) { XBT_DEBUG("Latency paid for action %p. Activating", action); get_maxmin_system()->update_variable_weight(action->get_variable(), action->weight_); - action->heapRemove(); + get_action_heap().remove(action); action->set_last_update(); // if I am wearing a max_duration or normal hat - } else if (action->get_type() == kernel::resource::Action::Type::MAX_DURATION || - action->get_type() == kernel::resource::Action::Type::NORMAL) { + } else if (action->get_type() == kernel::resource::ActionHeap::Type::max_duration || + action->get_type() == kernel::resource::ActionHeap::Type::normal) { // no need to communicate anymore // assume that flows that reached max_duration have remaining of 0 XBT_DEBUG("Action %p finished", action); action->finish(kernel::resource::Action::State::done); - action->heapRemove(); + get_action_heap().remove(action); } } } @@ -224,7 +218,7 @@ void NetworkCm02Model::update_actions_state_full(double now, double delta) kernel::lmm::Constraint* constraint = action.get_variable()->get_constraint(i); NetworkCm02Link* link = static_cast(constraint->get_id()); TRACE_surf_link_set_utilization( - link->getCname(), action.get_category(), + link->get_cname(), action.get_category(), (action.get_variable()->get_value() * action.get_variable()->get_constraint_weight(i)), action.get_last_update(), now - action.get_last_update()); } @@ -254,12 +248,12 @@ kernel::resource::Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Hos std::vector back_route; std::vector route; - XBT_IN("(%s,%s,%g,%g)", src->getCname(), dst->getCname(), size, rate); + XBT_IN("(%s,%s,%g,%g)", src->get_cname(), dst->get_cname(), size, rate); src->routeTo(dst, route, &latency); xbt_assert(not route.empty() || latency, "You're trying to send data from %s to %s but there is no connecting path between these two hosts.", - src->getCname(), dst->getCname()); + src->get_cname(), dst->get_cname()); for (auto const& link : route) if (link->isOff()) @@ -276,7 +270,7 @@ kernel::resource::Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Hos action->weight_ = latency; action->latency_ = latency; action->rate_ = rate; - if (getUpdateMechanism() == kernel::resource::Model::UpdateAlgo::Lazy) { + if (get_update_algorithm() == kernel::resource::Model::UpdateAlgo::Lazy) { action->set_last_update(); } @@ -290,7 +284,7 @@ kernel::resource::Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Hos bandwidth_bound = (bandwidth_bound < 0.0) ? bb : std::min(bandwidth_bound, bb); } - action->latCurrent_ = action->latency_; + action->lat_current_ = action->latency_; action->latency_ *= latencyFactor(size); action->rate_ = bandwidthConstraint(action->rate_, bandwidth_bound, size); @@ -299,24 +293,29 @@ kernel::resource::Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Hos if (action->latency_ > 0) { action->set_variable(get_maxmin_system()->variable_new(action, 0.0, -1.0, constraints_per_variable)); - if (getUpdateMechanism() == kernel::resource::Model::UpdateAlgo::Lazy) { + if (get_update_algorithm() == kernel::resource::Model::UpdateAlgo::Lazy) { // add to the heap the event when the latency is payed - XBT_DEBUG("Added action (%p) one latency event at date %f", action, action->latency_ + action->get_last_update()); - action->heapInsert(action->latency_ + action->get_last_update(), route.empty() - ? kernel::resource::Action::Type::NORMAL - : kernel::resource::Action::Type::LATENCY); + double date = action->latency_ + action->get_last_update(); + kernel::resource::ActionHeap::Type type; + if (route.empty()) + type = kernel::resource::ActionHeap::Type::normal; + else + type = kernel::resource::ActionHeap::Type::latency; + + XBT_DEBUG("Added action (%p) one latency event at date %f", action, date); + get_action_heap().insert(action, date, type); } } else action->set_variable(get_maxmin_system()->variable_new(action, 1.0, -1.0, constraints_per_variable)); if (action->rate_ < 0) { get_maxmin_system()->update_variable_bound( - action->get_variable(), (action->latCurrent_ > 0) ? sg_tcp_gamma / (2.0 * action->latCurrent_) : -1.0); + action->get_variable(), (action->lat_current_ > 0) ? sg_tcp_gamma / (2.0 * action->lat_current_) : -1.0); } else { - get_maxmin_system()->update_variable_bound(action->get_variable(), - (action->latCurrent_ > 0) - ? std::min(action->rate_, sg_tcp_gamma / (2.0 * action->latCurrent_)) - : action->rate_); + get_maxmin_system()->update_variable_bound( + action->get_variable(), (action->lat_current_ > 0) + ? std::min(action->rate_, sg_tcp_gamma / (2.0 * action->lat_current_)) + : action->rate_); } for (auto const& link : route) @@ -400,7 +399,8 @@ void NetworkCm02Link::setBandwidth(double value) model()->get_maxmin_system()->update_constraint_bound(constraint(), sg_bandwidth_factor * (bandwidth_.peak * bandwidth_.scale)); - TRACE_surf_link_set_bandwidth(surf_get_clock(), getCname(), sg_bandwidth_factor * bandwidth_.peak * bandwidth_.scale); + TRACE_surf_link_set_bandwidth(surf_get_clock(), get_cname(), + sg_bandwidth_factor * bandwidth_.peak * bandwidth_.scale); if (sg_weight_S_parameter > 0) { double delta = sg_weight_S_parameter / value - sg_weight_S_parameter / (bandwidth_.peak * bandwidth_.scale); @@ -430,19 +430,19 @@ void NetworkCm02Link::setLatency(double value) while ((var = constraint()->get_variable_safe(&elem, &nextelem, &numelem))) { NetworkCm02Action* action = static_cast(var->get_id()); - action->latCurrent_ += delta; + action->lat_current_ += delta; action->weight_ += delta; if (action->rate_ < 0) model()->get_maxmin_system()->update_variable_bound(action->get_variable(), - sg_tcp_gamma / (2.0 * action->latCurrent_)); + sg_tcp_gamma / (2.0 * action->lat_current_)); else { model()->get_maxmin_system()->update_variable_bound( - action->get_variable(), std::min(action->rate_, sg_tcp_gamma / (2.0 * action->latCurrent_))); + action->get_variable(), std::min(action->rate_, sg_tcp_gamma / (2.0 * action->lat_current_))); - if (action->rate_ < sg_tcp_gamma / (2.0 * action->latCurrent_)) { + if (action->rate_ < sg_tcp_gamma / (2.0 * action->lat_current_)) { XBT_INFO("Flow is limited BYBANDWIDTH"); } else { - XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", action->latCurrent_); + XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", action->lat_current_); } } if (not action->is_suspended()) @@ -478,7 +478,7 @@ void NetworkCm02Action::update_remains_lazy(double now) if ((get_remains_no_update() <= 0 && (get_variable()->get_weight() > 0)) || ((max_duration > NO_MAX_DURATION) && (max_duration <= 0))) { finish(Action::State::done); - heapRemove(); + get_model()->get_action_heap().remove(this); } set_last_update();