changeset 684:458a1ad91427

Task Array generation worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 06 Dec 2009 23:03:28 +0900
parents 9a6cb2439593
children b386522827ae
files TaskManager/kernel/ppe/HTask.cc TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/Task.cc TaskManager/kernel/ppe/Task.h TaskManager/kernel/schedule/Scheduler.cc TaskManager/kernel/sys_task/TaskArray.cc TaskManager/kernel/sys_task/systask_register.cc example/Bulk/main.cc example/Bulk/ppe/Twice.cc example/Bulk/ppe/task_init.cc
diffstat 10 files changed, 80 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/HTask.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -52,13 +52,29 @@
 #ifdef SIMPLE_TASK
 
 Task *
-HTask::create_task(int task_id, int pos)
+HTask::create_task_array(int task_id, int pos)
 {
-    Task *task = (Task*)((memaddr)this->rbuf + pos);
+    Task *task = (Task*)((memaddr)rbuf + pos);
     task->set_task_id(task_id);
+    task-> param_size = 0;
+    task-> inData_size = 0;
+    task-> outData_size = 0;
+    task-> inData_offset = 0;
+    task-> outData_offset = 0;
+
     return task;
 }
 
+void
+HTask::spawn_task_array(int pos)
+{
+    if (pos!= r_size) {
+	printf("spawn task array size differ pos 0x%x r_size 0x%x\n",
+	    pos, r_size);
+    }
+}
+
+
 #endif
 
 /* end */
--- a/TaskManager/kernel/ppe/HTask.h	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Sun Dec 06 23:03:28 2009 +0900
@@ -44,12 +44,13 @@
     HTask *next;
     HTask *prev;
 
-    void spawn(void);
+    void spawn();
     void wait_for(HTask *);
     void set_cpu(CPU_TYPE type);    
     void set_post(PostFunction func, void *read, void *write);
 #ifdef SIMPLE_TASK
-    Task *create_task(int task_id, int pos);
+    Task *create_task_array(int task_id, int pos);
+    void spawn_task_array(int pos);
 #endif
 };
 
