diff --git a/src/scheduler.c b/src/scheduler.c index f6a4a9970ce43e23a7dd2d6511d4cf0f5ad65770..6812f229befce13547c4e793a686a0045cc9dc04 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -113,6 +113,31 @@ void scheduler_addunlock(struct scheduler *s, struct task *ta, atomic_inc(&s->completed_unlock_writes); } +/** + * @brief generate the dependency name for the tasks + * + * @param ta The #task + * @param ta_name The formatted string + */ +void scheduler_task_dependency_name( + int ta_type, int ta_subtype, char *ta_name) { + + /* Check input */ + if (ta_type < 0 || ta_type >= task_type_count) + error("Unknown task type %i", ta_type); + + if (ta_subtype < 0 || ta_subtype >= task_subtype_count) + error("Unknown task subtype %i with type %s", ta_subtype, + taskID_names[ta_type]); + + /* construct line */ + if (ta_subtype == task_subtype_none) + sprintf(ta_name, "%s", taskID_names[ta_type]); + else + sprintf(ta_name, "\"%s %s\"", taskID_names[ta_type], + subtaskID_names[ta_subtype]); +} + /** * @brief Write a dot file with the task dependencies. * @@ -139,10 +164,15 @@ void scheduler_write_dependencies(struct scheduler *s, int verbose) { * task_subtype */ int *table = (int *)malloc(nber_relation * sizeof(int)); if (table == NULL) - error("Error allocating memory for task-dependency graph."); + error("Error allocating memory for task-dependency graph (table)."); + + int *count_rel = (int *)malloc(nber_relation * sizeof(int) / 2); + if (count_rel == NULL) + error("Error allocating memory for task-dependency graph (count_rel)."); /* Reset everything */ for (int i = 0; i < nber_relation; i++) table[i] = -1; + for (int i = 0; i < nber_relation / 2; i++) count_rel[i] = 0; /* Create file */ char filename[200] = "dependency_graph.dot"; @@ -189,13 +219,16 @@ void scheduler_write_dependencies(struct scheduler *s, int verbose) { } k += 1; - cur = &cur[3]; + cur = &cur[2]; } /* max_nber_dep is too small */ if (k == max_nber_dep) error("Not enough memory, please increase max_nber_dep"); + /* Increase counter of relation */ + count_rel[ind/2 + k] += 1; + /* Not written yet => write it */ if (!written) { @@ -204,20 +237,8 @@ void scheduler_write_dependencies(struct scheduler *s, int verbose) { char tb_name[200]; /* construct line */ - if (ta->subtype == task_subtype_none) - sprintf(ta_name, "%s", taskID_names[ta->type]); - else - sprintf(ta_name, "\"%s %s\"", taskID_names[ta->type], - subtaskID_names[ta->subtype]); - - if (tb->subtype == task_subtype_none) - sprintf(tb_name, "%s", taskID_names[tb->type]); - else - sprintf(tb_name, "\"%s %s\"", taskID_names[tb->type], - subtaskID_names[tb->subtype]); - - /* Write to the ffile */ - fprintf(f, "\t %s->%s;\n", ta_name, tb_name); + scheduler_task_dependency_name(ta->type, ta->subtype, ta_name); + scheduler_task_dependency_name(tb->type, tb->subtype, tb_name); /* Change colour of implicit tasks */ if (ta->implicit) @@ -312,6 +333,39 @@ void scheduler_write_dependencies(struct scheduler *s, int verbose) { fprintf(f, "\t\t %s;\n", taskID_names[task_type_grav_mm]); fprintf(f, "\t};\n"); + /* Write down the number of relation */ + for (int ta_type = 0; ta_type < task_type_count; ta_type++) { + + for (int ta_subtype = 0; ta_subtype < task_subtype_count; ta_subtype++) { + + /* Get task indice */ + const int ind = (ta_type * task_subtype_count + ta_subtype) * max_nber_dep; + + /* Loop over dependencies */ + for (int k = 0; k < max_nber_dep; k++) { + + if (count_rel[ind + k] == 0) + continue; + + /* Get task type */ + const int i = 2 * (ind + k); + int tb_type = table[i]; + int tb_subtype = table[i+1]; + + /* Get names */ + char ta_name[200]; + char tb_name[200]; + + scheduler_task_dependency_name(ta_type, ta_subtype, ta_name); + scheduler_task_dependency_name(tb_type, tb_subtype, tb_name); + + /* Write to the fle */ + fprintf(f, "\t %s->%s[label=%i];\n", ta_name, tb_name, count_rel[ind + k]); + + } + } + } + /* Be clean */ fprintf(f, "}"); fclose(f);