changeset 694:be44ada665e9

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 10 Dec 2009 22:55:55 +0900
parents 9c8dd6026022 (diff) fc0227b5cb5a (current diff)
children cbcf0182635e
files TaskManager/Makefile.def
diffstat 22 files changed, 398 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Tue Dec 08 19:44:20 2009 +0900
+++ b/.hgtags	Thu Dec 10 22:55:55 2009 +0900
@@ -3,3 +3,4 @@
 30568cef3899caea3db0fb9e28b0e6f889c60679 double-linked-task-list
 8fca17aa57dfe07aeff46a3ae1707c795c762d72 examples
 9df0112f7ccfe03caffb06e64160ae2a6f3a22dd before_simple_task
+a06eef665c455b4da8dbe05595a5628aedd3eb3a before-task-array
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/Cell/spe/TaskArray.cc	Thu Dec 10 22:55:55 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/Cell/spe/main.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/Cell/spe/main.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -4,6 +4,8 @@
 #include "spu_mfcio.h"
 #include "error.h"
 #include "SysFunc.h"
+#include "SchedNop.h"
+
 
 extern unsigned char _end[];
 
@@ -36,7 +38,7 @@
 
     tm->set_scheduler(manager);
 
-    manager->run();
+    manager->run(new ScedNop());
     
     manager->finish();
 
--- a/TaskManager/ChangeLog	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/ChangeLog	Thu Dec 10 22:55:55 2009 +0900
@@ -1,3 +1,60 @@
+
+2009-12-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+    pipeline stageは、loop local だから、instance 変数である必
+    要はない。途中で中断することはない。これを一時変数にして、
+    再帰的にpipeline stage を呼び出せば良いらしい。
+
+    pipeline stage のtask1に引数で new SchedTaskList を渡すと、
+    run()でtask1 = new SchedNop() するよりループ二回ぐらい高速
+    になるらしい。が、おそらく、ほとんど影響はない。
+
+    pipelineで既に走っている次のTaskのreadを停める必要があるら
+    しい。前もってNopを入れて置く方法もあるが、TaskListの境界が
+    問題になる。停めないとパイプラインバッファを新たに取る必要
+    があり連鎖的にはまる。
+
+    writeしている奴もいるしな。スケジューラは一段しかネストしな
+    いから新しくバッファ取るか? いや、やっぱり許されないか。い
+    や、取るか。うーん、悩ましい。どうせ、Task list は確保しな
+    いとだめだから… 再帰しないで、もとのスケジューラで動かした
+    い
+
+    そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask
+    を投入して、間に TaskList read が入ってもなんとかなるように
+    工夫するのが良いっぽい
+
+    なんか、Renew Task の道を歩んでいる気もするが...
+
+2009-12-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+    やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている
+    かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの
+    が必要。deubg 用のデータ書き出しツールがいるな。
+
+    log header
+       command(16)  cpu-id(16)  event(32)  time(64)
+       struct debug_log {
+            uint16 command;
+            uint16 cpu-id;
+            uint32 event;
+            uint32 time;
+       }
+    ぐらい?  get_segment 使うべきか。連続領域に使える get_segement があると
+    良いわけね。write とも言うが。
+
+    sort で、memcpy しているのは変。read/write buffer をflipしてやると
+    良い。両方とも握っているんだから問題ない。ただし、read/write buffer
+    の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か?
+    sort ちゃんとは動いているんだよ。
+
+    word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが
+    あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに
+    なっている。PPUネックになっているっぽい。
+
+    TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを
+    用意する感じか。inData/outData の処理も。
+
 2009-12-5 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     なんかなぁ。一つの機能を付け加えようとすると、
@@ -34,7 +91,7 @@
     なっているらしい。
 
     実際、mail_sendQueue は、free list に置き換わってしまう。
-    これまで、これがおかしならなかった理由は不明。
+    これまで、これがおかしくならなかった理由は不明。
 
     connector に外から手を入れないで、ちゃんとfunction callするべし。
 
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -6,6 +6,7 @@
 #include "SchedTask.h"
 #include "types.h"
 #include "error.h"
+#include "SchedNop.h"
 
 FifoTaskManagerImpl::~FifoTaskManagerImpl()
 {
@@ -162,7 +163,8 @@
 	mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT);
 
 	// scheduler は受け取ったメールを元に実行する
-	mainScheduler->run();
+	//   new SchedTaskList(list, mainScheduler) の方が良さそうだけど...
+	mainScheduler->run(new SchedNop());
     }
 }
 
