changeset 1043:283b15633c0f

Merged ( app_loop should return 1, if you want to use allExecute )
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 08 Dec 2010 00:04:02 +0900
parents b9cd0c88b69a (current diff) b067fd5d8859 (diff)
children 150412ed980a
files Renderer/Engine/Application.h Renderer/Engine/viewer.cc
diffstat 6 files changed, 252 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/Application.h	Tue Dec 07 23:59:46 2010 +0900
+++ b/Renderer/Engine/Application.h	Wed Dec 08 00:04:02 2010 +0900
@@ -15,7 +15,11 @@
     Application();
     virtual ~Application();
 
+<<<<<<< local
     virtual bool app_main(Viewer *viewer){ return 1; /* use all execute */ };
+=======
+    virtual void app_loop(Viewer *viewer){};
+>>>>>>> other
     virtual HTaskPtr application_task(HTaskPtr next, Viewer* viewer){return next;};
     virtual MainLoopPtr init(Viewer *viewer, int w, int h)  = 0;
 };
--- a/Renderer/Engine/Button.cc	Tue Dec 07 23:59:46 2010 +0900
+++ b/Renderer/Engine/Button.cc	Wed Dec 08 00:04:02 2010 +0900
@@ -25,6 +25,17 @@
 }
 
 /**
+ * ボタンの状態を初期化する
+ */
+void
+Button::reset(void)
+{
+    push = 0;
+    hold = 0;
+    release = 0;
+}
+
+/**
  * @retval 1 ボタンが押された(このフレームのみ)
  * @retval 0 押されていない
  */
--- a/Renderer/Engine/Button.h	Tue Dec 07 23:59:46 2010 +0900
+++ b/Renderer/Engine/Button.h	Wed Dec 08 00:04:02 2010 +0900
@@ -11,6 +11,7 @@
 
     void push_work(void);
     void release_work(void);
+    void reset(void);
     int isPush(void);
     int isHold(void);
     int isRelease(void);
--- a/Renderer/Engine/viewer.cc	Tue Dec 07 23:59:46 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Wed Dec 08 00:04:02 2010 +0900
@@ -315,7 +315,7 @@
 
     pixels = dev->flip_screen(pixels);
     sgroot->updateControllerState();
-    if (app->app_main(this)) {
+    if (app->app_loop(this)) {
 	//TaskArray を使うか使わないか
 	if (sgroot->gtask_array != NULL) {
 	    sgroot->create_task_array();
--- a/example/HelloWorld/main.cc	Tue Dec 07 23:59:46 2010 +0900
+++ b/example/HelloWorld/main.cc	Wed Dec 08 00:04:02 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 23:59:46 2010 +0900
+++ b/example/word_count/main.cc	Wed Dec 08 00:04:02 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) {