From: Fabien Chaix Date: Fri, 29 Nov 2019 12:53:37 +0000 (+0200) Subject: Avoid allocation inside lmm_solve X-Git-Tag: v3.25~339^2^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/1e4aad723882816a925d77a90007a91680a2b5d4?ds=sidebyside Avoid allocation inside lmm_solve --- diff --git a/src/kernel/lmm/maxmin.cpp b/src/kernel/lmm/maxmin.cpp index 10499a0de4..0eac307a9b 100644 --- a/src/kernel/lmm/maxmin.cpp +++ b/src/kernel/lmm/maxmin.cpp @@ -137,7 +137,8 @@ void System::var_free(Variable* var) XBT_OUT(); } -System::System(bool selective_update) : selective_update_active(selective_update) +System::System(bool selective_update) : cnst_light_tab(NULL),cnst_light_max_size(0), + selective_update_active(selective_update) { XBT_DEBUG("Setting selective_update_active flag to %d", selective_update_active); @@ -159,6 +160,9 @@ System::~System() while ((cnst = extract_constraint())) cnst_free(cnst); + if(cnst_light_tab) + delete[] cnst_light_tab; + xbt_mallocator_free(variable_mallocator_); delete modified_set_; } @@ -504,18 +508,14 @@ template void System::lmm_solve(CnstList& cnst_list) double min_usage = -1; double min_bound = -1; - XBT_DEBUG("Active constraints : %zu", cnst_list.size()); - /* Init: Only modified code portions: reset the value of active variables */ - for (Constraint const& cnst : cnst_list) { - for (Element const& elem : cnst.enabled_element_set_) { - xbt_assert(elem.variable->sharing_penalty_ > 0.0); - elem.variable->value_ = 0.0; - } + if(cnst_list.size()>cnst_light_max_size){ + cnst_light_max_size=cnst_list.size()*2; + if(cnst_light_tab) + delete [] cnst_light_tab; + cnst_light_tab=new ConstraintLight[cnst_light_max_size](); } - ConstraintLight* cnst_light_tab = new ConstraintLight[cnst_list.size()](); int cnst_light_num = 0; - dyn_light_t saturated_constraints; for (Constraint& cnst : cnst_list) { /* INIT: Collect constraints that actually need to be saturated (i.e remaining and usage are strictly positive) @@ -526,6 +526,7 @@ template void System::lmm_solve(CnstList& cnst_list) cnst.usage_ = 0; for (Element& elem : cnst.enabled_element_set_) { xbt_assert(elem.variable->sharing_penalty_ > 0); + elem.variable->value_ = 0.0; if (elem.consumption_weight > 0) { if (cnst.sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE) cnst.usage_ += elem.consumption_weight / elem.variable->sharing_penalty_; @@ -554,10 +555,31 @@ template void System::lmm_solve(CnstList& cnst_list) } } +#if MAXMIN_PROF==CSV_PROF + start_init2 = high_resolution_clock::now();//FABIENDBG +#endif + saturated_variable_set_update(cnst_light_tab, saturated_constraints, this); + + +#if MAXMIN_PROF==CSV_PROF + high_resolution_clock::time_point start_main = high_resolution_clock::now();//FABIENDBG + int NVars=saturated_variable_set.size();//FABIENDBG + float init_duration1=duration_cast >(start_init2 - start_init).count();//FABIENDBG + float init_duration2=duration_cast >(start_main - start_init2).count();//FABIENDBG + float loop_duration;//FABIENDBG + float loop_max=0;//FABIENDBG + float loop_min=1E9;//FABIENDBG + float loop_avg=0;//FABIENDBG + float loop_std=0;//FABIENDBG + int loop_count=0;//FABIENDBG + high_resolution_clock::time_point start_loop,end_loop;//FABIENDBG +#endif /* Saturated variables update */ do { + high_resolution_clock::time_point start_loop = high_resolution_clock::now();//FABIENDBG + /* Fix the variables that have to be */ auto& var_list = saturated_variable_set; for (Variable const& var : var_list) { @@ -689,7 +711,6 @@ template void System::lmm_solve(CnstList& cnst_list) check_concurrency(); - delete[] cnst_light_tab; } /** @brief Attribute the value bound to var->bound. diff --git a/src/kernel/lmm/maxmin.hpp b/src/kernel/lmm/maxmin.hpp index cc4ed51dbb..f1196b72aa 100644 --- a/src/kernel/lmm/maxmin.hpp +++ b/src/kernel/lmm/maxmin.hpp @@ -531,6 +531,14 @@ public: resource::Action::ModifiedSet* modified_set_ = nullptr; private: + + typedef std::vector dyn_light_t; + + //Data used in lmm::solve + ConstraintLight* cnst_light_tab; + unsigned int cnst_light_max_size; + dyn_light_t saturated_constraints; + bool selective_update_active; /* flag to update partially the system only selecting changed portions */ unsigned visited_counter_ = 1; /* used by System::update_modified_set() and System::remove_all_modified_set() to * cleverly (un-)flag the constraints (more details in these functions) */