changeset 634:0558abba673c

SimpleTask start
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 18 Nov 2009 17:29:14 +0900
parents 328ab8ac468d
children 8cc609285bbe
files TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Makefile.cell TaskManager/Makefile.def TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/HTaskInfo.cc TaskManager/kernel/ppe/HTaskInfo.h TaskManager/kernel/ppe/SimpleTask.h TaskManager/kernel/ppe/Task.h TaskManager/kernel/ppe/TaskList.cc TaskManager/kernel/ppe/TaskList.h TaskManager/kernel/ppe/TaskManager.cc TaskManager/kernel/ppe/TaskManager.h TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/Scheduler.cc TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/Finish.cc TaskManager/kernel/sys_task/Start.cc TaskManager/kernel/sys_task/SysFunc.h TaskManager/kernel/sys_task/SysTask.h TaskManager/kernel/sys_task/systask_register.cc example/Simple/ChangeLog example/Simple/Func.h example/Simple/Makefile example/Simple/Makefile.cell example/Simple/Makefile.def example/Simple/Makefile.linux example/Simple/Makefile.macosx example/Simple/README example/Simple/main.cc example/Simple/ppe/Twice.cc example/Simple/ppe/Twice.h example/Simple/ppe/task_init.cc example/Simple/spe/Makefile example/Simple/spe/Twice.cc example/Simple/spe/Twice.h example/Simple/spe/spe-main.cc
diffstat 37 files changed, 602 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -85,7 +85,11 @@
 FifoTaskManagerImpl::get_runTaskList()
 {
     TaskListPtr list, list_top;
+#ifdef SIMPLE_TASK
     TaskPtr task; // Task (SPE に送る Task)
+#else
+    SimpleTaskPtr task; // Task (SPE に送る Task)
+#endif
 
     if (activeTaskQueue->empty()) {
         return NULL;
@@ -101,18 +105,16 @@
     // printf("active task queue length = %d\n",activeTaskQueue->length());
     while (HTaskPtr htask = activeTaskQueue->poll()) {
         task = &list->tasks[list->length++];
-	// inData, outData を内蔵にしたので実は、結構でかくない?
-	// 268 byte 程度だが... 不要な分(設定してない inData, outData, param 
-        // とかもコピーしてるね。rbuf/wbuf の意味を変えてしまったわけか。
+#ifdef SIMPLE_TASK
+	*task = *(SimpleTask*)htask;
+#else
         memcpy(task, (Task*)htask, sizeof(Task));
-
-
+#endif
         if (list->length >= TASK_MAX_SIZE) {
             TaskListPtr newList = taskListImpl->create();
             list_top = TaskListInfo::append(list_top, newList);
             list = newList;
         }
-
         // activeTaskQueue->free_(htask); ここで free しないで、
         // mail を待つ
     }
@@ -201,15 +203,6 @@
     while (q) {
         data = q->data;
 
-        /**
-         * MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
-         * MY_SPE_NOP: 特に意味のないコマンド
-         * それ以外:終了したタスク(PPEにあるのでアドレス
-         *
-         * MY_SPE_NOP が 0 なので、
-         * 下のように data > MY_SPE_NOP とかしています。
-         * 一目でよくわからない書き方なんで、直したいところですが。。。
-         */
         if (data == (memaddr)MY_SPE_STATUS_READY) {
             __debug_ppe("mail_check(): Task List finish\n");
         } else if (data != (memaddr)MY_SPE_NOP) {
--- a/TaskManager/Makefile.cell	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/Makefile.cell	Wed Nov 18 17:29:14 2009 +0900
@@ -1,6 +1,5 @@
 include ./Makefile.def
 
-ABIBIT= 32
 ABI= -m$(ABIBIT)
 TARGET    = libCellManager.a
 SPETARGET = libspemanager.a
--- a/TaskManager/Makefile.def	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/Makefile.def	Wed Nov 18 17:29:14 2009 +0900
@@ -27,10 +27,10 @@
 IMPL_CELL_SRCS = $(IMPL_FIFO_SRCS) $(wildcard $(IMPL_CELL_DIR)/*.cc)
 IMPL_CELL_OBJS = $(IMPL_CELL_SRCS:.cc=.o)
 
-ABI = 
+ABIBIT = 32
 
 CC     = g++   
-CFLAGS = -Wall `sdl-config --cflags` -g $(ABI)  # -O9 
-LIBS   = 
+CFLAGS = -DSIMPLE_TASK -Wall `sdl-config --cflags` -g -m$(ABIBIT)  # -O9 
+LIBS   =  -m$(ABIBIT)
 
 INCLUDE = -I../include/TaskManager
--- a/TaskManager/kernel/ppe/HTask.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Wed Nov 18 17:29:14 2009 +0900
@@ -21,8 +21,11 @@
   特定の Task を待ち合わせる事が可能。
   Task の入出力は dma などで copy される。
  */
-
+#ifdef SIPMLE_TASK
 class HTask : public Task {
+#else
+class HTask : public SimpleTask {
+#endif
 public:
     BASE_NEW_DELETE(HTask);
 
--- a/TaskManager/kernel/ppe/HTaskInfo.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -64,10 +64,12 @@
     q->waiter = NULL;
 
     q->command  = cmd;
+#ifndef SIMPLE_TASK
     q->inData.clear();
     q->outData.clear();
+    q->param_size = 0;
+#endif
     q->self = (memaddr) q;
-    q->param_size = 0;
 
     q->post_func = NULL;
     q->mimpl     = NULL;
@@ -79,6 +81,16 @@
     return q;
 }
 
+HTaskPtr 
+HTaskInfo::create(int cmd, void *rbuf, int rs, void *wbuf, int ws)
+{
+    HTaskPtr task = create(cmd);
+    task->set_input((memaddr)rbuf, rs);
+    task->set_output((memaddr)wbuf, ws);
+    return task;
+}
+
+
 void
 HTaskInfo::free_(HTaskPtr q)
 {
--- a/TaskManager/kernel/ppe/HTaskInfo.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.h	Wed Nov 18 17:29:14 2009 +0900
@@ -14,6 +14,7 @@
 
     /* functions */
     HTaskPtr create(int cmd);
+    HTaskPtr create(int cmd, void *rbuf, int rs, void *wbuf, int ws);
 
     void free_(HTaskPtr queue);
 
--- a/TaskManager/kernel/ppe/SimpleTask.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/SimpleTask.h	Wed Nov 18 17:29:14 2009 +0900
@@ -13,19 +13,24 @@
     int command;         // 4 byte
     memaddr self;         // 4 byte (or 8byte on 64bit mode)
 
-    int param_size;        // 4 byte
-    memaddr param[MAX_PARAMS]; // 4*MAX_PARAMS byte
+#ifdef SIMPLE_TASK
+    memaddr rbuf;
+    memaddr wbuf;
+    int  r_size;
+    int  w_size;
+#endif
+
 
 public: // functions
     SimpleTask() {};
 
-    SimpleTask(int r, void *read, int w, void *write) {
-        param[0] = (memaddr)r; param[2] = (memaddr)w;
-        param[1] = (memaddr)read; param[3] = (memaddr)write;
+    SimpleTask(int r, memaddr read, int w, memaddr write) {
+	r_size = r; rbuf = read;
+	w_size = w; wbuf = write;
     };
 
-    void set_input(void *i,int size) { param[0] = (memaddr)i; param[1] = (memaddr) size; };
-    void set_output(void *o,int size) { param[2] = (memaddr)o; param[3] = (memaddr) size; };
+    void set_input(memaddr i,int size) { r_size = size; rbuf= i; }
+    void set_output(memaddr o,int size) { w_size = size; wbuf= o; } 
 
 };
 
--- a/TaskManager/kernel/ppe/Task.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Wed Nov 18 17:29:14 2009 +0900
@@ -12,6 +12,8 @@
 public: // variables
 
     BASE_NEW_DELETE(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))); 
--- a/TaskManager/kernel/ppe/TaskList.cc	Wed Nov 18 14:47:23 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#include "TaskList.h"
-/*
-TaskListPtr
-TaskList::append(TaskListPtr list, TaskListPtr q)
-{
-    TaskListPtr p = list;
-
-    if (!p) {
-	return q;
-    } else {
-	while (p->next) p = p->next;
-	p->next = q;
-	return list;
-    }
-}
- */
--- a/TaskManager/kernel/ppe/TaskList.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskList.h	Wed Nov 18 17:29:14 2009 +0900
@@ -5,7 +5,6 @@
 #include "Task.h"
 
 
-// sizeof(Task)*TASK_MAX_SIZE = 512 byte
 #define TASK_MAX_SIZE 16
 
 class TaskList { // 528byte
@@ -14,12 +13,14 @@
 
     int length; // 4 byte
     TaskList *next; // 4 byte
+#ifdef SIMPLE_TASK
+    SimpleTask tasks[TASK_MAX_SIZE]; // 512
+#else
     Task tasks[TASK_MAX_SIZE]; // 512
+#endif
     TaskList *output; // 4 byte
     int a[1]; // padding
-/*
-    static TaskList* append(TaskList*, TaskList*);
- */
+
 };
 
 typedef TaskList* TaskListPtr;
--- a/TaskManager/kernel/ppe/TaskManager.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -53,6 +53,13 @@
     return m_impl->create_task(cmd);
 }
 
+HTaskPtr 
+TaskManager::create_task(int cmd, memaddr r, long rs, memaddr w, long ws)
+{
+    return m_impl->create_task(cmd,r,rs,w,ws);
+}
+
+
 /**
  * TaskManaer 終了時に実行される関数の設定
  */
--- a/TaskManager/kernel/ppe/TaskManager.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.h	Wed Nov 18 17:29:14 2009 +0900
@@ -20,6 +20,7 @@
 
     /* user function */
     HTaskPtr create_task(int cmd);
+    HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws);
     void run();
     void *allocate(int size);
     void set_TMend(void (*endf)(TaskManager *manager));
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -3,9 +3,9 @@
 #include "types.h"
 #include "error.h"
 #include "SchedTask.h"
-#include "../sys_task/SysTask.h"
-
 #include "Scheduler.h"
+#include "SysTask.h"
+#include "SysFunc.h"
 
 static HTaskPtr systask_start;
 static HTaskPtr systask_finish;
@@ -25,24 +25,34 @@
 
 /**
  * 一番最初に PPE で実行される systask_start
- * 一番最後に、全てのタスクの終了を待つ systask_finish
- * 番兵的な意味で実装
  */
 void
 TaskManagerImpl::systask_init()
 {
     systask_register();
 
-    systask_start = create_task(SYSTASK_START);
-    systask_finish = create_task(SYSTASK_FINISH);
+    systask_start = create_task(StartTask);
+    systask_finish = create_task(FinishTask);
 
     systask_start->spawn();
 
-    // systask_finish で spawn すると
-    //   systask_finish->wait_for(systask_finish);
-    // とかなって無限ループになるので、
-    // これだけは明示的に append_waitTask() で
-    append_waitTask(systask_finish);
+    // すべての Task が FinishTask を wait_for すると、
+    // あらゆる Task が FinishTask の waiting task queue を操作する
+    // ことになる。それは、重すぎる。PPE/SPE Task が終了した時点で、
+    // TaskManager が実行する方が安い。
+    // append_waitTask(systask_finish);
+}
+
+HTaskPtr
+TaskManagerImpl::create_task(int cmd,void *rbuf, long r_size, void *wbuf, long w_size)
+{
+    HTaskPtr new_task;
+
+    new_task = htaskImpl->create(cmd, rbuf, r_size, wbuf, w_size);
+    new_task->post_func = noaction;
+    new_task->mimpl = this;
+
+    return new_task;
 }
 
 HTaskPtr
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.h	Wed Nov 18 17:29:14 2009 +0900
@@ -43,6 +43,7 @@
 
     // user
     HTaskPtr create_task(int cmd);
+    HTaskPtr create_task(int cmd, void *rbuf, long r_size, void *rbuf, long w_size);
     void set_task_depend(HTaskPtr master, HTaskPtr slave);
     void spawn_task(HTaskPtr);
     void set_task_cpu(HTaskPtr, CPU_TYPE);
--- a/TaskManager/kernel/schedule/SchedTask.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -27,7 +27,7 @@
    最初の一回は SchedTaskList:: next から呼ばれる。
    この段階では、SchedTask object は、まだ作られてない。
  */
-void
+static void
 loadSchedTask(Scheduler *scheduler,TaskPtr task)
 {
 // fprintf(stderr,"loadSchedTask %d\n",task->command);
@@ -39,8 +39,10 @@
 {
     list        = NULL;
     task        = NULL;
+#ifndef SIMPLE_TASK
     inListData  = NULL;
     outListData = NULL;
+#endif
     readbuf     = NULL;
     writebuf    = NULL;
     scheduler   = NULL;
@@ -67,8 +69,10 @@
 {
     list        = _list;
     task        = _task;
+#ifndef SIMPLE_TASK
     inListData  = &_task->inData;
     outListData = &_task->outData;
+#endif
     scheduler   = sc;
     cur_index   = index;
 
@@ -88,7 +92,14 @@
 	// load next task
 	loadSchedTask(scheduler, &list->tasks[cur_index]);
     }
-
+#ifdef SIMPLE_TASK
+    writebuf = scheduler->allocate(task->w_size);
+    // 読むデータが一つもなければ無視
+    if (task->r_size == 0) return;
+    // load Input Data
+    readbuf = scheduler->allocate(task->r_size);
+    scheduler->dma_load(readbuf, task->rbuf,task->r_size, DMA_READ);
+#else
     writebuf = scheduler->allocate(outListData->size);
 
     // 読むデータが一つもなければ無視
@@ -97,6 +108,7 @@
     // load Input Data
     readbuf = scheduler->allocate(inListData->size);
     scheduler->dma_loadList(inListData, readbuf, DMA_READ);
+#endif
 
 
 }
@@ -113,9 +125,15 @@
     free(readbuf);
 
     // 書き込む領域がなければ無視
+#ifdef SIMPLE_TASK
     if (outListData->length > 0) {
         scheduler->dma_storeList(outListData, writebuf, DMA_WRITE);
     }
+#else
+    if (task->w_size > 0) {
+	scheduler->dma_store(writebuf, task->wbuf,task->w_size, DMA_READ);
+    }
+#endif
 }
 
 void
@@ -151,8 +169,7 @@
             return new SchedNop2Ready(scheduler);
         } else {
 	    // 新しいリストに取り掛かる
-            return createSchedTaskList(nextList, scheduler,
-                                       0);
+            return createSchedTaskList(nextList, scheduler, 0);
         }
     }
 }
