changeset 518:125a72948e44

....
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 16 Oct 2009 17:57:17 +0900
parents f8d9830d94cd
children 5c76db2a07fa
files TaskManager/ChangeLog TaskManager/kernel/ppe/HTask.cc TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/Task.cc TaskManager/kernel/ppe/Task.h TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/SchedTaskManager.h TaskManager/kernel/sys_task/SysTask.h example/basic/main.cc example/many_task/sort.cc example/post_function/main.cc example/renew_task/main.cc example/renew_task/ppe/Renew1.cc
diffstat 16 files changed, 138 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/ChangeLog	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/ChangeLog	Fri Oct 16 17:57:17 2009 +0900
@@ -1,3 +1,27 @@
+2009-10-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+    create_task が Task を返したり HTask を返すのはよろしくない。
+    HTask はHostに閉じていて、Task は転送可能って方が良いでしょう。
+
+    TaskGroup は謎だが、無視して良いのではないだろうか? HTaskで
+    double linked list 作るなら、それでschedulingすれば良い。
+
+    TaskList (本当は配列) は、なくしてしまうのが良いと思う。
+    Task(可変長) を List DMA で転送して、向こう側で HTask queue を構成する
+    方が合理的でしょう。
+
+    TaskList はそれ自体が、HTask であるべきだと思う。
+    mail で self (HTask address)を返すことはしないで、
+    TaskListTask の outData で返す。
+
+    SPU側には、single task を転送して起動するAPIだけを用意する。
+    TaskListTask が残りのTaskをList DMAで取得し、順次実行する。
+       List DMAで取得したTaskデータの集合は、HTaskに格納される
+
+    とか、なんとかすると変更が大きいんだよな...
+
+    param と inData がかぶってる。param は便利だけどね。
+
 2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     単純な、rbuf, wbuf + write return size の task のAPI
--- a/TaskManager/kernel/ppe/HTask.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -3,19 +3,8 @@
 #include "TaskManagerImpl.h"
 
 
-/*!
-  manager->set_task_depend(task1, task2); // task2 は task1 の終了を待つ
- 
-  ってやるより
- 
-  task2->set_depend(task1);
- 
-  ってやったほうがわかりやすいよねー的な話し合いで
-  下のようなAPIを作りました
-*/
-
 void
-HTask::spawn(void)
+HTask::spawn()
 {
     mimpl->spawn_task(this);
 }
@@ -32,19 +21,14 @@
 void
 HTask::wait_for(HTaskPtr master)
 {
-    mimpl->set_task_depend(master, this);
+    TaskQueuePtr m, s;
+
+    m = wait_i->create(master);
+    s = wait_i->create(this);
+
+    master->wait_me->addLast(s);
+    this->wait_i->addLast(m);
+    s->waiter = m;
+
 }
 
-void
-HTask::set_cpu(CPU_TYPE type)
-{
-{
-    mimpl->set_task_cpu(this, type);
-}
-
-void
-set_post(PostFunction func,void *read, void *write)
-    this->post_func = func;
-    this->post_arg1 = read;
-    this->post_arg2 = write;
-}
--- a/TaskManager/kernel/ppe/HTask.h	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Fri Oct 16 17:57:17 2009 +0900
@@ -9,12 +9,12 @@
 class TaskManagerImpl;
 class SchedTask;
 
