-
-/* dot_add_task create a sd_task and all transfers required for this
- * task. The execution time of the task is given by the attribute size.
- * The unit of size is the Flop.*/
-void dot_add_task(Agnode_t * dag_node) {
- char *name = agnameof(dag_node);
- SD_task_t current_job;
- double runtime = dot_parse_double(agget(dag_node, (char *) "size"));
-
- XBT_DEBUG("See <job id=%s runtime=%s %.0f>", name,
- agget(dag_node, (char *) "size"), runtime);
-
- if (!strcmp(name, "root")){
- XBT_WARN("'root' node is explicitly declared in the DOT file. Update it");
- root_task->amount = runtime;
- root_task->computation_amount[0]= runtime;
-#ifdef HAVE_TRACING
- TRACE_sd_dotloader (root_task, agget (dag_node, (char*)"category"));
-#endif
- }
-
- if (!strcmp(name, "end")){
- XBT_WARN("'end' node is explicitly declared in the DOT file. Update it");
- end_task->amount = runtime;
- end_task->computation_amount[0]= runtime;
-#ifdef HAVE_TRACING
- TRACE_sd_dotloader (end_task, agget (dag_node, (char*)"category"));
-#endif
- }
-
- current_job = xbt_dict_get_or_null(jobs, name);
- if (!current_job) {
- current_job =
- SD_task_create_comp_seq(name, NULL , runtime);
-#ifdef HAVE_TRACING
- TRACE_sd_dotloader (current_job, agget (dag_node, (char*)"category"));
-#endif
- xbt_dict_set(jobs, name, current_job, NULL);
- xbt_dynar_push(result, ¤t_job);
- }
- Agedge_t *e;
- int count = 0;
-
- for (e = agfstin(dag_dot, dag_node); e; e = agnxtin(dag_dot, e)) {
- dot_add_input_dependencies(current_job, e, sequential);
- count++;
- }
- if (count == 0 && current_job != root_task) {
- SD_task_dependency_add(NULL, NULL, root_task, current_job);
- }
- count = 0;
- for (e = agfstout(dag_dot, dag_node); e; e = agnxtout(dag_dot, e)) {
- dot_add_output_dependencies(current_job, e, sequential);
- count++;
- }
- if (count == 0 && current_job != end_task) {
- SD_task_dependency_add(NULL, NULL, current_job, end_task);
- }
-
- if(schedule || XBT_LOG_ISENABLED(sd_dotparse, xbt_log_priority_verbose)){
- /* try to take the information to schedule the task only if all is
- * right*/
- /* performer is the computer which execute the task */
- unsigned long performer = -1;
- char * char_performer = agget(dag_node, (char *) "performer");
- if (char_performer != NULL)
- performer = (long) dot_parse_int(char_performer);
-
- /* order is giving the task order on one computer */
- unsigned long order = -1;
- char * char_order = agget(dag_node, (char *) "order");
- if (char_order != NULL)
- order = (long) dot_parse_int(char_order);
- xbt_dynar_t computer = NULL;
- if(performer != -1 && order != -1){
- /* required parameters are given */
- computer = xbt_dict_get_or_null(computers, char_performer);
- if(computer == NULL){
- computer = xbt_dynar_new(sizeof(SD_task_t), NULL);
- xbt_dict_set(computers, char_performer, computer, NULL);
- }
- if(performer < xbt_lib_length(host_lib)){
- /* the wanted computer is available */
- SD_task_t *task_test = NULL;
- if(order < computer->used)
- task_test = xbt_dynar_get_ptr(computer,order);
- if(task_test != NULL && *task_test != NULL && *task_test != current_job){
- /* the user gives the same order to several tasks */
- schedule = false;
- XBT_VERB("The task %s starts on the computer %s at the position : %s like the task %s",
- (*task_test)->name, char_performer, char_order,
- current_job->name);
- }else{
- /* the parameter seems to be ok */
- xbt_dynar_set_as(computer, order, SD_task_t, current_job);
- }
- }else{
- /* the platform has not enough processors to schedule the DAG like
- * the user wants*/
- schedule = false;
- XBT_VERB("The schedule is ignored, there are not enough computers");
- }
- }
- else {
- /* one of required parameters is not given */
- schedule = false;
- XBT_VERB("The schedule is ignored, the task %s is not correctly scheduled",
- current_job->name);
- }
- }
-}
-
-/* dot_add_output_dependencies create the dependencies between a task
- * and a transfers. This is given by the edges in the dot file.
- * The amount of data transfers is given by the attribute size on the
- * edge. */
-void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge,
- seq_par_t seq_or_par) {
- SD_task_t file = NULL;
- char *name_tail=agnameof(agtail(edge));
- char *name_head=agnameof(aghead(edge));
- char *name = xbt_malloc((strlen(name_head)+strlen(name_tail)+6)*sizeof(char));
- sprintf(name, "%s->%s", name_tail, name_head);
- double size = dot_parse_double(agget(edge, (char *) "size"));
- XBT_DEBUG("add input -- edge: %s, size : %e, get size : %s",
- name, size, agget(edge, (char *) "size"));
-
- if (size > 0) {
- file = xbt_dict_get_or_null(files, name);
- if (file == NULL) {
- if (seq_or_par == sequential){
- file = SD_task_create_comm_e2e(name, NULL, size);
- } else {
- file = SD_task_create_comm_par_mxn_1d_block(name, NULL, size);
- }
-#ifdef HAVE_TRACING
- TRACE_sd_dotloader (file, agget (edge, (char*)"category"));
-#endif
- XBT_DEBUG("add input -- adding %s to the dict as new file", name);
- xbt_dict_set(files, name, file, NULL);
- } else {
- XBT_WARN("%s already exists", name);
- if (SD_task_get_amount(file) != size) {
- XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f",
- name, SD_task_get_amount(file), size);
- }
- }
- SD_task_dependency_add(NULL, NULL, file, current_job);
- } else {
- file = xbt_dict_get_or_null(jobs, name_tail);
- if (file != NULL) {
- SD_task_dependency_add(NULL, NULL, file, current_job);
- }
- }
- free(name);
-}
-
-/* dot_add_output_dependencies create the dependencies between a
- * transfers and a task. This is given by the edges in the dot file.
- * The amount of data transfers is given by the attribute size on the
- * edge. */
-void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge,
- seq_par_t seq_or_par) {
- SD_task_t file;
- char *name_tail=agnameof(agtail(edge));
- char *name_head=agnameof(aghead(edge));
- char *name = xbt_malloc((strlen(name_head)+strlen(name_tail)+6)*sizeof(char));
- sprintf(name, "%s->%s", name_tail, name_head);
- double size = dot_parse_double(agget(edge, (char *) "size"));
- XBT_DEBUG("add_output -- edge: %s, size : %e, get size : %s",
- name, size, agget(edge, (char *) "size"));
-
- if (size > 0) {
- file = xbt_dict_get_or_null(files, name);
- if (file == NULL) {
- if (seq_or_par == sequential){
- file = SD_task_create_comm_e2e(name, NULL, size);
- } else {
- file = SD_task_create_comm_par_mxn_1d_block(name, NULL, size);
- }
-#ifdef HAVE_TRACING
- TRACE_sd_dotloader (file, agget (edge, (char*)"category"));
-#endif
- XBT_DEBUG("add output -- adding %s to the dict as new file", name);
- xbt_dict_set(files, name, file, NULL);
- } else {
- XBT_WARN("%s already exists", name);
- if (SD_task_get_amount(file) != size) {
- XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f",
- name, SD_task_get_amount(file), size);
- }
- }
- SD_task_dependency_add(NULL, NULL, current_job, file);
- if (xbt_dynar_length(file->tasks_before) > 1) {
- XBT_WARN("File %s created at more than one location...", file->name);
- }
- } else {
- file = xbt_dict_get_or_null(jobs, name_head);
- if (file != NULL) {
- SD_task_dependency_add(NULL, NULL, current_job, file);
- }
- }
- free(name);
-}