-/* Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011. The SimGrid Team.
+/* Copyright (c) 2006-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
sd_global->task_number++;
#ifdef HAVE_TRACING
- task->category = NULL;
+ TRACE_sd_task_create(task);
#endif
return task;
SD_task_t res = SD_task_create_sized(name, data, amount, 2);
res->communication_amount[2] = amount;
res->kind = SD_TASK_COMM_E2E;
+
+#ifdef HAVE_TRACING
+ TRACE_category("COMM_E2E");
+ TRACE_sd_set_task_category(res, "COMM_E2E");
+#endif
+
return res;
}
SD_task_t res = SD_task_create_sized(name, data, amount, 1);
res->computation_amount[0] = amount;
res->kind = SD_TASK_COMP_SEQ;
- return res;
+
+#ifdef HAVE_TRACING
+ TRACE_category("COMP_SEQ");
+ TRACE_sd_set_task_category(res, "COMP_SEQ");
+#endif
+
+return res;
}
/** @brief create a parallel computation task that can then be auto-scheduled
* mandatory power.
*
* A parallel computation can be scheduled on any number of host.
- * The underlying speedup model is Amdahl's law.
- * To be auto-scheduled, \see SD_task_distribute_comp_amdhal has to be called
+ * The underlying speedup model is Amdahl's law.
+ * To be auto-scheduled, \see SD_task_distribute_comp_amdahl has to be called
* first.
* \param name the name of the task (can be \c NULL)
* \param data the user data you want to associate with the task (can be \c NULL)
SD_task_t res = SD_task_create(name, data, amount);
res->alpha = alpha;
res->kind = SD_TASK_COMP_PAR_AMDAHL;
+
+#ifdef HAVE_TRACING
+ TRACE_category("COMP_PAR_AMDAHL");
+ TRACE_sd_set_task_category(res, "COMP_PAR_AMDAHL");
+#endif
+
return res;
}
SD_task_t res = SD_task_create(name, data, amount);
res->workstation_list=NULL;
res->kind = SD_TASK_COMM_PAR_MXN_1D_BLOCK;
+
+#ifdef HAVE_TRACING
+ TRACE_category("COMM_PAR_MXN_1D_BLOCK");
+ TRACE_sd_set_task_category(res, "COMM_PAR_MXN_1D_BLOCK");
+#endif
+
return res;
}
xbt_free(task->name);
if (task->surf_action != NULL)
- surf_workstation_model->action_unref(task->surf_action);
+ surf_action_unref(task->surf_action);
xbt_free(task->workstation_list);
xbt_free(task->communication_amount);
xbt_free(task->computation_amount);
#ifdef HAVE_TRACING
- if (task->category) xbt_free(task->category);
+ TRACE_sd_task_destroy(task);
#endif
xbt_mallocator_release(sd_global->task_mallocator,task);
break;
case SD_RUNNING:
task->state_set = sd_global->running_task_set;
- task->start_time =
- surf_workstation_model->action_get_start_time(task->surf_action);
+ task->start_time = surf_action_get_start_time(task->surf_action);
break;
case SD_DONE:
task->state_set = sd_global->done_task_set;
- task->finish_time =
- surf_workstation_model->action_get_finish_time(task->surf_action);
+ task->finish_time = surf_action_get_finish_time(task->surf_action);
task->remains = 0;
#ifdef HAVE_JEDULE
jedule_log_sd_event(task);
}
/**
- * \brief Returns the alpha parameter of a SD_TASK_COMP_PAR_AMDAH task
+ * \brief Sets the total amount of work of a task
+ * For sequential typed tasks (COMP_SEQ and COMM_E2E), it also sets the
+ * appropriate values in the computation_amount and communication_amount arrays
+ * respectively. Nothing more than modifying task->amount is done for paralle
+ * typed tasks (COMP_PAR_AMDAHL and COMM_PAR_MXN_1D_BLOCK) as the distribution
+ * of the amount of work is done at scheduling time.
+ *
+ * \param task a task
+ * \param amount the new amount of work to execute
+ */
+void SD_task_set_amount(SD_task_t task, double amount)
+{
+ task->amount = amount;
+ if (task->kind == SD_TASK_COMP_SEQ)
+ task->computation_amount[0] = amount;
+ if (task->kind == SD_TASK_COMM_E2E)
+ task->communication_amount[2] = amount;
+}
+
+/**
+ * \brief Returns the alpha parameter of a SD_TASK_COMP_PAR_AMDAHL task
*
* \param task a parallel task assuming Amdahl's law as speedup model
* \return the alpha parameter (serial part of a task in percent) for this task
double SD_task_get_remaining_amount(SD_task_t task)
{
if (task->surf_action)
- return surf_workstation_model->get_remains(task->surf_action);
+ return surf_action_get_remains(task->surf_action);
else
return task->remains;
}
XBT_INFO("Displaying task %s", SD_task_get_name(task));
statename = bprintf("%s %s %s %s %s %s %s %s",
- (task->state & SD_NOT_SCHEDULED ? "not scheduled" :
+ (task->state == SD_NOT_SCHEDULED ? "not scheduled" :
""),
- (task->state & SD_SCHEDULABLE ? "schedulable" : ""),
- (task->state & SD_SCHEDULED ? "scheduled" : ""),
- (task->state & SD_RUNNABLE ? "runnable" :
+ (task->state == SD_SCHEDULABLE ? "schedulable" : ""),
+ (task->state == SD_SCHEDULED ? "scheduled" : ""),
+ (task->state == SD_RUNNABLE ? "runnable" :
"not runnable"),
- (task->state & SD_IN_FIFO ? "in fifo" : ""),
- (task->state & SD_RUNNING ? "running" : ""),
- (task->state & SD_DONE ? "done" : ""),
- (task->state & SD_FAILED ? "failed" : ""));
+ (task->state == SD_IN_FIFO ? "in fifo" : ""),
+ (task->state == SD_RUNNING ? "running" : ""),
+ (task->state == SD_DONE ? "done" : ""),
+ (task->state == SD_FAILED ? "failed" : ""));
XBT_INFO(" - state: %s", statename);
free(statename);
XBT_INFO(" - (unknown kind %d)", task->kind);
}
}
+
+#ifdef HAVE_TRACING
+ if (task->category)
+ XBT_INFO(" - tracing category: %s", task->category);
+#endif
+
XBT_INFO(" - amount: %.0f", SD_task_get_amount(task));
if (task->kind == SD_TASK_COMP_PAR_AMDAHL)
XBT_INFO(" - alpha: %.2f", task->alpha);
SD_task_t dst)
{
xbt_dynar_t dynar;
- int length;
+ unsigned long length;
int found = 0;
- int i;
+ unsigned long i;
SD_dependency_t dependency;
dynar = src->tasks_after;
for (i = 0; i < length && !found; i++) {
xbt_dynar_get_cpy(dynar, i, &dependency);
found = (dependency->dst == dst);
- XBT_DEBUG("Dependency %d: dependency->dst = %s", i,
+ XBT_DEBUG("Dependency %lu: dependency->dst = %s", i,
SD_task_get_name(dependency->dst));
}
__SD_task_set_state(dst, SD_SCHEDULED);
}
}
+/**
+ * \brief Returns the name given as input when dependency has been created..
+ *
+ * \param src a task
+ * \param dst a task depending on \a src
+ *
+ */
+const char *SD_task_dependency_get_name(SD_task_t src, SD_task_t dst){
+ unsigned int i;
+ SD_dependency_t dependency;
+
+ xbt_dynar_foreach(src->tasks_after, i, dependency){
+ if (dependency->dst == dst)
+ return dependency->name;
+ }
+ return NULL;
+}
/**
* \brief Indicates whether there is a dependency between two tasks.
{
xbt_dynar_t dynar;
- int length;
+ unsigned long length;
int found = 0;
- int i;
+ unsigned long i;
SD_dependency_t dependency;
/* remove the dependency from src->tasks_after */
{
xbt_dynar_t dynar;
- int length;
+ unsigned long length;
int found = 0;
- int i;
+ unsigned long i;
SD_dependency_t dependency;
dynar = src->tasks_after;
&& ((task->kind == SD_TASK_COMP_PAR_AMDAHL) ||
(task->kind == SD_TASK_COMM_PAR_MXN_1D_BLOCK))) { /* Don't free scheduling data for typed tasks */
__SD_task_destroy_scheduling_data(task);
+ xbt_free(task->workstation_list);
task->workstation_list=NULL;
task->workstation_nb = 0;
}
if (__SD_task_is_running(task)) /* the task should become SD_FAILED */
- surf_workstation_model->action_cancel(task->surf_action);
+ surf_action_cancel(task->surf_action);
else {
if (task->unsatisfied_dependencies == 0)
__SD_task_set_state(task, SD_SCHEDULABLE);
surf_workstations = xbt_new(void *, workstation_nb);
for (i = 0; i < workstation_nb; i++)
- surf_workstations[i] = task->workstation_list[i];
+ surf_workstations[i] = surf_workstation_resource_priv(task->workstation_list[i]);
double *computation_amount = xbt_new0(double, workstation_nb);
double *communication_amount = xbt_new0(double, workstation_nb * workstation_nb);
memcpy(communication_amount, task->communication_amount,
sizeof(double) * workstation_nb * workstation_nb);
- task->surf_action =
- surf_workstation_model->extension.
- workstation.execute_parallel_task(workstation_nb,
- surf_workstations,
- computation_amount,
- communication_amount,
- task->rate);
+ task->surf_action = surf_workstation_model_execute_parallel_task((surf_workstation_model_t)surf_workstation_model,
+ workstation_nb,
+ surf_workstations,
+ computation_amount,
+ communication_amount,
+ task->rate);
- surf_workstation_model->action_data_set(task->surf_action, task);
+ surf_action_set_data(task->surf_action, task);
XBT_DEBUG("surf_action = %p", task->surf_action);
candidates = xbt_new(SD_task_t, 8);
__SD_task_set_state(task, SD_DONE);
- surf_workstation_model->action_unref(task->surf_action);
+ surf_action_unref(task->surf_action);
task->surf_action = NULL;
XBT_DEBUG("Looking for candidates");
double SD_task_get_start_time(SD_task_t task)
{
if (task->surf_action)
- return surf_workstation_model->
- action_get_start_time(task->surf_action);
+ return surf_action_get_start_time(task->surf_action);
else
return task->start_time;
}
double SD_task_get_finish_time(SD_task_t task)
{
if (task->surf_action) /* should never happen as actions are destroyed right after their completion */
- return surf_workstation_model->
- action_get_finish_time(task->surf_action);
+ return surf_action_get_finish_time(task->surf_action);
else
return task->finish_time;
}
/** @brief Blah
*
*/
-void SD_task_distribute_comp_amdhal(SD_task_t task, int ws_count)
+void SD_task_distribute_comp_amdahl(SD_task_t task, int ws_count)
{
int i;
xbt_assert(task->kind == SD_TASK_COMP_PAR_AMDAHL,
"Task %s is not a SD_TASK_COMP_PAR_AMDAHL typed task."
"Cannot use this function.",
SD_task_get_name(task));
-
task->computation_amount = xbt_new0(double, ws_count);
task->communication_amount = xbt_new0(double, ws_count * ws_count);
+ xbt_free(task->workstation_list);
task->workstation_nb = ws_count;
task->workstation_list = xbt_new0(SD_workstation_t, ws_count);
SD_task_get_name(task));
switch (task->kind) {
case SD_TASK_COMP_PAR_AMDAHL:
- SD_task_distribute_comp_amdhal(task, count);
+ SD_task_distribute_comp_amdahl(task, count);
case SD_TASK_COMM_E2E:
case SD_TASK_COMP_SEQ:
xbt_assert(task->workstation_nb == count,
* located (and start them if runnable) */
if (task->kind == SD_TASK_COMP_PAR_AMDAHL) {
XBT_VERB("Schedule computation task %s on %d workstations. %.f flops"
- " will be distributed following Amdahl'Law",
+ " will be distributed following Amdahl's Law",
SD_task_get_name(task), task->workstation_nb,
task->computation_amount[0]);
xbt_dynar_foreach(task->tasks_before, cpt, dep) {
task->workstation_list[i];
before->workstation_nb += count;
-
+ xbt_free(before->computation_amount);
+ xbt_free(before->communication_amount);
before->computation_amount = xbt_new0(double,
before->workstation_nb);
before->communication_amount = xbt_new0(double,
after->workstation_nb += count;
+ xbt_free(after->computation_amount);
+ xbt_free(after->communication_amount);
+
after->computation_amount = xbt_new0(double, after->workstation_nb);
after->communication_amount = xbt_new0(double,
after->workstation_nb*
SD_task_schedulev(task, count, list);
free(list);
}
-
-/**
- * \brief Sets the tracing category of a task.
- *
- * This function should be called after the creation of a
- * SimDAG task, to define the category of that task. The first
- * parameter must contain a task that was created with the
- * function #SD_task_create. The second parameter must contain
- * a category that was previously declared with the function
- * #TRACE_category.
- *
- * \param task The task to be considered
- * \param category the name of the category to be associated to the task
- *
- * \see SD_task_get_category, TRACE_category, TRACE_category_with_color
- */
-void SD_task_set_category (SD_task_t task, const char *category)
-{
-#ifdef HAVE_TRACING
- if (!TRACE_is_enabled()) return;
- if (task == NULL) return;
- if (category == NULL){
- if (task->category) xbt_free (task->category);
- task->category = NULL;
- }else{
- task->category = xbt_strdup (category);
- }
-#endif
-}
-
-/**
- * \brief Gets the current tracing category of a task.
- *
- * \param task The task to be considered
- *
- * \see SD_task_set_category
- *
- * \return Returns the name of the tracing category of the given task, NULL otherwise
- */
-const char *SD_task_get_category (SD_task_t task)
-{
-#ifdef HAVE_TRACING
- return task->category;
-#else
- return NULL;
-#endif
-}