Mercurial > hg > Game > Cerium
changeset 814:634c9b0c7d57 draft
log
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 23 May 2010 08:12:22 +0900 |
parents | 64eb67b5d60d |
children | cbdfb900ef57 |
files | TaskManager/ChangeLog TaskManager/kernel/ppe/HTask.cc |
diffstat | 2 files changed, 56 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/ChangeLog Sun May 23 00:25:00 2010 +0900 +++ b/TaskManager/ChangeLog Sun May 23 08:12:22 2010 +0900 @@ -1,24 +1,39 @@ 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。 - CpuManager みたいなものを用意しないとダメか。 + CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。 + CpuManager みたいなものを用意しないとダメか。 + + HTask から、waitfor/create_task とかは、TaskManager を呼んでいる。 + そのたびに CAS (Check and set) するのはばかげているよな〜 + TaskManager にメールで送る方が良いのではないか。 + + wait_for する Task が既に終了していると、存在しないTaskあるいは、 + 別な Task を wait_for する場合がある。いわゆるゾンビだけど、これは + どうしよう? 生きているかどうかを識別するように id を付けるか? + + どうも、TaskManager.{h,cc} は要らないっぽい。TMmain に渡されるのも + SchedTask である方が自然。 + + TaskListInfo は循環リストなので、SPU/PPU scheduler に渡す前に、 + getLast()->next = 0 する必要がある。freeAll() する前に、直さないと + だめ。getList() みたいなものを用意しても良いが... 2010-5-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - speTaskList_bg は追放するべきだと思われる。 + speTaskList_bg は追放するべきだと思われる。(done) PPE task はTaskList をすべて実行するまで戻って来ない。 なので、spe のmail checkが疎かになっている。 PPE task の実行途中で SPEのmail checkを行なうべき。 - Fifo/Cell TaskManagerImpl は統一できるのではないか? + Fifo/Cell TaskManagerImpl は統一できるのではないか? (done) SchedTask は今は各Taskのselfを返しているがTaskListにするべき spe からのメールはTaskListが空になった時で良い。早めに、 PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。 - TaskList もDataSegement化するべきだと思われる。 + TaskList もDataSegement化するべきだと思われる。(done) Scheduler::task_list もDataSegment化して、メインメモリ上に置く。 @@ -26,7 +41,7 @@ SchedTaskBase のみにインスタンス変数を書かせて、 SchedTask*.h には method のみを書かせる。 - そうすると、デバッグが楽だし、object のallocateも楽。 + そうすると、デバッグが楽だし、object のallocateも楽。(done) HTask(list) -> TaskList(array) -> SchedTask @@ -34,9 +49,9 @@ それを DataSegment で共有する。 SimpleTask のMailを、 - if (mail_is_not_full) send_mail() ; - else if (queue is not full) enqueuue() ; - else wait_mail(); + if (mail_is_not_full) send_mail() ; + else if (queue is not full) enqueuue() ; + else wait_mail(); ってな感じに出来ないの? Multi thread にすると、PPEのmail loop が暴走する可能性がある。
--- a/TaskManager/kernel/ppe/HTask.cc Sun May 23 00:25:00 2010 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Sun May 23 08:12:22 2010 +0900 @@ -29,19 +29,30 @@ wait_for している Task の入力バッファにこの Task から書き込みできる機能があると良い */ - void HTask::wait_for(HTaskPtr master) { mimpl->set_task_depend(master, this); } +/** + * タスクが実行する CPU を選択する + * + * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5 + * types.h に書いてます。 + * + * mimpl によって使えるCPUが異なるので、mimpl に任せる必要がある + */ void HTask::set_cpu(CPU_TYPE type) { mimpl->set_task_cpu(this, type); } +/*! + @brief このTaskが終了した時に実行する関数 + @param arg1, arg2 の二つの引数を持つ (Task に合わせてある) + */ void HTask::set_post(PostFunction func,void *arg1, void *arg2) { @@ -51,6 +62,15 @@ } +/*! + @brief まとまって実行されるTask である Task Array の作成 + @param id Task ID + @param num_task 実行する Task の数 + @param num_param 一つのTaskがset_paramする数 + @param num_inData 一つのTaskが読み込む Data の数、set_inData の数 + @param num_outData 一つのTaskが書き出す Data の数、set_outData の数 + @return Task Array へのポインタ + */ Task * HTask::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData) { @@ -63,6 +83,12 @@ return task; // first task } +/*! + @brief Task Array の次のTask + @param t 今のTaskのポインタ + 0 の場合は最初のTask + @return 次のTaskへのポインタ + */ Task * HTask::next_task_array(int id, Task *t) { @@ -79,6 +105,11 @@ return next; } +/*! + @brief Task Array の中のすべてのTaskが書き込まれたかどうかをチェックする + TaskArray 自体の spawn() は別に必要 + @param last 今のTaskのポインタ (最後である必要がある) + */ void HTask::spawn_task_array(Task * last) {