# HG changeset patch # User Shinji KONO # Date 1258596822 -32400 # Node ID 5530fa36d42ea1f5c58f5a989832eaa2b5c969dd # Parent d433fc37587d47fd3b85e5623331ec804f69fff4 not yet worked... diff -r d433fc37587d -r 5530fa36d42e TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Thu Nov 19 11:13:42 2009 +0900 @@ -28,6 +28,7 @@ void CellTaskManagerImpl::init() { + spe_running = 0; taskListImpl = new CellTaskListInfo; taskListImpl->init(machineNum*2); @@ -53,9 +54,12 @@ // PPE 側の管理をする Manager ppeManager = new FifoTaskManagerImpl(machineNum); // 大半のTaskQueueInfoは、共有される - ppeManager->init(new MainScheduler, this); + MainScheduler *mscheduler = new MainScheduler; + set_scheduler((Scheduler*)mscheduler); + ppeManager->init(mscheduler, this); ppeManager->get_scheduler()->set_manager(this); + schedTaskManager = new SchedTask(); schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); } @@ -137,6 +141,8 @@ // PPE 側で動く TaskList です // FifoTaskManagerImpl::run と上手く合うように // こんなことやってますよ + // + // 本来は、別 thread で動かすべきだろう... ppeTaskList = ppeManager->get_runTaskList(); if (!ppeTaskList) { goto cont; @@ -146,11 +152,16 @@ // PPE 側の schedule から抜けて来たときに行う // (speThreads で Blocking Mailbox read と // セマフォとか使ってやってもいいが、今はこの方式で) + // + // すべてのspe task が finish task を待つ場合は、ppeTaskList の + // 判定だけで十分だが、そうでない場合は、spe の task が残っているか + // どうかを調べる必要がある。 + // do { ppeMail = ppeManager->schedule(ppeTaskList); cont: ppeTaskList = mail_check(ppeMail); - } while (ppeTaskList); + } while (ppeTaskList || spe_running >0); } /** @@ -187,6 +198,7 @@ if (data == (memaddr)MY_SPE_STATUS_READY) { //__debug_ppe("[SPE %d] finish\n", id); flag_sendTaskList[id] = 1; + spe_running--; } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { //__debug_ppe("[PPE] MALLOC COMMAND from [SPE %d]\n", id); @@ -235,6 +247,7 @@ for (int i = 0; i < machineNum; i++) { if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) { send_taskList(i); + spe_running++; } } @@ -272,7 +285,7 @@ flag_sendTaskList[id] = 0; } - +#if 0 void* CellTaskManagerImpl::allocate(int size, int alignment) { @@ -301,6 +314,7 @@ { return ppeManager->get_scheduler(); } +#endif #ifdef __CERIUM_CELL__ TaskManagerImpl* diff -r d433fc37587d -r 5530fa36d42e TaskManager/Cell/CellTaskManagerImpl.h --- a/TaskManager/Cell/CellTaskManagerImpl.h Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Thu Nov 19 11:13:42 2009 +0900 @@ -18,6 +18,7 @@ SpeThreads *speThreads; int *flag_sendTaskList; FifoTaskManagerImpl *ppeManager; + int spe_running; /* functions */ // system @@ -29,9 +30,11 @@ // user int add_data(ListDataPtr, uint32, int); +#if 0 void* allocate(int size); void* allocate(int size,int align); Scheduler* get_scheduler(); +#endif private: void send_taskList(int id); diff -r d433fc37587d -r 5530fa36d42e TaskManager/Cell/spe/SpeTaskManagerImpl.cc --- a/TaskManager/Cell/spe/SpeTaskManagerImpl.cc Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.cc Thu Nov 19 11:13:42 2009 +0900 @@ -2,7 +2,21 @@ #include "Scheduler.h" #include +SpeTaskManagerImpl::SpeTaskManagerImpl() {} +SpeTaskManagerImpl::~SpeTaskManagerImpl() {} +void SpeTaskManagerImpl::init() {} +void SpeTaskManagerImpl::run() {} + +HTaskPtr SpeTaskManagerImpl::create_task(int cmd) {return 0;} +HTaskPtr SpeTaskManagerImpl::create_task(int cmd, memaddr rbuf, long rs, memaddr wbuf, long ws) { return 0; } +void SpeTaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave) {} +void SpeTaskManagerImpl::spawn_task(HTaskPtr) {} +void SpeTaskManagerImpl::set_task_cpu(HTaskPtr, CPU_TYPE) {} + +TaskManagerImpl::TaskManagerImpl(int i) {} +void TaskManagerImpl::append_activeTask(HTask* p) {} +void TaskManagerImpl::append_waitTask(HTask* p) {} HTaskPtr TaskManagerImpl::create_task(int cmd) {return 0;} HTaskPtr TaskManagerImpl::create_task(int cmd, memaddr rbuf, long rs, memaddr wbuf, long ws) { return 0; } @@ -10,30 +24,3 @@ void TaskManagerImpl::spawn_task(HTaskPtr) {} void TaskManagerImpl::set_task_cpu(HTaskPtr, CPU_TYPE) {} -void* -TaskManagerImpl::allocate(int size, int alignment) -{ - if (size==0) return 0; -#if defined(__SPU__) - return malloc(size); -#else - void *buff; - posix_memalign(&buff, alignment, size); - return buff; -#endif -} - -void* -TaskManagerImpl::allocate(int size) -{ - if (size==0) return 0; -#if defined(__SPU__) - return malloc(size); -#else - void *buff; - posix_memalign(&buff, DEFAULT_ALIGNMENT, size); - return buff; -#endif -} - - diff -r d433fc37587d -r 5530fa36d42e TaskManager/Cell/spe/SpeTaskManagerImpl.h --- a/TaskManager/Cell/spe/SpeTaskManagerImpl.h Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h Thu Nov 19 11:13:42 2009 +0900 @@ -1,41 +1,28 @@ -#ifndef INCLUDED_TASK_MANAGER_IMPL -#define INCLUDED_TASK_MANAGER_IMPL +#ifndef INCLUDED_SPE_TASK_MANAGER_IMPL +#define INCLUDED_SPE_TASK_MANAGER_IMPL -#include "MailManager.h" -#include "ListData.h" -#include "TaskListInfo.h" -#include "TaskQueueInfo.h" -#include "HTaskInfo.h" -class Scheduler; -class MemList; - - -class TaskManagerImpl { -public: +#include "TaskManagerImpl.h" +#include "MainScheduler.h" +#include "Scheduler.h" - BASE_NEW_DELETE(TaskManagerImpl); - - /* variables */ - SchedTask *schedTaskManager; - Scheduler *scheduler; - +class SpeTaskManagerImpl : public TaskManagerImpl { +public: /* constructor */ - TaskManagerImpl() { } - - ~TaskManagerImpl() { } + SpeTaskManagerImpl() ; + ~SpeTaskManagerImpl(); - // user + /* functions */ + // call by system + void init(); + void run(); HTaskPtr create_task(int cmd); - HTaskPtr create_task(int cmd, memaddr rbuf, long rs, memaddr wbuf, long ws); + HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size); void set_task_depend(HTaskPtr master, HTaskPtr slave); void spawn_task(HTaskPtr); void set_task_cpu(HTaskPtr, CPU_TYPE); - void* allocate(int size); - void* allocate(int size,int align); - void set_scheduler(Scheduler *s) { scheduler = s; }; - Scheduler* get_scheduler() { return scheduler; }; + }; -#endif /* INCLUDED_FIFO_TASK_MANAGER_IMPL */ +#endif /* INCLUDED_SPE_TASK_MANAGER_IMPL */ diff -r d433fc37587d -r 5530fa36d42e TaskManager/Cell/spe/main.cc --- a/TaskManager/Cell/spe/main.cc Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Cell/spe/main.cc Thu Nov 19 11:13:42 2009 +0900 @@ -20,7 +20,7 @@ __debug("code_size:%10d bytes\n", code_size); __debug("heap_size:%10d bytes\n", heap_size); - TaskManagerImpl *tm = new TaskManagerImpl(); + TaskManagerImpl *tm = new SpeTaskManagerImpl(); manager = new CellScheduler(); manager->init(tm); diff -r d433fc37587d -r 5530fa36d42e TaskManager/ChangeLog --- a/TaskManager/ChangeLog Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/ChangeLog Thu Nov 19 11:13:42 2009 +0900 @@ -1,7 +1,27 @@ +2009-11-19 Shinji KONO + +finish_task を全員が待つ設定で、finish_task を終了判定に +使っている。それだと、すべてのtaskが、finish_task のwait queue +を*必ず*触りにいってしまう。 + +finish_task への待ちを取り除くと、CellTaskManagerImpl::run() +が、 + do { + ppeMail = ppeManager->schedule(ppeTaskList); + cont: + ppeTaskList = mail_check(ppeMail); + } while (ppeTaskList); +とかやっているので、ここで抜けてしまう。 + +要するに、SPUの状態を見て、running がなくなるのを調べるべき +なんだが、SpeTheads は「一つしかない」らしい。spe_running +で、走っているものがあるかどうか見るか? + + 2009-11-15 Shinji KONO -List DMAって、32bit address を使っているらしい。それは、ちょっと -ひどいなぁ。 + List DMAって、32bit address を使っているらしい。それは、ちょっと + ひどいなぁ。 2009-11-14 Shinji KONO diff -r d433fc37587d -r 5530fa36d42e TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Thu Nov 19 11:13:42 2009 +0900 @@ -33,6 +33,7 @@ scheduler->init(this); scheduler->set_mailManager(mailManager); scheduler->id = 0; + set_scheduler(scheduler); taskListImpl = new TaskListInfo; taskQueueImpl = new TaskQueueInfo; @@ -61,6 +62,7 @@ scheduler = _sched; scheduler->init(this); scheduler->set_mailManager(mailManager); + set_scheduler(scheduler); taskListImpl = tm-> taskListImpl ; taskQueueImpl = tm-> taskQueueImpl ; @@ -220,6 +222,7 @@ } } +#if 0 void* FifoTaskManagerImpl::allocate(int size, int alignment) { @@ -250,6 +253,7 @@ FifoTaskManagerImpl::get_scheduler() { return scheduler; } +#endif /** * # # # # # # # # diff -r d433fc37587d -r 5530fa36d42e TaskManager/Fifo/FifoTaskManagerImpl.h --- a/TaskManager/Fifo/FifoTaskManagerImpl.h Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Thu Nov 19 11:13:42 2009 +0900 @@ -30,9 +30,11 @@ // call by user int add_data(ListDataPtr, uint32, int); +#if 0 void* allocate(int size,int align); void* allocate(int size); Scheduler* get_scheduler(); +#endif }; diff -r d433fc37587d -r 5530fa36d42e TaskManager/Makefile.cell --- a/TaskManager/Makefile.cell Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Makefile.cell Thu Nov 19 11:13:42 2009 +0900 @@ -35,7 +35,7 @@ EXTRA_CFLAGS = -D__CERIUM_CELL__ -DHAS_POSIX_MEMALIGN -fno-strict-aliasing -SPE_CFLAGS = -DSIMPLE_TASK -D__CERIUM_CELL__ -fno-exceptions -fno-rtti -Wall -O9 +SPE_CFLAGS = -g -DSIMPLE_TASK -D__CERIUM_CELL__ -fno-exceptions -fno-rtti -Wall # -O9 all: default diff -r d433fc37587d -r 5530fa36d42e TaskManager/kernel/ppe/TaskManagerImpl.h --- a/TaskManager/kernel/ppe/TaskManagerImpl.h Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Thu Nov 19 11:13:42 2009 +0900 @@ -23,6 +23,7 @@ HTaskInfo *htaskImpl; SchedTask *schedTaskManager; + Scheduler *scheduler; /* constructor */ TaskManagerImpl(int num = 1) ; @@ -42,15 +43,38 @@ void systask_init(); // user - HTaskPtr create_task(int cmd); - HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size); - void set_task_depend(HTaskPtr master, HTaskPtr slave); - void spawn_task(HTaskPtr); - void set_task_cpu(HTaskPtr, CPU_TYPE); + virtual HTaskPtr create_task(int cmd); + virtual HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size); + virtual void set_task_depend(HTaskPtr master, HTaskPtr slave); + virtual void spawn_task(HTaskPtr); + virtual void set_task_cpu(HTaskPtr, CPU_TYPE); - virtual void* allocate(int size) = 0; - virtual void* allocate(int size,int align) = 0; - virtual Scheduler* get_scheduler() = 0; + void* allocate(int size, int alignment) + { + if (size==0) return 0; + #if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN) + return malloc(size); + #else + void *buff; + posix_memalign(&buff, alignment, size); + return buff; + #endif + } + + void* allocate(int size) + { + if (size==0) return 0; + #if defined(__SPU__) || ! defined(HAS_POSIX_MEMALIGN) + return malloc(size); + #else + void *buff; + posix_memalign(&buff, DEFAULT_ALIGNMENT, size); + return buff; + #endif + } + + Scheduler* get_scheduler() { return scheduler; } + void set_scheduler(Scheduler *s) { scheduler = s; } }; #endif diff -r d433fc37587d -r 5530fa36d42e TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Thu Nov 19 11:13:42 2009 +0900 @@ -127,7 +127,7 @@ // 書き込む領域がなければ無視 #ifdef SIMPLE_TASK if (task->w_size > 0) { - scheduler->dma_store(writebuf, task->wbuf,task->w_size, DMA_READ); + scheduler->dma_store(writebuf, task->wbuf,task->w_size, DMA_WRITE); } #else if (outListData->length > 0) {