Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
DotLoader : Add the possibility to have some edge from root to a node
authorquintin <quintin@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 20 Jul 2010 08:53:24 +0000 (08:53 +0000)
committerquintin <quintin@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 20 Jul 2010 08:53:24 +0000 (08:53 +0000)
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
src/simdag/sd_dotloader.c

index d675d65..d84ed24 100644 (file)
@@ -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"];
 }
index cb9108c..2cd4ed7 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,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 <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){
+    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 <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);
+      }
     }
 }