Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Sorry ;)
[simgrid.git] / src / surf / network.c
index 66c1d28..af6e1ed 100644 (file)
@@ -26,7 +26,6 @@
 #undef GENERIC_ACTION
 #define GENERIC_ACTION(action) action->generic_action
 
-
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
                                 "Logging specific to the SURF network module");
 
@@ -34,6 +33,15 @@ surf_model_t surf_network_model = NULL;
 static lmm_system_t network_maxmin_system = NULL;
 static void (*network_solve) (lmm_system_t) = NULL;
 
+xbt_dynar_t smpi_bw_factor = NULL;
+xbt_dynar_t smpi_lat_factor = NULL;
+
+typedef struct s_smpi_factor *smpi_factor_t;
+typedef struct s_smpi_factor {
+       long factor;
+       double value;
+} s_smpi_factor_t;
+
 double sg_sender_gap = 0.0;
 double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
 double sg_bandwidth_factor = 1.0;       /* default value; can be set by model or from command line */
@@ -52,7 +60,6 @@ static void update_action_remaining(double now);
 
 static xbt_swag_t net_modified_set = NULL;
 static xbt_heap_t net_action_heap = NULL;
-xbt_swag_t keep_track = NULL;
 
 /* added to manage the communication action's heap */
 static void net_action_update_index_heap(void *action, int i)
@@ -73,7 +80,7 @@ static void heap_insert(surf_action_network_CM02_t    action, double key, enum h
 }
 
 static void heap_remove(surf_action_network_CM02_t action){
-  action->hat = NONE;
+  action->hat = NOTSET;
   if(((surf_action_network_CM02_t) action)->index_heap >= 0){
       xbt_heap_remove(net_action_heap,action->index_heap);
   }
@@ -101,33 +108,61 @@ static double constant_bandwidth_constraint(double rate, double bound,
 /**********************/
 /*   SMPI callbacks   */
 /**********************/
+static xbt_dynar_t parse_factor(const char *smpi_coef_string)
+{
+       char *value = NULL;
+       unsigned int iter = 0;
+       s_smpi_factor_t fact;
+       xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL;
+
+       smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
+       radical_elements = xbt_str_split(smpi_coef_string, ";");
+       xbt_dynar_foreach(radical_elements, iter, value) {
+
+               radical_elements2 = xbt_str_split(value, ":");
+               if(xbt_dynar_length(radical_elements2) != 2)
+                       xbt_die("Malformed radical for smpi factor!");
+               fact.factor = atol(xbt_dynar_get_as(radical_elements2,0,char*));
+               fact.value = atof(xbt_dynar_get_as(radical_elements2,1,char*));
+               xbt_dynar_push_as(smpi_factor,s_smpi_factor_t,fact);
+               XBT_DEBUG("smpi_factor:\t%ld : %f",fact.factor,fact.value);
+               xbt_dynar_free(&radical_elements2);
+       }
+       xbt_dynar_free(&radical_elements);
+       return smpi_factor;
+}
+
 static double smpi_bandwidth_factor(double size)
 {
+       if(!smpi_bw_factor)
+               smpi_bw_factor = parse_factor( xbt_cfg_get_string(_surf_cfg_set,"smpi/bw_factor") );
+
+       unsigned int iter = 0;
+       s_smpi_factor_t fact;
+       xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
+               if(size >= fact.factor){
+                       XBT_DEBUG("%lf >= %ld return %f",size,fact.factor,fact.value);
+                       return fact.value;
+               }
+       }
 
-    if (size >= 65472) return 0.940694;
-    if (size >= 15424) return 0.697866;
-    if (size >= 9376) return 0.58729;
-    if (size >= 5776) return 1.08739;
-    if (size >= 3484) return 0.77493;
-    if (size >= 1426) return 0.608902;
-    if (size >= 732) return 0.341987;
-    if (size >= 257) return 0.338112;
-    if (size >= 0) return 0.812084;
     return 1.0;
 }
 
 static double smpi_latency_factor(double size)
 {
+       if(!smpi_lat_factor)
+               smpi_lat_factor = parse_factor( xbt_cfg_get_string(_surf_cfg_set,"smpi/lat_factor") );
+
+       unsigned int iter = 0;
+       s_smpi_factor_t fact;
+       xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
+               if(size >= fact.factor){
+                       XBT_DEBUG("%lf >= %ld return %f",size,fact.factor,fact.value);
+                       return fact.value;
+               }
+       }
 
-    if (size >= 65472) return 11.6436;
-    if (size >= 15424) return 3.48845;
-    if (size >= 9376) return 2.59299;
-    if (size >= 5776) return 2.18796;
-    if (size >= 3484) return 1.88101;
-    if (size >= 1426) return 1.61075;
-    if (size >= 732) return 1.9503;
-    if (size >= 257) return 1.95341;
-    if (size >= 0) return 2.01467;
     return 1.0;
 }
 /**--------- <copy/paste C code snippet in surf/network.c> -----------*/
@@ -337,7 +372,7 @@ void net_action_recycle(surf_action_t action)
 }
 
 #ifdef HAVE_LATENCY_BOUND_TRACKING
-static int net_get_link_latency_limited(surf_action_t action)
+int net_get_link_latency_limited(surf_action_t action)
 {
   return action->latency_limited;
 }
@@ -429,9 +464,7 @@ static double net_share_resources_lazy(double now)
   XBT_DEBUG("Before share resources, the size of modified actions set is %d", xbt_swag_size(net_modified_set));
   update_action_remaining(now);
 
-  keep_track = net_modified_set;
   lmm_solve(network_maxmin_system);
-  keep_track = NULL;
 
   XBT_DEBUG("After share resources, The size of modified actions set is %d", xbt_swag_size(net_modified_set));
 
@@ -929,6 +962,11 @@ static void net_finalize(void)
     xbt_heap_free(net_action_heap);
     xbt_swag_free(net_modified_set);
   }
+
+  if(smpi_bw_factor)
+         xbt_dynar_free(&smpi_bw_factor);
+  if(smpi_lat_factor)
+         xbt_dynar_free(&smpi_lat_factor);
 }
 
 static void smpi_gap_append(double size, const link_CM02_t link, surf_action_network_CM02_t action) {
@@ -1039,8 +1077,8 @@ static void surf_network_model_init_internal(void)
   if(network_update_mechanism == UM_LAZY){
     net_action_heap = xbt_heap_new(8,NULL);
     xbt_heap_set_update_callback(net_action_heap, net_action_update_index_heap);
-    net_modified_set =
-        xbt_swag_new(xbt_swag_offset(comm, action_list_hookup));
+    net_modified_set = xbt_swag_new(xbt_swag_offset(comm, action_list_hookup));
+    network_maxmin_system->keep_track = net_modified_set;
   }
 }
 
@@ -1123,9 +1161,9 @@ void surf_network_model_init_LegrandVelho(void)
   xbt_dynar_push(model_list, &surf_network_model);
   network_solve = lmm_solve;
 
-  xbt_cfg_setdefault_double(_surf_cfg_set, "network/latency_factor", 10.4); // 13.01 when callibration is done without phase effects
-  xbt_cfg_setdefault_double(_surf_cfg_set, "network/bandwidth_factor",0.92);// 0.97 when callibration is done without phase effects
-  xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775);       // 20537 when callibration is done without phase effects
+  xbt_cfg_setdefault_double(_surf_cfg_set, "network/latency_factor", 13.01);
+  xbt_cfg_setdefault_double(_surf_cfg_set, "network/bandwidth_factor",0.97);
+  xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 20537);
 }
 
 /***************************************************************************/