changeset 683:9a6cb2439593

on going...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 06 Dec 2009 18:53:46 +0900
parents 80b23718df18
children 458a1ad91427
files TaskManager/Cell/spe/TaskArray.cc TaskManager/Makefile.def TaskManager/kernel/ppe/HTask.cc TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/Task.cc TaskManager/kernel/ppe/Task.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/SchedTaskList.cc TaskManager/kernel/sys_task/TaskArray.cc example/Bulk/Makefile.def example/Bulk/main.cc
diffstat 12 files changed, 105 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/Cell/spe/TaskArray.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -0,0 +1,33 @@
+#include "Finish.h"
+#include "SysFunc.h"
+#include "Scheduler.h"
+#include "Task.h"
+
+
+SchedDefineTask(TaskArray);
+
+#ifdef SIMPLE_TASK
+static Task *
+next(Task *t) 
+{
+    char *p = (char*)t;
+    p += t->size();
+    return (Task*)p;
+}
+#endif
+
+static int
+run(SchedTask *s,void *rbuf, void *wbuf)
+{
+#ifdef SIMPLE_TASK
+    Task *task = (Task *)rbuf;
+    Task *last = ((char*)rbuf)+ s->read_size();
+   
+    while( task <  last) {
+	task->print(s);
+	task = next(task);
+    }
+#endif
+
+    return 0;
+}
--- a/TaskManager/Makefile.def	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/Makefile.def	Sun Dec 06 18:53:46 2009 +0900
@@ -29,8 +29,8 @@
 
 ABIBIT = 32
 
-# SIMPLE_TASK=-DSIMPLE_TASK
-SIMPLE_TASK=
+SIMPLE_TASK=-DSIMPLE_TASK
+# SIMPLE_TASK=
 
 # OPT = -O9 
 OPT =  -g
--- a/TaskManager/kernel/ppe/HTask.cc	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -54,7 +54,7 @@
 Task *
 HTask::create_task(int task_id, int pos)
 {
-    Task *task = (Task*)((memaddr)rbuf + pos);
+    Task *task = (Task*)((memaddr)this->rbuf + pos);
     task->set_task_id(task_id);
     return task;
 }
--- a/TaskManager/kernel/ppe/HTask.h	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Sun Dec 06 18:53:46 2009 +0900
@@ -21,7 +21,10 @@
   特定の Task を待ち合わせる事が可能。
   Task の入出力は dma などで copy される。
  */