-typedef void (*PostFunction)(SchedTask *s, void *read, void *write);
-
 /*!
   @class
   
   @brief
+
+  Host に依存した Task の情報
   
   Cerium の Task で、spawn() でキューに格納されて順次実行される。
   cpu の指定があれば並列に実行される。
@@ -28,17 +28,16 @@
 
     TaskQueueInfo *wait_me;  // List of task waiting for me
     TaskQueueInfo *wait_i;   // List of task for which I am waiting
-    PostFunction func;
+
+    PostFunction post_func;
     void *post_arg1;
     void *post_arg2;
     CPU_TYPE cpu_type;
-    TaskManagerImpl *mimpl;
 
     HTask *waiter;
     HTask *next;
     HTask *prev;
 
-    void spawn(void);
     void wait_for(HTask *);
     void set_cpu(CPU_TYPE type);    
     void set_post(PostFunction func, void *read, void *write);
--- a/TaskManager/kernel/ppe/Task.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -65,3 +65,19 @@
 
     return 0;
 }
+
+void
+Task::set_cpu(CPU_TYPE type)
+{
+    cpu = type;
+}
+
+void
+Task::set_post(PostFunction func_,void *read, void *write)
+{
+    post_func = func_;
+    post_arg1 = read;
+    post_arg2 = write;
+}
+
+/* end */
--- a/TaskManager/kernel/ppe/Task.h	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Fri Oct 16 17:57:17 2009 +0900
@@ -8,10 +8,32 @@
 #define MAX_PARAMS 8
 
 class TaskQueue;
+class SchedTask;
+
+
+/*!
+  @class
+  
+  @brief
+
+  Host に依存しない  Task 
+
+  以下の三つの可変長データを含む 
+    param
+    inData
+    outData 
+  param は inData の最初の部分となる
+
+  self はメインホストの中のHTaskのアドレスで、task id として使う
+
+ */
+
 
 class Task {
 public: // variables
 
+typedef void (*PostFunction)(SchedTask *s, void *read, void *write);
+
     BASE_NEW_DELETE(Task);
 
     int command;         // 4 byte
@@ -19,6 +41,7 @@
 
     int param_size;        // 4 byte
     int param[MAX_PARAMS]; // 4*MAX_PARAMS byte
+
     ListData inData  __attribute__ ((aligned (DEFAULT_ALIGNMENT)));  // 4 byte 64bit であるべき
     ListData outData  __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // 4 byte 64bit であるべき
 
@@ -27,6 +50,8 @@
     int add_outData_t(unsigned int addr, int size); // unsigned int ではなく 64bit
     int add_data(ListData &list, unsigned int addr, int size);
     int add_param(int param);
+    void set_cpu(CPU_TYPE type);
+    void set_post(PostFunction func, void *read, void *write);
 
 #define add_inData(addr, size)			\
     add_inData_t((unsigned int)(addr), (size));
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -1,5 +1,7 @@
 #include <stdio.h>
 #include "TaskManagerImpl.h"
+#include "SchedTask.h"
+#include "SchedTaskManager.h"
 #include "types.h"
 #include "error.h"
 #include "../sys_task/SysTask.h"
@@ -7,11 +9,6 @@
 static HTaskPtr systask_start;
 static HTaskPtr systask_finish;
 
-void
-noaction(SchdTask *s, void *read, void *write)
-{
-}
-
 TaskManagerImpl::TaskManagerImpl(int num)
     : machineNum(num) {
     activeTaskQueue = new HTaskInfo();
@@ -20,6 +17,11 @@
     taskQueueImpl = new TaskQueueInfo(); 
 }
 
+static void
+noaction(SchedTask *s, void *read, void *write)
+{
+}
+
 /**
  * 一番最初に PPE で実行される systask_start
  * 一番最後に、全てのタスクの終了を待つ systask_finish
@@ -57,24 +59,6 @@
 }
 
 /**
- * task の依存関係を設定
- * master task が終わってから、slave task を実行するように
- * master->wait_for(slave);
- */
-void
-TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave)
-{
-    TaskQueuePtr m, s;
-
-    m = taskQueueImpl->create(master);
-    s = taskQueueImpl->create(slave);
-
-    master->wait_me->addLast(s);
-    slave->wait_i->addLast(m);
-    s->waiter = m;
-}
-
-/**
  * タスクを実行可能キューまたは待機キューへ追加する。
  * 依存関係が満たされていれば active, まだだったら wait へ。
  * task->spawn();
@@ -103,18 +87,6 @@
 }
 
 /**
- * タスクが実行する CPU を選択する
- *
- * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5
- * types.h に書いてます。
- */
-void
-TaskManagerImpl::set_task_cpu(HTaskPtr task, CPU_TYPE type)
-{
-    task->cpu_type = type;
-}
-
-/**
  * 終了したタスクから依存の処理とか
  * post_func() はこのタスクが終了したら実行する関数。
  *
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.h	Fri Oct 16 17:57:17 2009 +0900
@@ -20,7 +20,7 @@
     TaskListInfo *taskListImpl;
     TaskQueueInfo *taskQueueImpl;
     HTaskInfo *htaskImpl;
-    SchedTask *schdTaskManager;
+    SchedTask *schedTaskManager;
 
     /* constructor */
     TaskManagerImpl(int num = 1) ;