--- a/TaskManager/Makefile.def	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/Makefile.def	Thu Dec 10 22:55:55 2009 +0900
@@ -29,10 +29,14 @@
 
 ABIBIT = 32
 
-# SIMPLE_TASK=-DSIMPLE_TASK
-SIMPLE_TASK=
+SIMPLE_TASK=-DSIMPLE_TASK
+# SIMPLE_TASK=
 
+<<<<<<< local
+# OPT = -O9 
+=======
 #OPT = -O9 
+>>>>>>> other
 OPT =  -g
 
 CC     = g++   
--- a/TaskManager/kernel/ppe/HTask.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -49,4 +49,32 @@
     this->post_arg2 = arg2;
 }
 
+#ifdef SIMPLE_TASK
+
+Task *
+HTask::create_task_array(int task_id, int 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	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Thu Dec 10 22:55:55 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 {
@@ -41,10 +44,14 @@
     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_array(int task_id, int pos);
+    void spawn_task_array(int pos);
+#endif
 };
 
 typedef HTask* HTaskPtr;
--- a/TaskManager/kernel/ppe/Task.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -1,5 +1,8 @@
 #include "Task.h"
 
+// #include "SchedTask.h"  it includes #define Task
+
+#ifndef SIMPLE_TASK
 /**
  * タスクの入力データを追加する
  *
@@ -11,11 +14,7 @@
 int
 Task::add_inData_t(memaddr addr, int size)
 {
-#ifdef SIMPLE_TASK
-    return 0;
-#else
     return add_data(inData, addr, size);
-#endif
 }
 
 /**
@@ -29,11 +28,7 @@
 int
 Task::add_outData_t(memaddr addr, int size)
 {
-#ifdef SIMPLE_TASK
-    return 0;
-#else
     return add_data(outData, addr, size);
-#endif
 }
 
 /**
@@ -47,24 +42,20 @@
 
 // こちらのAPIは、受け側と出力側での対応を良く見れない。廃止の方向。
 int
-Task::add_param0(memaddr _param)
+Task::add_param_t(memaddr _param)
 {
-#ifndef SIMPLE_TASK
     if (param_size >= MAX_PARAMS) return -1;
     
     this->param[param_size++] = _param;
-#endif
     return 0;
 }
 
 int
-Task::set_param0(int index, memaddr _param)
+Task::set_param_t(int index, memaddr _param)
 {
-#ifndef SIMPLE_TASK
     if (index >= MAX_PARAMS) return -1;
     
     this->param[index] = _param;
-#endif
     return 0;
 }
 
@@ -75,7 +66,6 @@
 int
 Task::add_data(ListData& list, memaddr addr, int size)
 {
-#ifndef SIMPLE_TASK
     if (list.length >= MAX_LIST_DMA_SIZE) return -1;
 
     list.bound[list.length] = list.size;
@@ -90,7 +80,48 @@
     elm->addr = addr;
 #endif
     elm->size = size;
+    return 0;
+}
+
+#else /* ifdef SIMPLE_TASK */
+
+void 
+Task::set_inData_t( int index, memaddr addr, int size)
+{
+    ListElementPtr elm = (ListElementPtr) inData(0);
+#ifdef __CERIUM_CELL__
+    elm->addr = (uint32)(unsigned long)addr;
+#else
+    elm->addr = addr;
+#endif
+    elm->size = size;
+}  
+
+void 
+Task::set_outData_t(int index, memaddr addr, int size)
+{
+    ListElementPtr elm = (ListElementPtr) outData(0);
+#ifdef __CERIUM_CELL__
+    elm->addr = (uint32)(unsigned long)addr;
+#else
+    elm->addr = addr;
+#endif
+    elm->size = size;
+}
+
+void
+Task::print()
+{
+    printf("task id %d task size = %d param size %d "
+       "inData size %d "
+       "outData size %d\n", command, size(), param_size, inData_size, outData_size
+    );
+    for(int i=0; i< param_size && i<5; i++) {
+	printf("param %d = 0x%ld\n", i, (long)param(i));
+    }
+
+}
+
 #endif
 
-    return 0;
-}
+/* end */
--- a/TaskManager/kernel/ppe/Task.h	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Thu Dec 10 22:55:55 2009 +0900
@@ -8,26 +8,25 @@
 
 #define MAX_PARAMS 8
 
