Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Adding parallel tasks to MSG
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 22 Jul 2005 18:23:34 +0000 (18:23 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 22 Jul 2005 18:23:34 +0000 (18:23 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1560 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/msg/msg.h
src/msg/gos.c
src/msg/private.h

index b589ff6..94bb434 100644 (file)
@@ -81,6 +81,12 @@ MSG_error_t MSG_process_start(m_process_t process);
 
 m_task_t MSG_task_create(const char *name, double compute_duration,
                         double message_size, void *data);
 
 m_task_t MSG_task_create(const char *name, double compute_duration,
                         double message_size, void *data);
+m_task_t MSG_parallel_task_create(const char *name, 
+                                 int host_nb,
+                                 const m_host_t *host_list,
+                                 double *computation_amount,
+                                 double *communication_amount,
+                                 void *data);
 void *MSG_task_get_data(m_task_t task);
 m_process_t MSG_task_get_sender(m_task_t task);
 const char *MSG_task_get_name(m_task_t task);
 void *MSG_task_get_data(m_task_t task);
 m_process_t MSG_task_get_sender(m_task_t task);
 const char *MSG_task_get_name(m_task_t task);
@@ -96,6 +102,8 @@ MSG_error_t MSG_task_put_bounded(m_task_t task,
                                 m_host_t dest, m_channel_t channel,
                                 double max_rate);
 MSG_error_t MSG_task_execute(m_task_t task);
                                 m_host_t dest, m_channel_t channel,
                                 double max_rate);
 MSG_error_t MSG_task_execute(m_task_t task);
+MSG_error_t MSG_parallel_task_execute(m_task_t task);
+
 int MSG_task_Iprobe(m_channel_t channel);
 int MSG_task_probe_from(m_channel_t channel);
 MSG_error_t MSG_channel_select_from(m_channel_t channel, double max_duration,
 int MSG_task_Iprobe(m_channel_t channel);
 int MSG_task_probe_from(m_channel_t channel);
 MSG_error_t MSG_channel_select_from(m_channel_t channel, double max_duration,
index 0e0acdf..2e82c5a 100644 (file)
@@ -439,6 +439,75 @@ MSG_error_t __MSG_wait_for_computation(m_process_t process, m_task_t task)
   }
 }
 
   }
 }
 
+m_task_t MSG_parallel_task_create(const char *name, 
+                                 int host_nb,
+                                 const m_host_t *host_list,
+                                 double *computation_amount,
+                                 double *communication_amount,
+                                 void *data)
+{
+  simdata_task_t simdata = xbt_new0(s_simdata_task_t,1);
+  m_task_t task = xbt_new0(s_m_task_t,1);
+  int i;
+
+  /* Task structure */
+  task->name = xbt_strdup(name);
+  task->simdata = simdata;
+  task->data = data;
+
+  /* Simulator Data */
+  simdata->sleeping = xbt_dynar_new(sizeof(m_process_t),NULL);
+  simdata->rate = -1.0;
+  simdata->using = 1;
+  simdata->sender = NULL;
+  simdata->host_nb = host_nb;
+  
+  simdata->host_list = xbt_new0(void *, host_nb);
+  simdata->comp_amount = computation_amount;
+  simdata->comm_amount = communication_amount;
+
+  for(i=0;i<host_nb;i++)
+    simdata->host_list[i] = host_list[i]->simdata->host;
+
+  return task;
+}
+
+
+static void __MSG_parallel_task_execute(m_process_t process, m_task_t task)
+{
+  simdata_task_t simdata = NULL;
+
+  CHECK_HOST();
+
+  simdata = task->simdata;
+
+  xbt_assert0(simdata->host_nb,"This is not a parallel task. Go to hell.");
+
+  simdata->compute = surf_workstation_resource->extension_public->
+  execute_parallel_task(task->simdata->host_nb,
+                       task->simdata->host_list,
+                       task->simdata->comp_amount,
+                       task->simdata->comm_amount,
+                       1.0,
+                       -1.0);
+  surf_workstation_resource->common_public->action_set_data(simdata->compute,task);
+}
+
+MSG_error_t MSG_parallel_task_execute(m_task_t task)
+{
+  m_process_t process = MSG_process_self();
+  MSG_error_t res;
+
+  DEBUG0("Computing on a tons of guys");
+  
+  __MSG_parallel_task_execute(process, task);
+
+  res = __MSG_wait_for_computation(process,task);
+
+  return res;  
+}
+
+
 /** \ingroup msg_gos_functions
  * \brief Sleep for the specified number of seconds
  *
 /** \ingroup msg_gos_functions
  * \brief Sleep for the specified number of seconds
  *
index fba859d..05bc2c2 100644 (file)
@@ -38,6 +38,11 @@ typedef struct simdata_task {
   m_process_t sender;
   double rate;
   int using;
   m_process_t sender;
   double rate;
   int using;
+  /*******  Parallel Tasks Only !!!! *******/
+  int host_nb;
+  void * *host_list;            /* SURF modeling */
+  double *comp_amount;
+  double *comm_amount;
 } s_simdata_task_t;
 
 /******************************* Process *************************************/
 } s_simdata_task_t;
 
 /******************************* Process *************************************/