Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Implement xbt_dict_t content for storage model
[simgrid.git] / src / surf / workstation_ptask_L07.c
index b8ecc23..5e73d18 100644 (file)
@@ -13,7 +13,7 @@
 
 typedef enum {
   SURF_WORKSTATION_RESOURCE_CPU,
-  SURF_WORKSTATION_RESOURCE_LINK,
+  SURF_WORKSTATION_RESOURCE_LINK
 } e_surf_workstation_model_type_t;
 
 /**************************************/
@@ -28,7 +28,7 @@ typedef struct cpu_L07 {
   tmgr_trace_event_t power_event;
   tmgr_trace_event_t state_event;
   e_surf_resource_state_t state_current;
-  int id;                       /* cpu and network card are a single object... */
+  network_element_t info;
 } s_cpu_L07_t, *cpu_L07_t;
 
 /**************************************/
@@ -69,6 +69,17 @@ static int ptask_host_count = 0;
 static xbt_dict_t ptask_parallel_task_link_set = NULL;
 lmm_system_t ptask_maxmin_system = NULL;
 
+static surf_action_t die_impossible_communicate (void *src, void *dst, double size, double rate)
+{
+  DIE_IMPOSSIBLE;
+  return NULL;
+}
+
+static xbt_dynar_t die_impossible_get_route(void *src, void *dst)
+{
+  DIE_IMPOSSIBLE;
+  return NULL;
+}
 
 static void ptask_update_action_bound(surf_action_workstation_L07_t action)
 {
@@ -76,28 +87,19 @@ static void ptask_update_action_bound(surf_action_workstation_L07_t action)
   double lat_current = 0.0;
   double lat_bound = -1.0;
   int i, j;
-  unsigned int cpt;
-  link_L07_t link;
 
   for (i = 0; i < workstation_nb; i++) {
     for (j = 0; j < workstation_nb; j++) {
       xbt_dynar_t route=NULL;
-      routing_get_route_and_latency(surf_resource_name
-          (action->workstation_list[i]),
-          surf_resource_name(action->workstation_list[j]),
-          &route, NULL);
-
-      // FIXME do we really need to recompute the latency here?
-      double lat = 0.0;
 
       if (action->communication_amount[i * workstation_nb + j] > 0) {
-        xbt_dynar_foreach(route, cpt, link) {
-          lat += link->lat_current;
-        }
+        double lat = 0.0;
+        routing_get_route_and_latency(action->workstation_list[i]->info,
+            action->workstation_list[j]->info,
+            &route, &lat);
         lat_current =
             MAX(lat_current,
-                lat * action->communication_amount[i * workstation_nb +
-                                                   j]);
+                lat * action->communication_amount[i * workstation_nb + j]);
       }
     }
   }
