Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Avoid allocation inside lmm_solve
[simgrid.git] / src / kernel / lmm / maxmin.cpp
index 1cc6c4e..0eac307 100644 (file)
@@ -31,7 +31,7 @@ int Element::get_concurrency() const
 {
   // Ignore element with weight less than one (e.g. cross-traffic)
   return (consumption_weight >= 1) ? 1 : 0;
-  // There are other alternatives, but they will change the behaviour of the model..
+  // There are other alternatives, but they will change the behavior of the model..
   // So do not use it unless you want to make a new model.
   // If you do, remember to change the variables concurrency share to reflect it.
   // Potential examples are:
@@ -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_;
 }
@@ -236,7 +240,7 @@ void System::expand(Constraint* cnst, Variable* var, double consumption_weight)
   modified_ = true;
 
   // Check if this variable already has an active element in this constraint
-  // If it does, substract it from the required slack
+  // If it does, subtract it from the required slack
   int current_share = 0;
   if (var->concurrency_share_ > 1) {
     for (Element& elem : var->cnsts_) {
@@ -504,18 +508,14 @@ template <class CnstList> 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 <class CnstList> 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 <class CnstList> 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<duration<float> >(start_init2 - start_init).count();//FABIENDBG
+  float init_duration2=duration_cast<duration<float> >(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) {
@@ -597,7 +619,7 @@ template <class CnstList> void System::lmm_solve(CnstList& cnst_list)
       XBT_DEBUG("Min usage: %f, Var(%d).penalty: %f, Var(%d).value: %f ", min_usage, var.rank_, var.sharing_penalty_,
                 var.rank_, var.value_);
 
-      /* Update the usage of contraints where this variable is involved */
+      /* Update the usage of constraints where this variable is involved */
       for (Element& elem : var.cnsts_) {
         Constraint* cnst = elem.constraint;
         if (cnst->sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE) {
@@ -689,7 +711,6 @@ template <class CnstList> void System::lmm_solve(CnstList& cnst_list)
 
   check_concurrency();
 
-  delete[] cnst_light_tab;
 }
 
 /** @brief Attribute the value bound to var->bound.
@@ -927,7 +948,7 @@ void System::remove_all_modified_set()
   // In effect, the var->visited value will no more be equal to visited counter
   // To be clean, when visited counter has wrapped around, we force these var->visited values so that variables that
   // were in the modified a long long time ago are not wrongly skipped here, which would lead to very nasty bugs
-  // (i.e. not readibily reproducible, and requiring a lot of run time before happening).
+  // (i.e. not readily reproducible, and requiring a lot of run time before happening).
   if (++visited_counter_ == 1) {
     /* the counter wrapped around, reset each variable->visited */
     for (Variable& var : variable_set)