changeset 637:5530fa36d42e

not yet worked...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 19 Nov 2009 11:13:42 +0900
parents d433fc37587d
children 671fca057ad3
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h TaskManager/Cell/spe/main.cc TaskManager/ChangeLog TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/SchedTask.cc
diffstat 11 files changed, 113 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- 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*
--- 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);
--- 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 <stdlib.h>
 
+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
-}
-
-
--- 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 */
--- 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);
--- 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 <kono@ie.u-ryukyu.ac.jp>
+
+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 <kono@ie.u-ryukyu.ac.jp>
 
-List DMAって、32bit address を使っているらしい。それは、ちょっと
-ひどいなぁ。
+    List DMAって、32bit address を使っているらしい。それは、ちょっと
+    ひどいなぁ。
 
 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
--- 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
 
 /**
  * # # # # # # # # 
--- 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
 };
 
 
--- 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
 
--- 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
--- 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) {