# HG changeset patch # User Shinji KONO # Date 1258532954 -32400 # Node ID 0558abba673cb0c278e52a961b0fcbcac82d89b6 # Parent 328ab8ac468db6804a8b86c2a319093c6e67dff2 SimpleTask start diff -r 328ab8ac468d -r 0558abba673c TaskManager/Fifo/FifoTaskManagerImpl.cc --- 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) { diff -r 328ab8ac468d -r 0558abba673c TaskManager/Makefile.cell --- 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 diff -r 328ab8ac468d -r 0558abba673c TaskManager/Makefile.def --- 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 diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/HTask.h --- 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); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/HTaskInfo.cc --- 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) { diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/HTaskInfo.h --- 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); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/SimpleTask.h --- 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; } }; diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/Task.h --- 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))); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/TaskList.cc --- 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; - } -} - */ diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/TaskList.h --- 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; diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/TaskManager.cc --- 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 終了時に実行される関数の設定 */ diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/TaskManager.h --- 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)); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/TaskManagerImpl.cc --- 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 diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/ppe/TaskManagerImpl.h --- 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); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/schedule/SchedTask.cc --- 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); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/schedule/SchedTask.h --- 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 diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/schedule/Scheduler.cc --- 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) ; } diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/schedule/Scheduler.h --- 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) ; diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/sys_task/Finish.cc --- 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) diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/sys_task/Start.cc --- 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) diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/sys_task/SysFunc.h --- /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" +}; diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/sys_task/SysTask.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(); diff -r 328ab8ac468d -r 0558abba673c TaskManager/kernel/sys_task/systask_register.cc --- 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); } diff -r 328ab8ac468d -r 0558abba673c example/Simple/ChangeLog --- /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 + + * memo + Fifo СǤϳǧޤ + Cell СϡCerium ޤ̤ʤΤǤ줫 + diff -r 328ab8ac468d -r 0558abba673c example/Simple/Func.h --- /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, +}; diff -r 328ab8ac468d -r 0558abba673c example/Simple/Makefile --- /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 diff -r 328ab8ac468d -r 0558abba673c example/Simple/Makefile.cell --- /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 diff -r 328ab8ac468d -r 0558abba673c example/Simple/Makefile.def --- /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 diff -r 328ab8ac468d -r 0558abba673c example/Simple/Makefile.linux --- /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/\#* diff -r 328ab8ac468d -r 0558abba673c example/Simple/Makefile.macosx --- /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/\#* diff -r 328ab8ac468d -r 0558abba673c example/Simple/README --- /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žˤǡμϤ + +ȤФ狼Ȼפޤ diff -r 328ab8ac468d -r 0558abba673c example/Simple/main.cc --- /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 +#include +#include +#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 */ diff -r 328ab8ac468d -r 0558abba673c example/Simple/ppe/Twice.cc --- /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 +#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; +} diff -r 328ab8ac468d -r 0558abba673c example/Simple/ppe/Twice.h diff -r 328ab8ac468d -r 0558abba673c example/Simple/ppe/task_init.cc --- /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); +} diff -r 328ab8ac468d -r 0558abba673c example/Simple/spe/Makefile --- /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 *~ \#* diff -r 328ab8ac468d -r 0558abba673c example/Simple/spe/Twice.cc --- /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 +#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; +} diff -r 328ab8ac468d -r 0558abba673c example/Simple/spe/Twice.h diff -r 328ab8ac468d -r 0558abba673c example/Simple/spe/spe-main.cc --- /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); +}