+#ifndef SIMPLE_TASK
 class Task : public SimpleTask {
 public: // variables
 
     BASE_NEW_DELETE(Task);
-#ifndef SIMPLE_TASK
     int param_size;        // 4 byte
     memaddr param[MAX_PARAMS]; // 4*MAX_PARAMS byte
     ListData inData  __attribute__ ((aligned (DEFAULT_ALIGNMENT)));  
     ListData outData  __attribute__ ((aligned (DEFAULT_ALIGNMENT))); 
-#endif
 
 public: // functions
     int add_inData_t(memaddr addr, int size);  // unsigned int ではなく 64bit
     int add_outData_t(memaddr addr, int size); // unsigned int ではなく 64bit
     int add_data(ListData &list, memaddr addr, int size);
-    int add_param0(memaddr param);  // obsolete. do not use.
-    int set_param0(int index, memaddr param);
+    int add_param_t(memaddr param);  // obsolete. do not use.
+    int set_param_t(int index, memaddr param);
 
-#define add_param(param) add_param0((memaddr)(param))
-#define set_param(index,param) set_param0(index, (memaddr) (param))
+#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)			\
     add_inData_t((memaddr)(addr), (size));
@@ -35,6 +34,106 @@
     add_outData_t((memaddr)(addr), (size));
 };
 
+#else
+
+class SchedTask;
+
+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];
+    // ListElement outData[outData_size];
+
+public: // functions
+    // int add_inData_t(memaddr addr, int size);  
+    // int add_outData_t(memaddr addr, int size); 
+
+    void print();
+
+    memaddr param(int index) {
+	return (memaddr)data + sizeof(memaddr)*index;
+    }
+    memaddr inData(int index) {
+	memaddr p = (memaddr)data + inData_offset;
+	return p + sizeof(ListElement)*index;
+    }
+    memaddr outData(int index) {
+	memaddr p = (memaddr)data + outData_offset;
+	return p + sizeof(ListElement)* index;
+    }
+
+    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; }
+    void set_param_t(int index, memaddr param) {
+	memaddr *p = (memaddr*)this->param(index);
+	*p = param;
+    }
+
+    static int count_size(int params, int ins, int outs) {
+	int size = round_up16(sizeof(Task))
+	   + round_up16(sizeof(memaddr)*params)
+           + round_up16(sizeof(ListElement)*ins)
+           + round_up16(sizeof(ListElement)*outs);
+	return size;
+    }
+
+    Task * next()
+    {
+	char *p = (char*)t;
+	p += t->size();
+	return (Task*)p;
+    }
+
+
+// #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)			
+//     add_inData_t((memaddr)(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)			\
+    set_outData_t(index, (memaddr)(addr), (size));
+};
+#endif
+
 typedef Task* TaskPtr;
 
 #endif
--- a/TaskManager/kernel/schedule/SchedTask.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Thu Dec 10 22:55:55 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	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Thu Dec 10 22:55:55 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	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.cc	Thu Dec 10 22:55:55 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/schedule/Scheduler.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Thu Dec 10 22:55:55 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);
@@ -59,11 +63,12 @@
 }
 
 void