-#ifdef SIPMLE_TASK
+#ifdef SIMPLE_TASK
+
+#include "SimpleTask.h"
+
 class HTask : public SimpleTask {
 #else
 class HTask : public Task {
@@ -45,7 +48,7 @@
     void wait_for(HTask *);
     void set_cpu(CPU_TYPE type);    
     void set_post(PostFunction func, void *read, void *write);
-#ifdef SIPMLE_TASK
+#ifdef SIMPLE_TASK
     Task *create_task(int task_id, int pos);
 #endif
 };
--- a/TaskManager/kernel/ppe/Task.cc	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -1,5 +1,7 @@
 #include "Task.h"
 
+// #include "SchedTask.h"  it includes #define Task
+
 #ifndef SIMPLE_TASK
 /**
  * タスクの入力データを追加する
@@ -40,7 +42,7 @@
 
 // こちらのAPIは、受け側と出力側での対応を良く見れない。廃止の方向。
 int
-Task::add_param0(memaddr _param)
+Task::add_param_t(memaddr _param)
 {
     if (param_size >= MAX_PARAMS) return -1;
     
@@ -49,7 +51,7 @@
 }
 
 int
-Task::set_param0(int index, memaddr _param)
+Task::set_param_t(int index, memaddr _param)
 {
     if (index >= MAX_PARAMS) return -1;
     
@@ -108,14 +110,14 @@
 }
 
 void
-Task::print(SchedTask *s)
+Task::print()
 {
-    s->printf("task id %d param size %d "
+    printf("task id %d param size %d "
        "inData size %d "
-       "outData size %d\n", task_id, param_size, inData_size, outData_size;
+       "outData size %d\n", command, param_size, inData_size, outData_size
     );
     for(int i=0; i< param_size; i++) {
-	s->printf("param %d = 0x%ld\n", param(i));
+	printf("param %d = 0x%ld\n", i, (long)param(i));
     }
 
 }
--- a/TaskManager/kernel/ppe/Task.h	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Sun Dec 06 18:53:46 2009 +0900
@@ -33,11 +33,15 @@
 #define add_outData(addr, size)			\
     add_outData_t((memaddr)(addr), (size));
 };
+
 #else
+
+class SchedTask;
+
 class Task {
 public: // variables
 
-    int task_id;
+    int command;
     int param_size;
     int inData_size;
     int outData_size;
@@ -50,20 +54,18 @@
     // int add_inData_t(memaddr addr, int size);  
     // int add_outData_t(memaddr addr, int size); 
 
-    void print(SchedTask *s);
+    void print();
 
     memaddr param(int index) {
-	memaddr p = (memaddr)data->data;
+	memaddr p = (memaddr)data;
 	return p + sizeof(memaddr)*index;
     }
     memaddr inData(int index) {
-	memaddr p = (memaddr)data
-	     + (sizeof(memaddr)*index);
-	return p + sizeof(ListElement)*index;
+	return param(param_size) + sizeof(ListElement)*index;
     }
     memaddr outData(int index) {
 	memaddr p = inData(inData_size);
-	return p + sizeof(ListEelement)* index;
+	return p + sizeof(ListElement)* index;
     }
 
     void set_param_length(int i) { param_size = i; }
@@ -71,22 +73,30 @@
     void set_outData_length(int length) { outData_size = length; }
     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) { task_id = id; }
-    int set_param_t(int index, memaddr param) {
-	memaddr *p = (memaddr*)param(index);
+    void set_task_id(int id) { command = id; }
+    void set_param_t(int index, memaddr param) {
+	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;
+	return size;
+    }
+
 // #define add_param(param) add_param_t((memaddr)(param))
 #define set_param(index,param) set_param_t(index, (memaddr) (param))
 
-// #define add_inData(addr, size)			\
+// #define add_inData(addr, size)			
 //     add_inData_t((memaddr)(addr), (size));
-// #define add_outData(addr, size)			\
+// #define add_outData(addr, size)			
 //     add_outData_t((memaddr)(addr), (size));
+
 #define set_inData(index, addr, size)			\
     set_inData_t(index, (memaddr)(addr), (size));
 #define set_outData(index, addr, size)			\
--- a/TaskManager/kernel/schedule/SchedTask.cc	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -8,6 +8,11 @@
 #include "TaskManager.h"
 #include <stdarg.h>
 
+#ifdef SIMPLE_TASK
+#define Task SimpleTask
+#define TaskPtr SimpleTaskPtr
+#endif
+
 extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT];
 
 /**
--- a/TaskManager/kernel/schedule/SchedTask.h	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Sun Dec 06 18:53:46 2009 +0900
@@ -10,10 +10,6 @@
 #include "HTask.h"
 #include "MemList.h"
 
-#ifdef SIMPLE_TASK
-#define Task SimpleTask
-#define TaskPtr SimpleTaskPtr
-#endif
 
 class SchedTask : public SchedTaskBase {
 public:
@@ -31,13 +27,15 @@
     
     // 現在スケジューラが実行している TaskList と、このタスクに対応する Task
     TaskListPtr list;
-    TaskPtr task;
 
     // read/write 用の ListData
     ListDataPtr inListData;
     ListDataPtr outListData;
 #ifndef SIMPLE_TASK
+    TaskPtr task;
     memaddr *param;
+#else
+    SimpleTaskPtr task;
 #endif
 
     /**
@@ -69,9 +67,13 @@
 public:
     /* functions */
 
+#ifdef SIMPLE_TASK
+    void init(TaskListPtr _list, SimpleTaskPtr _task, int index,
+		    Scheduler* sc);
+#else
     void init(TaskListPtr _list, TaskPtr _task, int index,
-                    // ListDataPtr rbuf, ListDataPtr wbuf, 
 		    Scheduler* sc);
+#endif
 
     //---  User API ---
 #ifdef SIMPLE_TASK
@@ -158,7 +160,11 @@
 };
 
 
