From a0319214b0d4f9b17f316e9938ce7f8e69eb3182 Mon Sep 17 00:00:00 2001 From: quintin Date: Tue, 20 Jul 2010 08:53:24 +0000 Subject: [PATCH 1/1] DotLoader : Add the possibility to have some edge from root to a node from a node to end and to have some dependencies without transfers git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8034 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- examples/simdag/dot/dag.dot | 9 +++-- src/simdag/sd_dotloader.c | 68 ++++++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/examples/simdag/dot/dag.dot b/examples/simdag/dot/dag.dot index d675d65429..d84ed24ff5 100644 --- a/examples/simdag/dot/dag.dot +++ b/examples/simdag/dot/dag.dot @@ -1,4 +1,5 @@ digraph G { +end [size="10000000129.452715"]; 0 [size="10000000129.452715"]; 1 [size="10000000131.133657"]; 2 [size="10000000121.12487"]; @@ -12,10 +13,12 @@ digraph G { 0->1 [size="10001.389601075407"]; 1->2 [size="10004.164631264117"]; 2->3 [size="10001.781644976922"]; -3->4 [size="10005.191659731605"]; +3->4 [size="-1"]; 4->5 [size="10029.262823275711"]; -5->6 [size="10035.687920631362"]; +5->6 [size="0.0"]; 6->7 [size="10004.920415194067"]; 7->8 [size="10000.234048984707"]; -8->9 [size="10014.203269230178"]; +8->9 ; +7->end [size="10014000.0"]; +root->5 [size="10014000.0"]; } diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index cb9108cd02..2cd4ed7fdc 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -20,15 +20,16 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t *edge) ; xbt_dynar_t SD_dotload_FILE(FILE* in_file); static double dot_parse_double(const char *string) { - if (string == NULL) return -10; + if (string == NULL) return -1; int ret = 0; - double value; + double value = -1; ret = sscanf(string, "%lg", &value); if (ret != 1) WARN1("%s is not a double", string); return value; } + static int dot_parse_int(const char *string) { if (string == NULL) return -10; int ret = 0; @@ -88,12 +89,14 @@ xbt_dynar_t SD_dotload_FILE(FILE* in_file){ /* by design the root task is always SCHEDULABLE */ __SD_task_set_state(root_task, SD_SCHEDULABLE); + xbt_dict_set(jobs,"root",root_task,NULL); xbt_dynar_push(result,&root_task); end_task = SD_task_create_comp_seq("end",NULL,0); + xbt_dict_set(jobs,"end",end_task,NULL); Agnode_t *dag_node = NULL; for (dag_node = agfstnode(dag_dot); dag_node; dag_node = agnxtnode(dag_dot,dag_node)){ - dot_add_task(dag_node); + dot_add_task(dag_node); } agclose(dag_dot); xbt_dict_free(&jobs); @@ -154,19 +157,23 @@ xbt_dynar_t SD_dotload_FILE(FILE* in_file){ * 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")); long performer = (long)dot_parse_int((char *) agget(dag_node,(char*)"performer")); INFO3("See ",name,agget(dag_node,(char*)"size"),runtime); - SD_task_t current_job = SD_task_create_comp_seq(name,(void*)performer,runtime); - xbt_dict_set(jobs,name,current_job,NULL); - xbt_dynar_push(result,¤t_job); + current_job = xbt_dict_get_or_null(jobs,name); + if (current_job == NULL) { + current_job = SD_task_create_comp_seq(name,(void*)performer,runtime); + 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); count++; } - if (count==0){ + if (count==0 && current_job != root_task){ SD_task_t file; char *name= (char*)"root->many"; double size = 0; @@ -188,7 +195,7 @@ void dot_add_task(Agnode_t *dag_node) { dot_add_output_dependencies(current_job,e); count++; } - if (count==0){ + if (count==0 && current_job != end_task){ SD_task_t file; char *name = (char*)"many->end"; double size = 0; @@ -221,20 +228,27 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t *edge) { char name[80]; sprintf(name ,"%s->%s",agnameof(agtail(edge)) ,agnameof(aghead(edge))); double size = dot_parse_double(agget(edge,(char*)"size")); + INFO2("size : %e, get size : %s",size,agget(edge,(char*)"size")); //int sender = dot_parse_int(agget(edge,(char*)"sender")); //int reciever = dot_parse_int(agget(edge,(char*)"reciever")); - - file = xbt_dict_get_or_null(files,name); - if (file==NULL) { + if(size >0){ + file = xbt_dict_get_or_null(files,name); + if (file==NULL) { file = SD_task_create_comm_e2e(name,NULL,size); xbt_dict_set(files,name,file,&dot_task_free); - } else { + } else { if (SD_task_get_amount(file)!=size) { - WARN3("Ignoring file %s size redefinition from %.0f to %.0f", - name,SD_task_get_amount(file),size); + WARN3("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,agnameof(agtail(edge))); + if (file != NULL){ + SD_task_dependency_add(NULL,NULL,file,current_job); + } } - SD_task_dependency_add(NULL,NULL,file,current_job); } /* dot_add_output_dependencies create the dependencies between a @@ -246,23 +260,31 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t *edge) { char name[80]; sprintf(name ,"%s->%s",agnameof(agtail(edge)) ,agnameof(aghead(edge))); double size = dot_parse_double(agget(edge,(char*)"size")); + INFO2("size : %e, get size : %s",size,agget(edge,(char*)"size")); //int sender = dot_parse_int(agget(edge,(char*)"sender")); //int reciever = dot_parse_int(agget(edge,(char*)"reciever")); //INFO2("See ",A_dot__uses_file,(is_input?"in":"out")); - file = xbt_dict_get_or_null(files,name); - if (file==NULL) { + if(size >0){ + file = xbt_dict_get_or_null(files,name); + if (file==NULL) { file = SD_task_create_comm_e2e(name,NULL,size); xbt_dict_set(files,name,file,&dot_task_free); - } else { + } else { if (SD_task_get_amount(file)!=size) { - WARN3("Ignoring file %s size redefinition from %.0f to %.0f", - name,SD_task_get_amount(file),size); + WARN3("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) { + } + SD_task_dependency_add(NULL,NULL,current_job,file); + if (xbt_dynar_length(file->tasks_before)>1) { WARN1("File %s created at more than one location...",file->name); + } + }else{ + file = xbt_dict_get_or_null(jobs,agnameof(aghead(edge))); + if (file != NULL){ + SD_task_dependency_add(NULL,NULL,current_job,file); + } } } -- 2.20.1