-Scheduler::run()
+Scheduler::run(SchedTaskBase* task1)
 {
-    task1 = new SchedNop();
-    task2 = new SchedNop();
-    task3 = new SchedNop();
+
+    // Pipeline Stage
+    SchedTaskBase* task2 = new SchedNop();
+    SchedTaskBase* task3 = new SchedNop();
 
     // main loop
     do {
--- a/TaskManager/kernel/schedule/Scheduler.h	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Thu Dec 10 22:55:55 2009 +0900
@@ -72,10 +72,6 @@
     DmaManager* connector;
     TaskManagerImpl* manager;
 
-    // Pipeline Stage
-    SchedTaskBase* task1;
-    SchedTaskBase* task2;
-    SchedTaskBase* task3;
 
     /* functions */
     void init(TaskManagerImpl *m);
--- a/TaskManager/kernel/sys_task/SysTasks.h	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/sys_task/SysTasks.h	Thu Dec 10 22:55:55 2009 +0900
@@ -1,5 +1,6 @@
 StartTask,
 FinishTask,
+TaskArray,
 ShowTime,
 StartProfile,
 #define Dummy StartTask
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/sys_task/TaskArray.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -0,0 +1,34 @@
+#include "Finish.h"
+#include "SysFunc.h"
+#include "Scheduler.h"
+#include "Task.h"
+
+
+SchedDefineTask(TaskArray);
+
+
+static int
+run(SchedTask *s,void *rbuf, void *wbuf)
+{
+#ifdef SIMPLE_TASK
+
+#ifdef TEST_TASK_ARRAY
+    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 = task->next();
+    }
+#else
+
+    Task *task = (Task *)rbuf;
+    SchedTaskArray *nextSched = createSchedTaskArray(s->get_scheduler(), task);
+    s->get_scheduler()->run(nextSched); 
+
+#endif
+#endif
+    return 0;
+}
--- a/TaskManager/kernel/sys_task/systask_register.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/TaskManager/kernel/sys_task/systask_register.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -3,10 +3,12 @@
 
 SchedExternTask(StartTask);
 SchedExternTask(FinishTask);
+SchedExternTask(TaskArray);
 
 void
 systask_register()
 {
     SchedRegister(StartTask);
     SchedRegister(FinishTask);
+    SchedRegister(TaskArray);
 }
--- a/example/Bulk/Makefile.def	Tue Dec 08 19:44:20 2009 +0900
+++ b/example/Bulk/Makefile.def	Thu Dec 10 22:55:55 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	Tue Dec 08 19:44:20 2009 +0900
+++ b/example/Bulk/main.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -2,13 +2,14 @@
 #include <stdlib.h>
 #include <string.h>
 #include "TaskManager.h"
+#include "Task.h"
 #include "Func.h"
 
 extern void task_init(void);
 
 static int length = DATA_NUM;
-static int task = 1;
-static int count = 1;
+static int task = 10;
+static int count = 10;
 
 const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\
   -length  Number of data (default DATA_NUM (Func.h))\n\
@@ -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
@@ -55,7 +58,6 @@
 void
 twice_init(TaskManager *manager)
 {
-    TaskArray *twice;
 
     int *data = (int*)manager->allocate(sizeof(int)*length);
 
@@ -69,38 +71,52 @@
      * Create Task
      *   create_task(Task ID);
      */ 
-    twice = manager->create_bulk_task(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_stask(Twice);
+	Task *t = twice_main->create_task_array(Twice,pos);
 	int length2 = length/2;
+        //  以下の順序でデータを追加する必要がある。
+        //  length を先に指定すればsetは後からでも良い。
 	/**
 	 * Set 32bits parameter
 	 *   add_param(32bit parameter);
 	 */
+	t->set_param_length(2);
 	t->set_param(0, (memaddr)length2);
 	t->set_param(1, (memaddr)length2);
 	/**
 	 * Set of Input Data
 	 *   add_inData(address of input data, size of input data);
 	 */
-	t->add_inData(data, sizeof(int)*length2);
-	t->add_inData(data+length2, sizeof(int)*length2);
+	t->set_inData_length(2);
+	t->set_inData(0,data, sizeof(int)*length2);
+	t->set_inData(1,data+length2, sizeof(int)*length2);
 	/**
-	 * Set of OutPut area
+	 * Set of Output area
 	 *   add_outData(address of output area, size of output area);
 	 */
-	t->add_outData(data, sizeof(int)*length2);
-	t->add_outData(data+length2, sizeof(int)*length2);
+	t->set_outData_length(2);
+	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);
+
     twice_main->set_cpu(SPE_ANY);
-
     /*
      * set_post() で ppe task を渡せるようにしたい
      */
-    twice->set_post(twice_result, (void*)data, 0);
-
+    twice_main->set_post(twice_result, (void*)data, (void*)task_buf);
     // add Active Queue
-    twice->spawn_bulk();    
+    twice_main->spawn();    
 }
 
 int
--- a/example/Bulk/ppe/Twice.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/example/Bulk/ppe/Twice.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -1,5 +1,5 @@
 #include <stdio.h>
-#include "SchedTask.h"
+#include "SchedTaskArray.h"
 #include "Twice.h"
 #include "Func.h"
 
@@ -9,6 +9,8 @@
 static int
 run(SchedTask *s,void *rbuf, void *wbuf)
 {
+    SchedTaskArray *a = (SchedTaskArray *)s;
+
     int *i_data;
     int *o_data;
     long length;
--- a/example/Bulk/ppe/task_init.cc	Tue Dec 08 19:44:20 2009 +0900
+++ b/example/Bulk/ppe/task_init.cc	Thu Dec 10 22:55:55 2009 +0900
@@ -13,5 +13,5 @@
 void
 task_init(void)
 {
-  SchedRegisterTask(TWICE_TASK, Twice);
+  SchedRegister(Twice);
 }