Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Allow selective update to be independently set for cpu and network model.
[simgrid.git] / src / surf / network_im.c
index 56b90df..8b62c88 100644 (file)
@@ -45,7 +45,8 @@ int sg_network_crosstraffic = 0;
 
 xbt_dict_t gap_lookup = NULL;
 
-e_UM_t network_update_mechanism = UM_FULL;
+e_UM_t network_update_mechanism = UM_UNDEFINED;
+static int selective_update = 0;
 
 typedef struct network_link_CM02_im {
   s_surf_resource_lmm_t lmm_resource;   /* must remain first to be added to a trace */
@@ -402,7 +403,7 @@ static void update_action_remaining(double now){
   }
 }
 
-static double net_share_resources(double now)
+static double net_share_resources_full(double now)
 {
   s_surf_action_network_CM02_im_t s_action;
   surf_action_network_CM02_im_t action = NULL;
@@ -439,7 +440,7 @@ static double net_share_resources(double now)
   return min;
 }
 
-static double im_net_share_resources(double now)
+static double net_share_resources_lazy(double now)
 {
   surf_action_network_CM02_im_t action = NULL;
   double min=-1;
@@ -513,20 +514,7 @@ static double im_net_share_resources(double now)
   return min;
 }
 
-static double generic_net_share_resources(double now)
-{
-  if(network_update_mechanism == UM_LAZY)
-    return im_net_share_resources(now);
-  else if (network_update_mechanism == UM_FULL)
-  {
-    return net_share_resources(now);
-  } else {
-    xbt_die("Invalide update mechanism!");
-    return 0;
-  }
-}
-
-static void net_update_actions_state(double now, double delta)
+static void net_update_actions_state_full(double now, double delta)
 {
   double deltap = 0.0;
   surf_action_network_CM02_im_t action = NULL;
@@ -603,7 +591,7 @@ static void net_update_actions_state(double now, double delta)
   return;
 }
 
-static void im_net_update_actions_state(double now, double delta)
+static void net_update_actions_state_lazy(double now, double delta)
 {
   surf_action_network_CM02_im_t action = NULL;
 
@@ -639,19 +627,7 @@ static void im_net_update_actions_state(double now, double delta)
   return;
 }
 
