From: alegrand Date: Fri, 22 Jul 2005 18:23:34 +0000 (+0000) Subject: Adding parallel tasks to MSG X-Git-Tag: v3.3~3796 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/884e1a15d5e1f2d5aea1134bd58b28903696b3f0 Adding parallel tasks to MSG git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1560 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/msg/msg.h b/include/msg/msg.h index b589ff63d7..94bb434594 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -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_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); @@ -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); +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, diff --git a/src/msg/gos.c b/src/msg/gos.c index 0e0acdf9b2..2e82c5aa5d 100644 --- a/src/msg/gos.c +++ b/src/msg/gos.c @@ -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;ihost_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 * diff --git a/src/msg/private.h b/src/msg/private.h index fba859dea2..05bc2c2476 100644 --- a/src/msg/private.h +++ b/src/msg/private.h @@ -38,6 +38,11 @@ typedef struct simdata_task { 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 *************************************/