changeset 1041:ce2e2c3efab3

merge
author yutaka@localhost.localdomain
date Mon, 06 Dec 2010 18:04:18 +0900
parents 1e243714cf3c (diff) 153dd7b4b8a6 (current diff)
children b067fd5d8859
files
diffstat 2 files changed, 235 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/example/HelloWorld/main.cc	Tue Dec 07 16:38:08 2010 +0900
+++ b/example/HelloWorld/main.cc	Mon Dec 06 18:04:18 2010 +0900
@@ -7,8 +7,10 @@
 extern void task_init(void);
 
 static int count = 1;
+static int spe_num = 1;
 
 extern TaskManager *manager;
+int use_task_creater = 0;
 
 const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\
   -cpu    Number of SPE (default 1) \n\
@@ -20,24 +22,136 @@
     for (int i = 1; argv[i]; ++i) {
 	if (strcmp(argv[i], "-count") == 0) {
             count = atoi(argv[++i]);
-        }
+        } else if (strcmp(argv[i], "-cpu") == 0) {
+	    spe_num = atoi(argv[i+1]);
+	} else if (strcmp(argv[i], "-t") == 0) {
+	    use_task_creater = 1;
+	} 
+
+
 
     }
 
     return 0;
 }
 
+
+static void simple_task_creater(int in_total_size, int out_total_size, 
+			     int command, int in_data_size, int out_data_size, 
+			     void *in_data, void *out_data, TaskManager *manager,
+			     HTask *wait_i, HTask *wait_me) {
+
+
+  int in_task_size = 0;
+  int out_task_size = 0;
+
+  if (in_total_size != 0) {
+    in_task_size = in_total_size / in_data_size;
+    if (in_total_size != in_task_size * in_data_size) {
+      printf("mismatch of in_total_size and in_data_size\n");
+    }
+  }
+
+  if (out_total_size != 0) {
+    out_task_size = out_total_size / out_data_size;
+    if (out_total_size != out_task_size * out_data_size) {
+      printf("mismatch of out_total_size and out_data_size\n");
+    }
+  }
+ 
+  /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/
+  int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size;
+
+  if (task_num == 0) task_num = 1;
+
+  /*spe分あればいいのかな?*/
+
+  int array_num = spe_num;
+  if (task_num < array_num) {
+    array_num = task_num;
+  }
+
+
+  int array_length = task_num / array_num;
+  int rest = task_num % array_num;
+
+  HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num);
+  TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_length*array_num);
+
+  int index = 0;
+  
+  for (int k = 0; k < array_num; k++) {
+
+    task_array[k] = manager->create_task_array(command,array_length,0,1,1);
+    t_exec[k] = 0;
+    
+    if (wait_me != 0) {
+      wait_me->wait_for(task_array[k]);
+    }
+    if (wait_i != 0) {
+      task_array[k]->wait_for(wait_i);
+    }
+    
+  }
+
+  for (int j = 0; j < array_length; j++) {
+    for (int k = 0; k < array_num; k++) {
+      
+      t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]);
+      t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+      t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+
+      index++;
+
+    }
+  }
+  
+  for (int k = 0; k < array_num; k++) {
+    task_array[k]->spawn_task_array(t_exec[k]->next());
+    task_array[k]->set_cpu(SPE_ANY);
+    task_array[k]->spawn();
+  }	
+
+  for (int k = 0; k < rest; k++) {
+    HTaskPtr t_exec = manager->create_task(command);
+    
+    t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+    t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+      
+    index++;
+
+    if (wait_me != 0) {
+      wait_me->wait_for(t_exec);
+    }
+    if (wait_i != 0) {
+      t_exec->wait_for(wait_i);
+    }
+
+    t_exec->set_cpu(SPE_ANY);
+    t_exec->spawn();
+
+  }
+
+
+}
+
 void
 hello_init(TaskManager *manager)
 {
 
-
     for (int i = 0; i < count; i++) {
 	/**
 	 * Create Task
 	 *   create_task(Task ID);
 	 */
 
+
+      if (use_task_creater) {
+
+	simple_task_creater(0,0,Hello,0,0,0,0,manager,0,0);	
+
+      } else {
+
 	HTask *hello = manager->create_task(Hello);
 
 	/**
@@ -54,7 +168,10 @@
 	hello->set_param(0,(memaddr)i);
 
 	hello->spawn();
+      }
     }
+
+
 }
 
 int
--- a/example/word_count/main.cc	Tue Dec 07 16:38:08 2010 +0900
+++ b/example/word_count/main.cc	Mon Dec 06 18:04:18 2010 +0900
@@ -15,6 +15,7 @@
 
 int all = 0;
 int use_task_array = 1;
+int use_task_creater = 0;
 int use_compat = 0;
 int array_task_num = 8;
 int spe_num = 1;
@@ -27,6 +28,105 @@
 } st_mmap_t;
 
 
+static void simple_task_creater(int in_total_size, int out_total_size, 
+			     int command, int in_data_size, int out_data_size, 
+			     void *in_data, void *out_data, SchedTask *manager,
+			     HTask *wait_i, HTask *wait_me) {
+
+
+  int in_task_size = 0;
+  int out_task_size = 0;
+
+  if (in_total_size != 0) {
+    in_task_size = in_total_size / in_data_size;
+    if (in_total_size != in_task_size * in_data_size) {
+      printf("mismatch of in_total_size and in_data_size\n");
+    }
+  }
+
+  if (out_total_size != 0) {
+    out_task_size = out_total_size / out_data_size;
+    if (out_total_size != out_task_size * out_data_size) {
+      printf("mismatch of out_total_size and out_data_size\n");
+    }
+  }
+ 
+  /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/
+  int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size;
+
+  if (task_num == 0) task_num = 1;
+
+  /*spe分あればいいのかな?*/
+
+  int array_num = spe_num;
+  if (task_num < array_num) {
+    array_num = task_num;
+  }
+
+
+  HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num);
+  TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_num);
+
+  int array_length = task_num / array_num;
+  int rest = task_num % array_num;
+
+  int index = 0;
+  
+  for (int k = 0; k < array_num; k++) {
+
+    task_array[k] = manager->create_task_array(command,array_length,0,1,1);
+    t_exec[k] = 0;
+    
+    if (wait_me != 0) {
+      wait_me->wait_for(task_array[k]);
+    }
+    if (wait_i != 0) {
+      task_array[k]->wait_for(wait_i);
+    }
+    
+  }
+
+  for (int j = 0; j < array_length; j++) {
+    for (int k = 0; k < array_num; k++) {
+      
+      t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]);
+      t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+      t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+
+      index++;
+
+    }
+  }
+  
+  for (int k = 0; k < array_num; k++) {
+    task_array[k]->spawn_task_array(t_exec[k]->next());
+    task_array[k]->set_cpu(SPE_ANY);
+    task_array[k]->spawn();
+  }	
+
+  for (int k = 0; k < rest; k++) {
+    HTaskPtr t_exec = manager->create_task(command);
+    
+    t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+    t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+      
+    index++;
+
+    if (wait_me != 0) {
+      wait_me->wait_for(t_exec);
+    }
+    if (wait_i != 0) {
+      t_exec->wait_for(wait_i);
+    }
+
+    t_exec->spawn();
+    t_exec->set_cpu(SPE_ANY);
+
+  }
+
+
+}
+
 
 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/
 static int
@@ -82,7 +182,18 @@
     array_task_num = task_count;
     if (task_count<=0) return;
   }
-  
+ 
+  //static void simple_task_creater(int in_total_size, int out_total_size, 
+  //			     int command, int in_data_size, int out_data_size, 
+  //			     void *in_data, void *out_data, TaskManager *manager,
+  //			     HTask *wait_i, HTask *wait_me)
+
+
+
+  if (use_task_creater) {
+    simple_task_creater(w->file_size, w->division_out_size * w->task_num, TASK_EXEC, w->division_size, w->division_out_size,
+			w->file_mmap, w->o_data, manager, w->t_print, 0);
+  }
 
   if (use_task_array) {
 
@@ -346,6 +457,10 @@
 	} else if (strcmp(argv[i], "-s") == 0) {
 	    use_task_array = 0;
 	    use_compat = 0;
+	} else if (strcmp(argv[i], "-t") == 0) {
+	    use_task_creater = 1;
+	    use_task_array = 0;
+	    use_compat = 0;
 	} else if (strcmp(argv[i], "-anum") == 0) {
 	    array_task_num = atoi(argv[i+1]);
 	} else if (strcmp(argv[i], "-cpu") == 0) {