@@ -195,8 +197,8 @@ static void ptask_action_set_priority(surf_action_t action,
 static double ptask_action_get_remains(surf_action_t action)
 {
   XBT_IN("(%p)", action);
-  return action->remains;
   XBT_OUT();
+  return action->remains;
 }
 
 /**************************************/
@@ -454,28 +456,30 @@ static surf_action_t ptask_execute_parallel_task(int workstation_nb,
   double latency = 0.0;
 
   if (ptask_parallel_task_link_set == NULL)
-    ptask_parallel_task_link_set = xbt_dict_new();
+    ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL);
 
   xbt_dict_reset(ptask_parallel_task_link_set);
 
   /* Compute the number of affected resources... */
   for (i = 0; i < workstation_nb; i++) {
     for (j = 0; j < workstation_nb; j++) {
-      link_L07_t link;
       xbt_dynar_t route=NULL;
-      routing_get_route_and_latency(
-          surf_resource_name(workstation_list[i]),
-          surf_resource_name(workstation_list[j]),
-          &route,NULL); // FIXME: do we want to recompute the latency?
-      double lat = 0.0;
 
-      if (communication_amount[i * workstation_nb + j] > 0)
+      if (communication_amount[i * workstation_nb + j] > 0) {
+        double lat=0.0;
+        unsigned int cpt;
+        link_L07_t link;
+
+        routing_get_route_and_latency(
+            ((cpu_L07_t)workstation_list[i])->info,
+            ((cpu_L07_t)workstation_list[j])->info,
+            &route,&lat);
+        latency = MAX(latency, lat);
+
         xbt_dynar_foreach(route, cpt, link) {
-        lat += link->lat_current;
-        xbt_dict_set(ptask_parallel_task_link_set,
-                     link->generic_resource.name, link, NULL);
+           xbt_dict_set(ptask_parallel_task_link_set,link->generic_resource.name,link,NULL);
         }
-      latency = MAX(latency, lat);
+      }
     }
   }
 
@@ -517,13 +521,14 @@ static surf_action_t ptask_execute_parallel_task(int workstation_nb,
     for (j = 0; j < workstation_nb; j++) {
       link_L07_t link;
       xbt_dynar_t route=NULL;
+      if (communication_amount[i * workstation_nb + j] == 0.0)
+        continue;
+
       routing_get_route_and_latency(
-          surf_resource_name(workstation_list[i]),
-          surf_resource_name(workstation_list[j]),
+          ((cpu_L07_t)workstation_list[i])->info,
+          ((cpu_L07_t)workstation_list[j])->info,
           &route,NULL);
 
-      if (communication_amount[i * workstation_nb + j] == 0.0)
-        continue;
       xbt_dynar_foreach(route, cpt, link) {
         lmm_expand_add(ptask_maxmin_system, link->constraint,
                        action->variable,
@@ -593,7 +598,7 @@ static xbt_dynar_t ptask_get_route(void *src, void *dst) // FIXME: kill that cal
 {
   xbt_dynar_t route=NULL;
   routing_get_route_and_latency(
-      surf_resource_name(src), surf_resource_name(dst),
+      ((cpu_L07_t)src)->info, ((cpu_L07_t)dst)->info,
       &route,NULL);
   return route;
 }
@@ -633,7 +638,8 @@ static void* ptask_cpu_create_resource(const char *name, double power_scale,
           surf_workstation_model, name,cpu_properties);
 
   cpu->type = SURF_WORKSTATION_RESOURCE_CPU;
-  cpu->id = ptask_host_count++;
+  cpu->info = (network_element_t)xbt_lib_get_or_null(host_lib,name,ROUTING_HOST_LEVEL);
+  if(!(cpu->info)) xbt_die("Don't find ROUTING_HOST_LEVEL for '%s'",name);
 
   cpu->power_scale = power_scale;
   xbt_assert(cpu->power_scale > 0, "Power has to be >0");
@@ -890,7 +896,7 @@ static void ptask_model_init_internal(void)
       ptask_add_traces;
 
   if (!ptask_maxmin_system)
-    ptask_maxmin_system = lmm_system_new();
+    ptask_maxmin_system = lmm_system_new(1);
 
   routing_model_create(sizeof(link_L07_t),
                        ptask_link_create_resource("__loopback__",
@@ -899,6 +905,15 @@ static void ptask_model_init_internal(void)
                                                   SURF_RESOURCE_ON, NULL,
                                                   SURF_LINK_FATPIPE, NULL));
 
+  surf_network_model = surf_model_init();
+
+  surf_network_model->extension.network.communicate = die_impossible_communicate;
+  surf_network_model->extension.network.get_route = die_impossible_get_route;
+  surf_network_model->extension.network.get_link_bandwidth = ptask_get_link_bandwidth;
+  surf_network_model->extension.network.get_link_latency = ptask_get_link_latency;
+  surf_network_model->extension.network.link_shared = ptask_link_shared;
+  surf_network_model->extension.network.add_traces = NULL;
+  surf_network_model->extension.network.create_resource = NULL;
 }
 
 /**************************************/
@@ -909,7 +924,6 @@ void surf_workstation_model_init_ptask_L07(void)
   XBT_INFO("surf_workstation_model_init_ptask_L07");
   xbt_assert(!surf_cpu_model, "CPU model type already defined");
   xbt_assert(!surf_network_model, "network model type already defined");
-  surf_network_model = surf_model_init();
   ptask_define_callbacks();
   ptask_model_init_internal();
   xbt_dynar_push(model_list, &surf_workstation_model);