X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1b4dc02411d79e4c367d331b85c1b295ec41edff..1ebb8e111d904fea559e48ec193c1f7c5dee2245:/src/surf/network_cm02.cpp diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index f5caa3ad5f..68bba7058f 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -3,15 +3,16 @@ /* 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 "network_cm02.hpp" #include "simgrid/s4u/Host.hpp" #include "simgrid/sg_config.hpp" +#include "src/kernel/resource/profile/Event.hpp" #include "src/surf/surf_interface.hpp" #include "surf/surf.hpp" +#include +#include + XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network); double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */ @@ -65,59 +66,6 @@ void surf_network_model_init_CM02() surf_network_model = new simgrid::kernel::resource::NetworkCm02Model(); } -/***************************************************************************/ -/* The models from Steven H. Low */ -/***************************************************************************/ -/* @article{Low03, */ -/* author={Steven H. Low}, */ -/* title={A Duality Model of {TCP} and Queue Management Algorithms}, */ -/* year={2003}, */ -/* journal={{IEEE/ACM} Transactions on Networking}, */ -/* volume={11}, number={4}, */ -/* } */ -void surf_network_model_init_Reno() -{ - xbt_assert(surf_network_model == nullptr, "Cannot set the network model twice"); - - namespace lmm = simgrid::kernel::lmm; - lmm::Lagrange::set_default_protocol_function(lmm::func_reno_f, lmm::func_reno_fp, lmm::func_reno_fpi); - - simgrid::config::set_default("network/latency-factor", 13.01); - simgrid::config::set_default("network/bandwidth-factor", 0.97); - simgrid::config::set_default("network/weight-S", 20537); - - surf_network_model = new simgrid::kernel::resource::NetworkCm02Model(&simgrid::kernel::lmm::make_new_lagrange_system); -} - - -void surf_network_model_init_Reno2() -{ - xbt_assert(surf_network_model == nullptr, "Cannot set the network model twice"); - - namespace lmm = simgrid::kernel::lmm; - lmm::Lagrange::set_default_protocol_function(lmm::func_reno2_f, lmm::func_reno2_fp, lmm::func_reno2_fpi); - - simgrid::config::set_default("network/latency-factor", 13.01); - simgrid::config::set_default("network/bandwidth-factor", 0.97); - simgrid::config::set_default("network/weight-S", 20537); - - surf_network_model = new simgrid::kernel::resource::NetworkCm02Model(&simgrid::kernel::lmm::make_new_lagrange_system); -} - -void surf_network_model_init_Vegas() -{ - xbt_assert(surf_network_model == nullptr, "Cannot set the network model twice"); - - namespace lmm = simgrid::kernel::lmm; - lmm::Lagrange::set_default_protocol_function(lmm::func_vegas_f, lmm::func_vegas_fp, lmm::func_vegas_fpi); - - simgrid::config::set_default("network/latency-factor", 13.01); - simgrid::config::set_default("network/bandwidth-factor", 0.97); - simgrid::config::set_default("network/weight-S", 20537); - - surf_network_model = new simgrid::kernel::resource::NetworkCm02Model(&simgrid::kernel::lmm::make_new_lagrange_system); -} - namespace simgrid { namespace kernel { namespace resource { @@ -157,7 +105,7 @@ void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/) // if I am wearing a latency hat if (action->get_type() == ActionHeap::Type::latency) { XBT_DEBUG("Latency paid for action %p. Activating", action); - get_maxmin_system()->update_variable_weight(action->get_variable(), action->weight_); + get_maxmin_system()->update_variable_penalty(action->get_variable(), action->sharing_penalty_); get_action_heap().remove(action); action->set_last_update(); @@ -172,7 +120,7 @@ void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/) } } -void NetworkCm02Model::update_actions_state_full(double now, double delta) +void NetworkCm02Model::update_actions_state_full(double /*now*/, double delta) { for (auto it = std::begin(*get_started_action_set()); it != std::end(*get_started_action_set());) { NetworkCm02Action& action = static_cast(*it); @@ -188,7 +136,7 @@ void NetworkCm02Model::update_actions_state_full(double now, double delta) action.latency_ = 0.0; } if (action.latency_ <= 0.0 && not action.is_suspended()) - get_maxmin_system()->update_variable_weight(action.get_variable(), action.weight_); + get_maxmin_system()->update_variable_penalty(action.get_variable(), action.sharing_penalty_); } if (not action.get_variable()->get_number_of_constraint()) { @@ -199,11 +147,11 @@ void NetworkCm02Model::update_actions_state_full(double now, double delta) } action.update_remains(action.get_variable()->get_value() * delta); - if (action.get_max_duration() > NO_MAX_DURATION) + if (action.get_max_duration() != NO_MAX_DURATION) action.update_max_duration(delta); - if (((action.get_remains() <= 0) && (action.get_variable()->get_weight() > 0)) || - ((action.get_max_duration() > NO_MAX_DURATION) && (action.get_max_duration() <= 0))) { + if (((action.get_remains() <= 0) && (action.get_variable()->get_penalty() > 0)) || + ((action.get_max_duration() != NO_MAX_DURATION) && (action.get_max_duration() <= 0))) { action.finish(Action::State::FINISHED); } } @@ -222,16 +170,17 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz "You're trying to send data from %s to %s but there is no connecting path between these two hosts.", src->get_cname(), dst->get_cname()); - bool failed = std::any_of(route.begin(), route.end(), [](LinkImpl* link) { return link->is_off(); }); + bool failed = std::any_of(route.begin(), route.end(), [](const LinkImpl* link) { return not link->is_on(); }); if (cfg_crosstraffic) { dst->route_to(src, back_route, nullptr); if (not failed) - failed = std::any_of(back_route.begin(), back_route.end(), [](LinkImpl* const& link) { return link->is_off(); }); + failed = + std::any_of(back_route.begin(), back_route.end(), [](const LinkImpl* link) { return not link->is_on(); }); } NetworkCm02Action *action = new NetworkCm02Action(this, size, failed); - action->weight_ = latency; + action->sharing_penalty_ = latency; action->latency_ = latency; action->rate_ = rate; if (get_update_algorithm() == Model::UpdateAlgo::LAZY) { @@ -239,8 +188,8 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz } if (sg_weight_S_parameter > 0) { - action->weight_ = - std::accumulate(route.begin(), route.end(), action->weight_, [](double total, LinkImpl* const& link) { + action->sharing_penalty_ = + std::accumulate(route.begin(), route.end(), action->sharing_penalty_, [](double total, LinkImpl* const& link) { return total + sg_weight_S_parameter / link->get_bandwidth(); }); } @@ -295,7 +244,7 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz } XBT_OUT(); - simgrid::s4u::Link::on_communicate(action, src, dst); + simgrid::s4u::Link::on_communicate(*action, src, dst); return action; } @@ -318,7 +267,17 @@ NetworkCm02Link::NetworkCm02Link(NetworkCm02Model* model, const std::string& nam simgrid::s4u::Link::on_creation(this->piface_); } -void NetworkCm02Link::apply_event(tmgr_trace_event_t triggered, double value) +NetworkCm02Link::NetworkCm02Link(NetworkCm02Model* model, const std::string& name, std::vector bandwidths, + s4u::Link::SharingPolicy policy, lmm::System* system) + : NetworkCm02Link(model, name, 0, 0, policy, system) +{ + /* Setup Metrics for bandwidths_ */ + for (auto bandwith : bandwidths) { + bandwidths_.push_back({bandwith, 1.0, nullptr}); + } +} + +void NetworkCm02Link::apply_event(kernel::profile::Event* triggered, double value) { /* Find out which of my iterators was triggered, and react accordingly */ if (triggered == bandwidth_.event) { @@ -333,19 +292,7 @@ void NetworkCm02Link::apply_event(tmgr_trace_event_t triggered, double value) if (value > 0) turn_on(); else { - kernel::lmm::Variable* var = nullptr; - const kernel::lmm::Element* elem = nullptr; - double now = surf_get_clock(); - turn_off(); - while ((var = get_constraint()->get_variable(&elem))) { - Action* action = static_cast(var->get_id()); - - if (action->get_state() == Action::State::INITED || action->get_state() == Action::State::STARTED) { - action->set_finish_time(now); - action->set_state(Action::State::FAILED); - } - } } tmgr_trace_event_unref(&state_event_); } else { @@ -374,9 +321,9 @@ void NetworkCm02Link::set_bandwidth(double value) int numelem = 0; while ((var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem))) { NetworkCm02Action* action = static_cast(var->get_id()); - action->weight_ += delta; + action->sharing_penalty_ += delta; if (not action->is_suspended()) - get_model()->get_maxmin_system()->update_variable_weight(action->get_variable(), action->weight_); + get_model()->get_maxmin_system()->update_variable_penalty(action->get_variable(), action->sharing_penalty_); } } } @@ -394,7 +341,7 @@ void NetworkCm02Link::set_latency(double value) while ((var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem))) { NetworkCm02Action* action = static_cast(var->get_id()); action->lat_current_ += delta; - action->weight_ += delta; + action->sharing_penalty_ += delta; if (action->rate_ < 0) get_model()->get_maxmin_system()->update_variable_bound(action->get_variable(), NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)); @@ -409,7 +356,7 @@ void NetworkCm02Link::set_latency(double value) } } if (not action->is_suspended()) - get_model()->get_maxmin_system()->update_variable_weight(action->get_variable(), action->weight_); + get_model()->get_maxmin_system()->update_variable_penalty(action->get_variable(), action->sharing_penalty_); } } @@ -419,11 +366,10 @@ void NetworkCm02Link::set_latency(double value) void NetworkCm02Action::update_remains_lazy(double now) { - if (suspended_ != Action::SuspendStates::not_suspended) + if (not is_running()) return; - double delta = now - get_last_update(); - double max_duration = get_max_duration(); + double delta = now - get_last_update(); if (get_remains_no_update() > 0) { XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, get_remains_no_update(), @@ -433,13 +379,10 @@ void NetworkCm02Action::update_remains_lazy(double now) XBT_DEBUG("Updating action(%p): remains is now %f", this, get_remains_no_update()); } - if (max_duration > NO_MAX_DURATION) { - double_update(&max_duration, delta, sg_surf_precision); - set_max_duration(max_duration); - } + update_max_duration(delta); - if ((get_remains_no_update() <= 0 && (get_variable()->get_weight() > 0)) || - ((max_duration > NO_MAX_DURATION) && (max_duration <= 0))) { + if ((get_remains_no_update() <= 0 && (get_variable()->get_penalty() > 0)) || + ((get_max_duration() != NO_MAX_DURATION) && (get_max_duration() <= 0))) { finish(Action::State::FINISHED); get_model()->get_action_heap().remove(this); }