--- a/TaskManager/kernel/schedule/SchedTask.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -496,9 +496,11 @@
     return task->param[index];
 }
 
-TaskPtr
+HTaskPtr
 SchedTask::create_task(int cmd)
 {
+    HTaskPtr htask = scheduler->create_task(cmd);
+#if 0
     TaskListPtr taskList = scheduler->get_renewListBuf();
     TaskPtr p = &taskList->tasks[taskList->length++];
     p->command = cmd;
@@ -512,6 +514,7 @@
 
     p->self = (int)MY_SPE_NOP;
     p->param_size = 0;
+#endif
 
     return p;
 }
--- a/TaskManager/kernel/schedule/SchedTask.h	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Fri Oct 16 17:57:17 2009 +0900
@@ -9,6 +9,7 @@
 #include "ListData.h"
 #include "TaskGroup.h"
 #include "MemList.h"
+#include "HTask.h"
 
 class SchedTask : public SchedTaskBase {
 public:
@@ -116,6 +117,7 @@
     int get_outputSize(int index);
     int get_param(int index);
 
+    void set_post(PostFunction func,void *read, void *write);
 
     TaskPtr create_task(int cmd);
     void wait_task(TaskPtr waitTask);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedTaskManager.h	Fri Oct 16 17:57:17 2009 +0900
@@ -0,0 +1,19 @@
+#ifndef SchedTaskManager_H
+#define SchedTaskManager_H
+
+#include "SchedTask.h"
+#include "TaskManagerImpl.h"
+
+class SchedTaskManager : public SchedTask {
+
+public:
+
+    TaskManagerImpl *manager;
+
+    SchedTaskManager(TaskManagerImpl *m) {
+	manager = m;
+    }
+
+};
+
+#endif 
--- a/TaskManager/kernel/sys_task/SysTask.h	Mon Oct 12 21:53:50 2009 +0900
+++ b/TaskManager/kernel/sys_task/SysTask.h	Fri Oct 16 17:57:17 2009 +0900
@@ -1,6 +1,6 @@
 #include "Scheduler.h"
 
-enum SysTask_ID{
+enum SysTask_ID {
     SYSTASK_START = MAX_USER_TASK,
     SYSTASK_FINISH,
 };
--- a/example/basic/main.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/example/basic/main.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -28,7 +28,7 @@
  * タスク終了後の data1, data2 の確認
  */
 void
-twice_result(void *a)
+twice_result(SchedTask *s, void *a, void *b)
 {
     int* data = (int*)a;
     print_data(data, length, "after");
@@ -90,7 +90,7 @@
     /*
      * set_post() で ppe task を渡せるようにしたい
      */
-    twice->set_post(twice_result, (void*)data);
+    twice->set_post(twice_result, (void*)data, 0);
 
     // add Active Queue
     twice->spawn();    
--- a/example/many_task/sort.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/example/many_task/sort.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -13,7 +13,7 @@
 static int last_half_block_num;
 static TaskManager *manager;
 
-static void sort_restart(void *);
+static void sort_restart(SchedTask *s, void *, void *);
 static void sort_start();
 
 /**
@@ -44,7 +44,7 @@
  * @param d 生成された btask の数
  */
 static void
-sort_restart(void *d)
+sort_restart(SchedTask *s, void *d, void *e)
 {
     static int cnt = 0;
     int max = (int)d;
@@ -111,7 +111,7 @@
 	for (int i = 0; i < half_num; i++) {
 	    bsort[i]->wait_for(fsort[i]);
 	    bsort[i]->wait_for(fsort[i+1]);
-	    bsort[i]->set_post(sort_restart, (void*)(half_num));
+	    bsort[i]->set_post(sort_restart, (void*)(half_num), 0);
 	    bsort[i]->spawn();
 	}
     }
--- a/example/post_function/main.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/example/post_function/main.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -13,8 +13,8 @@
 const char *usr_help_str = "Usage: ./post [-cpu spe_num] [-count N]\n\
   -count  Number of print \"Hello, World!!\"";
 
-void
-func1(void *p)
+static void
+func1(SchedTask *s, void *p, void *q)
 {
     int i = (int)p;
 
@@ -23,7 +23,7 @@
     if (i > 0) {
 	HTaskPtr next = manager->create_task(HELLO_TASK);
 	next->add_param(i);
-	next->set_post(func1, (void*)i);
+	next->set_post(func1, (void*)i, 0);
 	next->set_cpu(SPE_ANY);
 	next->spawn();    
     }
@@ -49,7 +49,7 @@
 
     task = manager->create_task(HELLO_TASK);
     task->add_param(count);
-    task->set_post(func1, (void*)count);
+    task->set_post(func1, (void*)count, 0);
     task->set_cpu(SPE_ANY);
     task->spawn();
 }
--- a/example/renew_task/main.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/example/renew_task/main.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "TaskManager.h"
+#include "SchedTask.h"
 #include "Func.h"
 
 extern void task_init();
@@ -14,21 +15,17 @@
 static int task_count = 1;
 
 static void
-renewRepeat(void *arg)
+renewRepeat(SchedTask *manager,void *arg, void *arg1)
 {
-    TaskManager *manager = (TaskManager *)arg;
-
     if (count-->0) {
 	HTask *repeat = manager->create_task(RENEW_REPEAT);
-	repeat->set_post(renewRepeat, (void*)manager);
+	repeat->set_post(renewRepeat, 0, 0);
 	repeat->spawn();
 
-	HTask *renew;
-
 	printf("[PPE] Create Task : RenewStart\n\n");
 
 	for(int i=0;i<task_count;i++) {
-	    renew = manager->create_task(RENEW_START);
+	    HTask *renew = manager->create_task(RENEW_START);
 	    renew->set_cpu(SPE_ANY);
 	    renew->add_param(i);
 	    renew->add_param((int)&task_count);
@@ -39,12 +36,6 @@
     }
 }
 
-static int
-run(SchedTask *s, void *rbuf, void *wbuf)
-{
-    // RewnewRepeat Task
-    return 0;
-}
 
 static int
 init(int argc, char **argv)
@@ -69,7 +60,7 @@
     printf("[PPE] Create Task : RenewRepeat\n\n");
 
     repeat = manager->create_task(RENEW_REPEAT);
-    repeat->set_post(renewRepeat, (void*)manager);
+    repeat->set_post(renewRepeat, 0, 0);
 
     // add Active Queue
     repeat->spawn();    
@@ -92,3 +83,5 @@
 
     return 0;
 }
+
+/* end */
--- a/example/renew_task/ppe/Renew1.cc	Mon Oct 12 21:53:50 2009 +0900
+++ b/example/renew_task/ppe/Renew1.cc	Fri Oct 16 17:57:17 2009 +0900
@@ -11,8 +11,17 @@
     s->printf("[PPE] ** running Renew1\n");
     
     s->printf("[PPE] Create Task : Renew2\n");
+#if 0
     TaskPtr nextTask = s->create_task(RENEW2);
     s->wait_task(nextTask);
+#endif
+#if 1
+    HTaskPtr nextTask = s->create_task(RENEW2);
+    nextTask->spawn();
+#endif
+#if 1
+    s->set_post(task_list[RENEW2].entry,0,0);
+#endif
     
     s->printf("[PPE] ** finish  Renew1\n");
     s->printf("\n");