-static void generic_net_update_actions_state(double now, double delta)
-{
-  if(network_update_mechanism == UM_LAZY)
-    im_net_update_actions_state(now,delta);
-  else if (network_update_mechanism == UM_FULL)
-  {
-    net_update_actions_state(now,delta);
-  } else {
-    xbt_die("Invalide update mechanism!");
-  }
-}
-
-static void im_net_update_resource_state(void *id,
+static void net_update_resource_state(void *id,
                                       tmgr_trace_event_t event_type,
                                       double value, double date)
 {
@@ -1084,7 +1060,6 @@ static void gap_remove(surf_action_network_CM02_im_t action) {
 static void im_surf_network_model_init_internal(void)
 {
   s_surf_action_network_CM02_im_t comm;
-
   surf_network_model = surf_model_init();
 
   surf_network_model->name = "network";
@@ -1097,11 +1072,16 @@ static void im_surf_network_model_init_internal(void)
 #endif
 
   surf_network_model->model_private->resource_used = im_net_resource_used;
-  surf_network_model->model_private->share_resources = generic_net_share_resources;
-  surf_network_model->model_private->update_actions_state =
-      generic_net_update_actions_state;
+  if(network_update_mechanism == UM_LAZY) {
+    surf_network_model->model_private->share_resources = net_share_resources_lazy;
+    surf_network_model->model_private->update_actions_state = net_update_actions_state_lazy;
+  } else if(network_update_mechanism == UM_FULL) {
+    surf_network_model->model_private->share_resources = net_share_resources_full;
+    surf_network_model->model_private->update_actions_state = net_update_actions_state_full;
+  }
+
   surf_network_model->model_private->update_resource_state =
-                 im_net_update_resource_state;
+                 net_update_resource_state;
   surf_network_model->model_private->finalize = im_net_finalize;
 
   surf_network_model->suspend = im_net_action_suspend;
@@ -1120,8 +1100,8 @@ static void im_surf_network_model_init_internal(void)
   surf_network_model->extension.network.create_resource =
                  im_net_create_resource;
 
 if (!network_im_maxmin_system)
-    network_im_maxmin_system = lmm_system_new();
+ if (!network_im_maxmin_system)
+    network_im_maxmin_system = lmm_system_new(selective_update);
 
  routing_model_create(sizeof(link_CM02_im_t),
       im_net_create_resource("__loopback__",
@@ -1130,7 +1110,6 @@ static void im_surf_network_model_init_internal(void)
           SURF_LINK_FATPIPE, NULL));
 
   if(network_update_mechanism == UM_LAZY){
-    sg_maxmin_selective_update = 1;
     im_net_action_heap = xbt_heap_new(8,NULL);
     xbt_heap_set_update_callback(im_net_action_heap, im_net_action_update_index_heap);
     im_net_modified_set =
@@ -1138,6 +1117,23 @@ static void im_surf_network_model_init_internal(void)
   }
 }
 
+static void set_update_mechanism(void) {
+  char *optim = xbt_cfg_get_string(_surf_cfg_set, "network/optim");
+  int select = xbt_cfg_get_int(_surf_cfg_set, "network/maxmin_selective_update");
+
+  if(!strcmp(optim,"Full")) {
+    network_update_mechanism = UM_FULL;
+    selective_update = select;
+  } else if (!strcmp(optim,"Lazy")) {
+    network_update_mechanism = UM_LAZY;
+    selective_update = 1;
+    xbt_assert((select==1) || (xbt_cfg_is_default_value(_surf_cfg_set,"network/maxmin_selective_update")),
+        "Disabling selective update while using the lazy update mechanism is dumb!");
+  } else {
+    xbt_die("Unsupported optimization (%s) for this model",optim);
+  }
+}
+
 /************************************************************************/
 /* New model based on LV08 and experimental results of MPI ping-pongs   */
 /************************************************************************/
@@ -1146,6 +1142,8 @@ void surf_network_model_init_SMPI(void)
 
   if (surf_network_model)
     return;
+  set_update_mechanism();
+
   im_surf_network_model_init_internal();
   im_latency_factor_callback = &smpi_latency_factor;
   im_bandwidth_factor_callback = &smpi_bandwidth_factor;
@@ -1156,7 +1154,6 @@ void surf_network_model_init_SMPI(void)
 
   xbt_cfg_setdefault_double(_surf_cfg_set, "network/sender_gap", 10e-6);
   xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775);
-
 }
 
 /************************************************************************/
@@ -1164,13 +1161,16 @@ void surf_network_model_init_SMPI(void)
 /************************************************************************/
 void im_surf_network_model_init_LegrandVelho(void)
 {
-  if( strcmp(xbt_cfg_get_string(_surf_cfg_set, "network/model"),"LV08"))
-    network_update_mechanism = UM_LAZY;
-  else
-    network_update_mechanism = UM_FULL;
+  char *model = xbt_cfg_get_string(_surf_cfg_set, "network/model");
 
   if (surf_network_model)
     return;
+
+  if(!strcmp(model,"LV08_fullupdate")) {
+    XBT_WARN("[*Deprecated*. Use --cfg=network/model:LV08 with option --cfg=network/optim:Full instead.]");
+  }
+  set_update_mechanism();
+
   im_surf_network_model_init_internal();
   im_net_define_callbacks();
   xbt_dynar_push(model_list, &surf_network_model);
@@ -1197,6 +1197,8 @@ void surf_network_model_init_CM02(void)
 
   if (surf_network_model)
     return;
+
+  set_update_mechanism();
   im_surf_network_model_init_internal();
   im_net_define_callbacks();
   xbt_dynar_push(model_list, &surf_network_model);
@@ -1211,6 +1213,8 @@ void surf_network_model_init_Reno(void)
 {
   if (surf_network_model)
     return;
+
+  set_update_mechanism();
   im_surf_network_model_init_internal();
   im_net_define_callbacks();
 
@@ -1230,6 +1234,8 @@ void surf_network_model_init_Reno2(void)
 {
   if (surf_network_model)
     return;
+
+  set_update_mechanism();
   im_surf_network_model_init_internal();
   im_net_define_callbacks();
 
@@ -1249,6 +1255,8 @@ void surf_network_model_init_Vegas(void)
 {
   if (surf_network_model)
     return;
+
+  set_update_mechanism();
   im_surf_network_model_init_internal();
   im_net_define_callbacks();