@@ -238,7 +255,11 @@
 memaddr
 SchedTask::get_param(int index)
 {
+#ifdef SIMPLE_TASK
+    return param[index];
+#else
     return task->param[index];
+#endif
 }
 
 
@@ -316,11 +337,19 @@
 }
 
 
-HTaskPtr SchedTask::create_task(int cmd)
+HTaskPtr
+SchedTask::create_task(int cmd)
 {
     return scheduler->create_task(cmd);
 }
 
+HTaskPtr 
+SchedTask::create_task(int cmd, memaddr r, long rs, memaddr w, long ws)
+{
+    return scheduler->create_task(cmd,r,rs,w,ws);
+}
+
+
 void SchedTask::set_task_depend(HTaskPtr master, HTaskPtr slave)
 {
     scheduler->set_task_depend(master, slave);
--- a/TaskManager/kernel/schedule/SchedTask.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Wed Nov 18 17:29:14 2009 +0900
@@ -10,6 +10,11 @@
 #include "HTask.h"
 #include "MemList.h"
 
+#ifdef SIMPLE_TASK
+#define Task SimpleTask
+#define TaskPtr SimpleTaskPtr
+#endif
+
 class SchedTask : public SchedTaskBase {
 public:
     /* constructor */
@@ -31,6 +36,9 @@
     // read/write 用の ListData
     ListDataPtr inListData;
     ListDataPtr outListData;
+#ifdef SIMPLE_TASK
+    memaddr *param;
+#endif
 
     /**
      * read データ、write 用のバッファ
@@ -66,6 +74,11 @@
 		    Scheduler* sc);
 
     //---  User API ---
+#ifdef SIMPLE_TASK
+    int read_size() { return task->r_size; }
+    int write_size() { return task->w_size; }
+    void set_write_size(int w) { task->w_size = w; }
+#endif
     int get_cpuid();
 
     void* get_input(void *buff, int index);
@@ -121,6 +134,8 @@
 
     // user
     HTaskPtr create_task(int cmd);
+    HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws);
+
     void set_task_depend(HTaskPtr master, HTaskPtr slave);
     void spawn_task(HTaskPtr);
     void set_task_cpu(HTaskPtr, CPU_TYPE);
@@ -137,11 +152,8 @@
 
 };
 
-const int SCHED_TASK_NORMAL = 0;
-const int SCHED_TASK_RENEW  = 1;
 
 extern SchedTask* createSchedTask(Scheduler *,TaskPtr);
-extern void loadSchedTask(Scheduler *scheduler,TaskPtr task);
 
 
 #endif
--- a/TaskManager/kernel/schedule/Scheduler.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -394,6 +394,10 @@
 }
 
 HTask * Scheduler::create_task(int cmd) { return manager->create_task(cmd); }
+HTaskPtr Scheduler::create_task(int cmd, memaddr r, long rs, memaddr w, long ws) {
+    return manager->create_task(cmd,r,rs,w,ws);
+}
+
 void Scheduler::set_task_depend(HTask * master, HTask * slave) { 
     manager->set_task_depend(master, slave) ;
 }
--- a/TaskManager/kernel/schedule/Scheduler.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Wed Nov 18 17:29:14 2009 +0900
@@ -131,6 +131,8 @@
 
     // user
     HTask * create_task(int cmd);
+    HTask * create_task(int cmd, memaddr r, long rs, memaddr w, long ws);
+
     void set_task_depend(HTask * master, HTask * slave) ;
     void spawn_task(HTask * t) ;
     void set_task_cpu(HTask * t, CPU_TYPE cpu) ;
--- a/TaskManager/kernel/sys_task/Finish.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/sys_task/Finish.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -1,7 +1,9 @@
 #include "Finish.h"
-#include "SysTask.h"
+#include "SysFunc.h"
+#include "Scheduler.h"
 
-SchedDefineTask(Finish);
+
+SchedDefineTask(FinishTask);
 
 static int
 run(SchedTask *s,void *rbuf, void *wbuf)
--- a/TaskManager/kernel/sys_task/Start.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/sys_task/Start.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -1,7 +1,8 @@
 #include "Start.h"
-#include "SysTask.h"
+#include "SysFunc.h"
+#include "Scheduler.h"
 
-SchedDefineTask(Start);
+SchedDefineTask(StartTask);
 
 static int
 run(SchedTask *s,void *rbuf, void *wbuf)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/sys_task/SysFunc.h	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,3 @@
+enum systask {
+#include "SysTasks.h"
+};
--- a/TaskManager/kernel/sys_task/SysTask.h	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/sys_task/SysTask.h	Wed Nov 18 17:29:14 2009 +0900
@@ -1,8 +1,1 @@
-#include "Scheduler.h"
-
-enum SysTask_ID{
-    SYSTASK_START = MAX_USER_TASK,
-    SYSTASK_FINISH,
-};
-
 extern void systask_register();
--- a/TaskManager/kernel/sys_task/systask_register.cc	Wed Nov 18 14:47:23 2009 +0900
+++ b/TaskManager/kernel/sys_task/systask_register.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -1,11 +1,12 @@
-#include "SysTask.h"
+#include "SysFunc.h"
+#include "Scheduler.h"
 
-SchedExternTask(Start);
-SchedExternTask(Finish);
+SchedExternTask(StartTask);
+SchedExternTask(FinishTask);
 
 void
-systask_register(void)
+systask_register()
 {
-    SchedRegisterTask(SYSTASK_START, Start);
-    SchedRegisterTask(SYSTASK_FINISH, Finish);
+    SchedRegister(StartTask);
+    SchedRegister(FinishTask);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/ChangeLog	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,6 @@
+2008-05-27  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* memo
+	Fifo СǤϳǧޤ
+	Cell СϡCerium ޤ̤ʤΤǤ줫
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/Func.h	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,4 @@
+enum {
+#include "SysTasks.h"
+    Twice,
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/Makefile	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,20 @@
+default: macosx
+
+macosx: FORCE
+	@echo "Make for Mac OS X"
+	@$(MAKE) -f Makefile.macosx
+
+linux: FORCE
+	@echo "Make for Linux"
+	@$(MAKE) -f Makefile.linux
+
+cell: FORCE
+	@echo "Make for PS3 (Cell)"
+	@$(MAKE) -f Makefile.cell
+
+FORCE:
+
+clean:
+	@$(MAKE) -f Makefile.macosx clean
+	@$(MAKE) -f Makefile.linux clean
+	@$(MAKE) -f Makefile.cell clean
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/Makefile.cell	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,42 @@
+include ./Makefile.def
+
+ABIBIT = 32
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE =  # ե
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE = 
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+CFLAGS += -m$(ABIBIT)
+LIBS += -lCellManager -lspe2 -lpthread -Wl,--gc-sections 
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET) speobject
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+speobject:
+	cd spe; $(MAKE) ABIBIT=$(ABIBIT)
+
+link:
+	$(CC) -m$(ABIBIT) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo ppu-gdb ./$(TARGET) 
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	cd spe; $(MAKE) clean
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/Makefile.def	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,12 @@
+TARGET = twice
+
+# include/library path
+
+# ex  linux/ps3
+CERIUM = ../../../Cerium
+
+CC      = g++
+CFLAGS  = -g -Wall -O9 -DSIMPLE_TASK
+
+INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
+LIBS = -L${CERIUM}/TaskManager
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/Makefile.linux	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,36 @@
+include ./Makefile.def
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE =  # ե
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE = 
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+LIBS += -lFifoManager
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+link:
+	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo gdb ./$(TARGET) 
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	rm -f spe/*~ spe/\#*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/Makefile.macosx	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,37 @@
+include ./Makefile.def
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE =  # ե
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE = 
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+LIBS += -lFifoManager `sdl-config --libs`
+CC += -m32
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+link:
+	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo gdb ./$(TARGET) 
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	rm -f spe/*~ spe/\#*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/README	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,87 @@
+/*
+ * $Id: README,v 1.5 2008/10/20 10:02:01 gongo Exp $
+ */
+
+- 
+
+int ꡢ(Twice) ǡǤ2ܤˤ֤ޤ
+
+PPE->SPE  DMA ž main.cc  twice_init 
+񤤤ƤΤǤ狼äƤ館뤫ʤȿơ¦
+Υǡμ롣
+
+-------------------------------------
+PPE Ƥǡμ
+-------------------------------------
+
+void *get_input(void *p, int index) Ȥ
+
+p ˤ rbuf ޤΤȤʤΤǤ虜虜񤫤ɬפ̵
+index ϡcreate task  add_inData Ȼפɡν֤ˤʤޤ
+
+add_inData(data1, size1);
+add_inData(data2, size2);
+
+ν֤ǵҤ硢
+
+data1 = get_input(rbuf, 0);
+data2 = get_input(rbuf, 0);
+
+Ǽޤ
+
+-------------------------------------
+PPE إǡ
+-------------------------------------
+
+void *get_output(void *p, int index) Ȥ
+
+p  wbuf, index  input ƱǤǤ
+get_output Ǽäΰǥǡ񤱤С
+Υλˡadd_outData ǻꤷɥ쥹˽񤭹ޤޤ
+
+
+- ¹ˡ
+
+./twice [-cpu spe_num] [-length data_length]
+
+  -cpu     Ѥ SPU ο
+           // Ϥޤ̵̣ץǤ
+           // ξ硢ʣ˿ʬƤ줾 2 ܤäƤ
+           // а̣ΤΤˤʤޤï(ry
+
+  -length  Ǥο
+
+
+- ¹
+
+% ./twice
+before ---
+ 0  1  2  3  4  5  6  7  8  9 10 11 
+after ---
+ 0  2  4  6  8 10 12 14 16 18 20 22 
+
+% ./twice -length 20
+before ---
+ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
+after ---
+ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38
+
+% ./twice -length 15
+before ---
+ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 
+zsh: bus error  ./twice -length 15
+
+ξ硢PS3(SPEȤä)Ǥ bus error Фޤ
+ͳ length ˤäơǡΥХȿ
+4Х(int) x 15 = 60 Х Ǥ
+PPE <-> SPE Ǥ DMA žΥ
+1,2,4,8Х, ⤷ 16ХܿȷޤäƤޤ
+Υ˸꤬硢Τ褦 bus error Фޤ
+դξܤͤϡ
+
+Game_project/ps3/docs ˤ PDF 
+
+Fixstars Υ
+http://cell.fixstars.com/ps3linux/index.php/3.3DMAžˤǡμϤ
+
+ȤФ狼Ȼפޤ
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/main.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,101 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "TaskManager.h"
+#include "Func.h"
+
+#define DATA_NUM 12
+
+extern void task_init();
+
+static int task = 1;
+
+const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\
+  -length  Number of data (default DATA_NUM (Func.h))\n\
+  -count   Number of task (default 1)\n";
+
+
+void
+print_data(int *data, int size, const char *title)
+{
+    printf("%s ---\n", title);
+    for (int i = 0; i < size; i++) {
+	printf("%2d ", data[i]);
+    }
+    printf("\n");
+}
+
+/**
+ * タスク終了後の data1, data2 の確認
+ */
+void
+twice_result(SchedTask *s, void *a, void *b)
+{
+    int* data = (int*)a;
+    int length = (long)b;
+    print_data(data, length, "after");
+    free(data);
+}
+
+int length = DATA_NUM;
+
+int
+init(int argc, char **argv)
+{
+    for (int i = 1; argv[i]; ++i) {
+        if (strcmp(argv[i], "-length") == 0) {
+            length = atoi(argv[++i]);
+        } else if (strcmp(argv[i], "-count") == 0) {
+            task = atoi(argv[++i]);
+        }
+    }
+
+    return 0;
+}
+
+void
+twice_init(TaskManager *manager)
+{
+    HTask *twice;
+
+    int *data = (int*)manager->allocate(sizeof(int)*length);
+    int *out  = (int*)manager->allocate(sizeof(int)*length);
+
+    for (int i = 0; i < length; i++) {
+	data[i] = i;
+    }
+
+    print_data(data, length, "before");
+
+    /**
+     * Create Task
+     *   create_task(Task ID);
+     */ 
+    twice = manager->create_task(Twice,(memaddr)data,sizeof(int)*length, (memaddr)out, sizeof(int)*length);
+    twice->set_cpu(SPE_ANY);
+    
+    twice->set_post(twice_result, (void*)out, (void*)length);
+
+    // add Active Queue
+    twice->spawn();    
+}
+
+int
+TMmain(TaskManager *manager,int argc, char *argv[])
+{
+    if (init(argc, argv) < 0) {
+	return -1;
+    }
+
+    // Task Register
+    //   ppe/task_init.cc
+    task_init();
+
+    for (int i = 0; i < task; ++i) {
+	twice_init(manager);
+    }
+
+    return 0;
+}
+
+/* end */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/ppe/Twice.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include "SchedTask.h"
+#include "Twice.h"
+#include "Func.h"
+
+/* これは必須 */
+SchedDefineTask(Twice);
+
+static int
+run(SchedTask *s,void *rbuf, void *wbuf)
+{
+    int *i_data;
+    int *o_data;
+    long length;
+
+    i_data = (int*)rbuf;
+    o_data = (int*)wbuf;
+    length = s->read_size();
+    
+    for (int i = 0; i < length; i++) {
+	o_data[i] = i_data[i] * 2;
+    }
+    
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/ppe/task_init.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,17 @@
+#include "Func.h"
+#include "Scheduler.h"
+
+/* 必ずこの位置に書いて */
+SchedExternTask(Twice);
+
+/**
+ * この関数は ../spe/spe-main と違って
+ * 自分で呼び出せばいい関数なので
+ * 好きな関数名でおk (SchedRegisterTask は必須)
+ */
+
+void
+task_init(void)
+{
+  SchedRegister(Twice);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/spe/Makefile	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,26 @@
+include ../Makefile.def
+
+TARGET = ../spe-main
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+CC      = spu-g++ -DABIBIT=$(ABIBIT)
+CFLAGS  = -g -Wall -fno-exceptions -fno-rtti #-DDEBUG
+INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I..
+LIBS = -L../${CERIUM}/TaskManager -lspemanager
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+clean:
+	rm -f $(TARGET) $(OBJS)
+	rm -f *~ \#*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/spe/Twice.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include "SchedTask.h"
+#include "Twice.h"
+#include "Func.h"
+
+/* これは必須 */
+SchedDefineTask(Twice);
+
+static int
+run(SchedTask *s, void *rbuf, void *wbuf)
+{
+    int *i_data;
+    int *o_data;
+    int length;
+
+    i_data = (int*)rbuf;
+    o_data = (int*)wbuf;
+    length = s->read_size();
+    
+    for (int i = 0; i < length; i++) {
+	o_data[i] = i_data[i] * 2;
+    }
+    
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/Simple/spe/spe-main.cc	Wed Nov 18 17:29:14 2009 +0900
@@ -0,0 +1,14 @@
+#include "Func.h"
+#include "SchedTask.h"
+
+SchedExternTask(Twice);
+
+/**
+ * この関数は SpeScheduler から呼ばれるので
+ * 必ずこの関数名でお願いします。
+ */
+void
+task_init(Scheduler *s)
+{
+    SchedRegisterTask(Twice);
+}