--- a/TaskManager/kernel/ppe/Task.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -112,11 +112,11 @@
 void
 Task::print()
 {
-    printf("task id %d param size %d "
+    printf("task id %d task size = %d param size %d "
        "inData size %d "
-       "outData size %d\n", command, param_size, inData_size, outData_size
+       "outData size %d\n", command, size(), param_size, inData_size, outData_size
     );
-    for(int i=0; i< param_size; i++) {
+    for(int i=0; i< param_size && i<5; i++) {
 	printf("param %d = 0x%ld\n", i, (long)param(i));
     }
 
--- a/TaskManager/kernel/ppe/Task.h	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Sun Dec 06 23:03:28 2009 +0900
@@ -40,11 +40,13 @@
 
 class Task {
 public: // variables
-
+    int task_size;
     int command;
     int param_size;
     int inData_size;
     int outData_size;
+    int inData_offset;
+    int outData_offset;
     void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); 
     // memaddr param[param_size];
     // ListEelemnt inData[inData_size];
@@ -57,20 +59,42 @@
     void print();
 
     memaddr param(int index) {
-	memaddr p = (memaddr)data;
-	return p + sizeof(memaddr)*index;
+	return (memaddr)data + sizeof(memaddr)*index;
     }
     memaddr inData(int index) {
-	return param(param_size) + sizeof(ListElement)*index;
+	memaddr p = (memaddr)data + inData_offset;
+	return p + sizeof(ListElement)*index;
     }
     memaddr outData(int index) {
-	memaddr p = inData(inData_size);
+	memaddr p = (memaddr)data + outData_offset;
 	return p + sizeof(ListElement)* index;
     }
 
-    void set_param_length(int i) { param_size = i; }
-    void set_inData_length(int length)  { inData_size = length; }
-    void set_outData_length(int length) { outData_size = length; }
+    void set_param_length(int i) { 
+	param_size = i; 
+	inData_offset = round_up16(sizeof(Task))+param_size*sizeof(memaddr);
+    }
+    void set_inData_length(int length)  { 
+	inData_size = length; 
+	if (inData_offset==0) {
+	    printf("call set_param_length before\n");
+	}
+	outData_offset = 
+	    round_up16(inData_offset+inData_size*sizeof(ListElement)); 
+    }
+    void set_outData_length(int length) { 
+	outData_size = length; 
+	if (outData_offset==0) {
+	    printf("call set_outData_length before\n");
+	}
+	task_size = round_up16(outData_offset+outData_size*sizeof(ListElement)); 
+    }
+    int size() {
+	if (task_size==0) {
+	    printf("call set_outData_length before\n");
+	}
+	return task_size;
+    }
     void set_inData_t( int index, memaddr addr, int size); 
     void set_outData_t(int index, memaddr addr, int size); 
     void set_task_id(int id) { command = id; }
@@ -78,14 +102,12 @@
 	memaddr *p = (memaddr*)this->param(index);
 	*p = param;
     }
-    int size() {
-	return outData(outData_size)-(memaddr)data;
-    }
 
     static int count_size(int params, int ins, int outs) {
-	int size = sizeof(memaddr)*params
-           + sizeof(ListElement)*ins
-           + sizeof(ListElement)*outs;
+	int size = round_up16(sizeof(Task))
+	   + round_up16(sizeof(memaddr)*params)
+           + round_up16(sizeof(ListElement)*ins)
+           + round_up16(sizeof(ListElement)*outs);
 	return size;
     }
 
--- a/TaskManager/kernel/schedule/Scheduler.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -25,6 +25,8 @@
     return 0;
 }
 
+static void null_loader(Scheduler *m, int task_id);
+
 /*! @brief speTaskの入出力のパイプラインバッファを確保する
  */
 
@@ -34,7 +36,9 @@
     hash = 0;
 
     for (int i = 0; i< MAX_TASK_OBJECT; i++) {
-	task_list[0].run = null_run;
+	task_list[i].run = null_run;
+	task_list[i].load = null_loader;
+	task_list[i].wait = null_loader;
     }
 
     set_manager(m);
--- a/TaskManager/kernel/sys_task/TaskArray.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/sys_task/TaskArray.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -22,8 +22,10 @@
 #ifdef SIMPLE_TASK
     Task *task = (Task *)rbuf;
     Task *last = (Task*)(((char*)rbuf)+ s->read_size());
-   
+
+    s->printf("last = %lx\n"   ,(long) last);
     while( task <  last) {
+	s->printf("  task = %lx\n"   ,(long) task);
 	task->print();
 	task = next(task);
     }
--- a/TaskManager/kernel/sys_task/systask_register.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/TaskManager/kernel/sys_task/systask_register.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -3,10 +3,12 @@
 
 SchedExternTask(StartTask);
 SchedExternTask(FinishTask);
+SchedExternTask(TaskArray);
 
 void
 systask_register()
 {
     SchedRegister(StartTask);
     SchedRegister(FinishTask);
+    SchedRegister(TaskArray);
 }
--- a/example/Bulk/main.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/example/Bulk/main.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -71,14 +71,16 @@
      * Create Task
      *   create_task(Task ID);
      */ 
-    int size = Task::count_size(2,length,0) * count;
+    int size = Task::count_size(2,2,2);
+    printf("allocate task size 0x%0x\n",size);
+    printf("allocate task total size 0x%0x\n",(size *= count));
 
     memaddr task_buf = (memaddr)manager->allocate(size);
     HTask *twice_main = manager->create_task(TaskArray, task_buf, size, 0, 0);
 
     int pos = 0;
     for(int i = 0;i<count;i++) {
-	Task *t = twice_main->create_task(Twice,pos);
+	Task *t = twice_main->create_task_array(Twice,pos);
 	int length2 = length/2;
         //  以下の順序でデータを追加する必要がある。
         //  length を先に指定すればsetは後からでも良い。
@@ -104,9 +106,10 @@
 	t->set_outData(0,data, sizeof(int)*length2);
 	t->set_outData(1,data+length2, sizeof(int)*length2);
 	pos += t->size();
+	printf("pos 0x%0x size 0x%0x\n",pos, t->size());
+    }
+    twice_main->spawn_task_array(pos);
 
-        // delete t; // Wao!
-    }
     twice_main->set_cpu(SPE_ANY);
     /*
      * set_post() で ppe task を渡せるようにしたい
--- a/example/Bulk/ppe/Twice.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/example/Bulk/ppe/Twice.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -9,6 +9,7 @@
 static int
 run(SchedTask *s,void *rbuf, void *wbuf)
 {
+#if 0
     int *i_data;
     int *o_data;
     long length;
@@ -20,6 +21,7 @@
     for (int i = 0; i < length; i++) {
 	o_data[i] = i_data[i] * 2;
     }
+#endif
     
     return 0;
 }
--- a/example/Bulk/ppe/task_init.cc	Sun Dec 06 18:53:46 2009 +0900
+++ b/example/Bulk/ppe/task_init.cc	Sun Dec 06 23:03:28 2009 +0900
@@ -13,5 +13,5 @@
 void
 task_init(void)
 {
-  SchedRegisterTask(TWICE_TASK, Twice);
+  SchedRegister(Twice);
 }