Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
avoid file transmition between root and ready node, and between some
[simgrid.git] / src / simdag / sd_dotloader.c
index cb9108c..3749926 100644 (file)
@@ -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,60 +157,32 @@ 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 <job id=%s runtime=%s %.0f>",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,&current_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,&current_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){
-        SD_task_t file;
-        char *name= (char*)"root->many";
-        double 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 {
-            if (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);
+    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);
         count++;
     }
-    if (count==0){
-        SD_task_t file;
-        char *name = (char*)"many->end";
-        double size = 0;
-
-        //  INFO2("See <uses file=%s %s>",A_dot__uses_file,(is_input?"in":"out"));
-        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 {
-            if (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) {
-            WARN1("File %s created at more than one location...",file->name);
-        }
+    if (count==0 && current_job != end_task){
+        SD_task_dependency_add(NULL,NULL,current_job,end_task);
     }
 }
 
@@ -221,20 +196,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 +228,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 <uses file=%s %s>",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);
+      }
     }
 }