X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/09b711da5625559594d63e9f2f0ff8bebf133548..ff1eebe3071b50372f9bf3048eeec04c610d2788:/src/simdag/sd_daxloader.c diff --git a/src/simdag/sd_daxloader.c b/src/simdag/sd_daxloader.c index 6a523ea615..07b52946e2 100644 --- a/src/simdag/sd_daxloader.c +++ b/src/simdag/sd_daxloader.c @@ -40,9 +40,37 @@ static int dax_parse_int(const char *string) { return value; } +/* Ensure that transfer tasks have unique names even though a file is used + * several times */ + +void uniq_transfer_task_name(SD_task_t task){ + SD_task_t child, parent; + xbt_dynar_t children, parents; + char *new_name; + + children = SD_task_get_children(task); + parents = SD_task_get_parents(task); + + xbt_dynar_get_cpy(children,0,&child); + xbt_dynar_get_cpy(parents,0,&parent); + + new_name = bprintf("%s_%s_%s", + SD_task_get_name(parent), + SD_task_get_name(task), + SD_task_get_name(child)); + + SD_task_set_name (task, new_name); + + xbt_dynar_free_container(&children); + xbt_dynar_free_container(&parents); + free(new_name); +} + + static YY_BUFFER_STATE input_buffer; static xbt_dynar_t result; +static xbt_dict_t jobs; static xbt_dict_t files; static SD_task_t current_job; static SD_task_t root_task,end_task; @@ -67,6 +95,9 @@ static void dax_task_free(void*task){ * for more details. */ xbt_dynar_t SD_daxload(const char*filename) { + xbt_dict_cursor_t cursor; + SD_task_t file; + char *name; FILE* in_file = fopen(filename,"r"); xbt_assert1(in_file, "Unable to open \"%s\"\n", filename); input_buffer = dax__create_buffer(in_file, 10); @@ -75,24 +106,28 @@ xbt_dynar_t SD_daxload(const char*filename) { result = xbt_dynar_new(sizeof(SD_task_t),dax_task_free); files=xbt_dict_new(); + jobs=xbt_dict_new(); root_task = SD_task_create_comp_seq("root",NULL,0); + /* by design the root task is always SCHEDULABLE */ + __SD_task_set_state(root_task, SD_SCHEDULABLE); + xbt_dynar_push(result,&root_task); end_task = SD_task_create_comp_seq("end",NULL,0); xbt_assert2(!dax_lex(),"Parse error in %s: %s",filename,dax__parse_err_msg()); dax__delete_buffer(input_buffer); fclose(in_file); + xbt_dict_free(&jobs); /* And now, post-process the files. * We want a file task per pair of computation tasks exchanging the file. Duplicate on need * Files not produced in the system are said to be produced by root task (top of DAG). * Files not consumed in the system are said to be consumed by end task (bottom of DAG). */ - xbt_dict_cursor_t cursor; - SD_task_t file; - char *name; + xbt_dict_foreach(files,cursor,name,file) { unsigned int cpt1,cpt2; + SD_task_t newfile = NULL; SD_dependency_t depbefore,depafter; if (xbt_dynar_length(file->tasks_before) == 0) { xbt_dynar_foreach(file->tasks_after,cpt2,depafter) { @@ -115,7 +150,7 @@ xbt_dynar_t SD_daxload(const char*filename) { WARN2("File %s is produced and consumed by task %s. This loop dependency will prevent the execution of the task.", file->name,depbefore->src->name); } - SD_task_t newfile = SD_task_create_comm_e2e(file->name,NULL,file->amount); + newfile = SD_task_create_comm_e2e(file->name,NULL,file->amount); SD_task_dependency_add(NULL,NULL,depbefore->src,newfile); SD_task_dependency_add(NULL,NULL,newfile,depafter->dst); xbt_dynar_push(result,&newfile); @@ -129,6 +164,12 @@ xbt_dynar_t SD_daxload(const char*filename) { /* Free previous copy of the files */ xbt_dict_free(&files); + unsigned int cpt; + xbt_dynar_foreach(result,cpt,file) { + if (SD_task_get_kind(file)==SD_TASK_COMM_E2E){ + uniq_transfer_task_name(file); + } + } return result; } @@ -144,15 +185,9 @@ void STag_dax__job(void) { runtime*=4200000000.; /* Assume that timings were done on a 4.2GFlops machine. I mean, why not? */ // INFO3("See ",A_dax__job_id,A_dax__job_runtime,runtime); current_job = SD_task_create_comp_seq(name,NULL,runtime); + xbt_dict_set(jobs,A_dax__job_id,current_job,NULL); free(name); xbt_dynar_push(result,¤t_job); - -} -void STag_dax__child(void) { -// INFO0("See "); -} -void STag_dax__parent(void) { -// INFO0("See "); } void STag_dax__uses(void) { SD_task_t file; @@ -179,6 +214,23 @@ void STag_dax__uses(void) { } } } +static SD_task_t current_child; +void STag_dax__child(void) { + current_child = xbt_dict_get_or_null(jobs,A_dax__child_ref); + if (current_child==NULL) + dax_parse_error(bprintf("Asked to add dependencies to the non-existent %s task",A_dax__child_ref)); +} +void ETag_dax__child(void) { + current_child=NULL; +} +void STag_dax__parent(void) { + SD_task_t parent = xbt_dict_get_or_null(jobs,A_dax__parent_ref); + if (parent == NULL) + dax_parse_error(bprintf("Asked to add a dependency from %s to %s, but %s does not exist", + current_child->name,A_dax__parent_ref,A_dax__parent_ref)); + SD_task_dependency_add(NULL,NULL,parent,current_child); + DEBUG2("Control-flow dependency from %s to %s", current_child->name,parent->name); +} void ETag_dax__adag(void) { // INFO0("See "); } @@ -186,9 +238,6 @@ void ETag_dax__job(void) { current_job = NULL; // INFO0("See "); } -void ETag_dax__child(void) { -// INFO0("See "); -} void ETag_dax__parent(void) { // INFO0("See "); }