+#ifdef SIMPLE_TASK
+extern SchedTask* createSchedTask(Scheduler *,SimpleTaskPtr);
+#else
 extern SchedTask* createSchedTask(Scheduler *,TaskPtr);
+#endif
 
 
 #endif
--- a/TaskManager/kernel/schedule/SchedTaskList.cc	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -52,7 +52,11 @@
     if (list->length < 1) {
 	nextSched = new SchedNop2Ready(scheduler);
     } else {
+#ifdef SIMPLE_TASK
+	SimpleTaskPtr nextTask = &list->tasks[0];
+#else
 	TaskPtr nextTask = &list->tasks[0];
+#endif
 	nextSched = createSchedTask(scheduler, nextTask);
 	((SchedTask*)nextSched)->init(list, nextTask, 1,
 					  scheduler);
--- a/TaskManager/kernel/sys_task/TaskArray.cc	Sun Dec 06 18:13:46 2009 +0900
+++ b/TaskManager/kernel/sys_task/TaskArray.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -6,6 +6,7 @@
 
 SchedDefineTask(TaskArray);
 
+#ifdef SIMPLE_TASK
 static Task *
 next(Task *t) 
 {
@@ -13,17 +14,20 @@
     p += t->size();
     return (Task*)p;
 }
+#endif
 
 static int
 run(SchedTask *s,void *rbuf, void *wbuf)
 {
+#ifdef SIMPLE_TASK
     Task *task = (Task *)rbuf;
-    Task *last = ((char*)rbuf)+ s->read_size();
+    Task *last = (Task*)(((char*)rbuf)+ s->read_size());
    
     while( task <  last) {
-	task->print(s);
+	task->print();
 	task = next(task);
     }
+#endif
 
     return 0;
 }
--- a/example/Bulk/Makefile.def	Sun Dec 06 18:13:46 2009 +0900
+++ b/example/Bulk/Makefile.def	Sun Dec 06 18:53:46 2009 +0900
@@ -8,7 +8,8 @@
 CERIUM = ../../../Cerium
 
 CC      = g++
-CFLAGS  = -g -Wall -O9
+OPT = -g
+CFLAGS  =  -Wall $(OPT)  -DSIMPLE_TASK
 
 ABIBIT = 32
 
--- a/example/Bulk/main.cc	Sun Dec 06 18:13:46 2009 +0900
+++ b/example/Bulk/main.cc	Sun Dec 06 18:53:46 2009 +0900
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "TaskManager.h"
+#include "Task.h"
 #include "Func.h"
 
 extern void task_init(void);
@@ -32,8 +33,10 @@
 twice_result(SchedTask *s, void *a, void *b)
 {
     int* data = (int*)a;
+    int* task_buf = (int*)b;
     print_data(data, length, "after");
     free(data);
+    free(task_buf);
 }
 
 int
@@ -68,8 +71,7 @@
      * Create Task
      *   create_task(Task ID);
      */ 
-    int size = count*(SizeOfParam(2) + SizeOfData(sizeof(int)*length) +
-			SizeOfData(sizeof(int)*length));
+    int size = Task::count_size(2,length,0) * count;
 
     memaddr task_buf = (memaddr)manager->allocate(size);
     HTask *twice_main = manager->create_task(TaskArray, task_buf, size, 0, 0);
@@ -109,7 +111,7 @@
     /*
      * set_post() で ppe task を渡せるようにしたい
      */
-    twice_main->set_post(twice_result, (void*)data, 0);
+    twice_main->set_post(twice_result, (void*)data, (void*)task_buf);
     // add Active Queue
     twice_main->spawn();    
 }