Mercurial > hg > Game > Cerium
diff TaskManager/ChangeLog @ 1052:a0ea7d9b6faf draft
Makefile utf-8
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 10 Dec 2010 23:09:12 +0900 |
parents | 4cd17f86dda6 |
children | 2a63ba2c9506 |
line wrap: on
line diff
--- a/TaskManager/ChangeLog Thu Dec 09 22:30:32 2010 +0900 +++ b/TaskManager/ChangeLog Fri Dec 10 23:09:12 2010 +0900 @@ -1,536 +1,578 @@ +2010-12-10 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + task_list を PPE の main memory において、それを get_segment で取って来る。 + 実行する object は、PPE 側の main memory 上に置く。それを get_segment で + copy して実行する。 + + taskのindata/outdata/get_segment を実際にはコピーしないようにすると良いのだが... + そうすれば、実行時のアドレスが変わらないのでデバッグが容易。 + そういうオプション? いや、get_segment をそういうようにする? + + task_list 上に固定アドレス task かどうかの選択を入れれば良いのか。 + + とりあえず、task_list を get_segment するところから書くのが良さそう。 + + task_list のaddress を SPE にどうやって教えるかと言う問題がある。 + mail かな。 + + tag 使う? argv で渡すってあり? envp で送れるのではないか? + envp はダメだが、argv では渡せるらしい。 + + まず、ppe と spe の task_list を作る API の設計と実装をするべきらしい。 + + Task 側のは無視 (おぉ?!) SPE 側の SchedRegister も不要。 + + get_segment だけでできる? + + PPE側で、 + + TaskRegister(Task ID, 0 file, entry symbol); // PPE fixed task + SpeTaskRegister(Task ID, object file, entry symbol); // SPE dynamic task + SpeTaskRegister(Task ID, 0, entry symbol); // SPE fixed task + + を指定することになる。 PPE 側は自動的に登録される ( -cpu 0 があるから ) + task_list と spu_task_list が同時に初期化される + + object file は、.a でも良い。(良いの?) embed しても良い。 + + と言うことは、今までのように run を使い回しっ手のいうは許されないってこと? + その方が良いでしょう。変更大きいけど。 + + SPE側に固定する Task はどうするの? + 2010-8-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - get_segmentのinlineは、その場に static に置いて、default のものを置いておく。 - size のcheckはしない。 - - MemList は廃止。QueueInfo に。 - - Data 領域は、2^n 管理で、move/compaction を行なう。(が、今は書かない) - - とりあえず、SPUのobject管理だが... + get_segmentのinlineは、その場に static に置いて、default のものを置いておく。 + size のcheckはしない。 + + MemList は廃止。QueueInfo に。 + + Data 領域は、2^n 管理で、move/compaction を行なう。(が、今は書かない) + + とりあえず、SPUのobject管理だが... 2010-8-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - Bulk, Simple, basic は一つにするべきだよな。many_task は、sort と言う名前に変えるべき。 + Bulk, Simple, basic は一つにするべきだよな。many_task は、sort と言う名前に変えるべき。 2010-7-31 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - なんと、simple task を SchedTaskManager 経由で作ると、 - PPE task しか作れなくなっていたらしい。それな遅いよ。 - SchedTaskManagerのtask managerがFifoManagerだったのが - 原因。CellTaskManager を使う時には、FifoManagerは消せる? - - その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が - あるらしい。 - - やっぱり、既に終了した task に対して wait for してしまうのが - まずいらしい。自分で HTask をfree してやれば良いわけだが.. + なんと、simple task を SchedTaskManager 経由で作ると、 + PPE task しか作れなくなっていたらしい。それは遅いよ。 + SchedTaskManagerのtask managerがFifoManagerだったのが + 原因。CellTaskManager を使う時には、FifoManagerは消せる? + + その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が + あるらしい。 + + やっぱり、既に終了した task に対して wait for してしまうのが + まずいらしい。自分で HTask をfree してやれば良いわけだが.. 2010-7-30 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - TASK_LIST_MAIL でない方が高速なみたい - sort (many_task) が、とっても遅くなっている + TASK_LIST_MAIL でない方が高速なみたい + sort (many_task) が、とっても遅くなっている 2010-7-24 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - やっぱり、load module のlinkの解決はやらないといけないので、 - 無理に、SchedTaskのAPI全部を virtual にする必要はないらしい。 - spu-gcc spe/ChainCal.o -Wl,-R,spe-main -o tmp.o - と言う形で、link してやれば良い。(ただし、必要なものが参照されている場合) + やっぱり、load module のlinkの解決はやらないといけないので、 + 無理に、SchedTaskのAPI全部を virtual にする必要はないらしい。 + spu-gcc spe/ChainCal.o -Wl,-R,spe-main -o tmp.o + と言う形で、link してやれば良い。(ただし、必要なものが参照されている場合) 2010-7-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SimpleTask のsizeを16の倍数に。そうしないと、Taskのaligmentが16に - ならないので、gcc -O9 で破綻する。 + SimpleTask のsizeを16の倍数に。そうしないと、Taskのaligmentが16に + ならないので、gcc -O9 で破綻する。 2010-7-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。 - SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。 - cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。 + SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。 + SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。 + cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。 2010-5-25 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう - のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 - check_task_list_finishとかが再帰的に呼びされるのがやっかい。 - - Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。 - post_func は、SchedTask 経由で poling すれば良い。 + PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう + のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 + check_task_list_finishとかが再帰的に呼びされるのがやっかい。 + + Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。 + post_func は、SchedTask 経由で poling すれば良い。 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - 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() みたいなものを用意しても良いが... - - Scheduler のconnector(DMA) / Memory 関連は Scheduler.{h,cc} から - 追い出すべき。connector/memory とかを SchedTask に持たせれば良い。 - そうすると、API追加でScheduelr.{h,cc} / TaskManagerImple とかを修正する - 必要がなくなる。 + 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() みたいなものを用意しても良いが... + + Scheduler のconnector(DMA) / Memory 関連は Scheduler.{h,cc} から + 追い出すべき。connector/memory とかを SchedTask に持たせれば良い。 + そうすると、API追加でScheduelr.{h,cc} / TaskManagerImple とかを修正する + 必要がなくなる。 2010-5-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - speTaskList_bg は追放するべきだと思われる。(done) - - PPE task はTaskList をすべて実行するまで戻って来ない。 - なので、spe のmail checkが疎かになっている。 - PPE task の実行途中で SPEのmail checkを行なうべき。 - - Fifo/Cell TaskManagerImpl は統一できるのではないか? (done) - - SchedTask は今は各Taskのselfを返しているがTaskListにするべき - spe からのメールはTaskListが空になった時で良い。早めに、 - - PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。 - - TaskList もDataSegement化するべきだと思われる。(done) - - Scheduler::task_list もDataSegment化して、メインメモリ上に置く。 + speTaskList_bg は追放するべきだと思われる。(done) + + PPE task はTaskList をすべて実行するまで戻って来ない。 + なので、spe のmail checkが疎かになっている。 + PPE task の実行途中で SPEのmail checkを行なうべき。 + + Fifo/Cell TaskManagerImpl は統一できるのではないか? (done) + + SchedTask は今は各Taskのselfを返しているがTaskListにするべき + spe からのメールはTaskListが空になった時で良い。早めに、 + + PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。 + + TaskList もDataSegement化するべきだと思われる。(done) + + Scheduler::task_list もDataSegment化して、メインメモリ上に置く。 2010-4-28 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SchedTaskBase のみにインスタンス変数を書かせて、 - SchedTask*.h には method のみを書かせる。 - そうすると、デバッグが楽だし、object のallocateも楽。(done) - - HTask(list) -> TaskList(array) -> SchedTask - - というcopyだが、SchedTask で最初から作る方が良いのかも。 - それを DataSegment で共有する。 - - SimpleTask のMailを、 - if (mail_is_not_full) send_mail() ; - else if (queue is not full) enqueuue() ; - else wait_mail(); - ってな感じに出来ないの? - - Multi thread にすると、PPEのmail loop が暴走する可能性がある。 - このあたりなんか方法があるはずだが... + SchedTaskBase のみにインスタンス変数を書かせて、 + SchedTask*.h には method のみを書かせる。 + そうすると、デバッグが楽だし、object のallocateも楽。(done) + + HTask(list) -> TaskList(array) -> SchedTask + + というcopyだが、SchedTask で最初から作る方が良いのかも。 + それを DataSegment で共有する。 + + SimpleTask のMailを、 + if (mail_is_not_full) send_mail() ; + else if (queue is not full) enqueuue() ; + else wait_mail(); + ってな感じに出来ないの? + + Multi thread にすると、PPEのmail loop が暴走する可能性がある。 + このあたりなんか方法があるはずだが... 2010-4-24 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - write T3 T2 T1 TL TA0 TA1 - exec T2 T1 TL TA0 TA1 TA2 - read T1 TL TA TA1 TA2 T2 - next T1 TL TA TA1 TA2* T2 - - *のところで終了mailが出てTaskArrayのデータがfreeされてしまうので、よくない - そうならないように、一段TAN(SchedTaskArrayNop)を挟む。 - - write T3 T2 T1 TL TA0 TA1 TA2 TAN% - exec T2 T1 TL TA0 TA1 TA2 TAN T2 - read T1 TL TA TA1 TA2 TAN T2 T3 - next T1 TL TA TA1 TA2 TAN T2 T3 - - %のところで終了mailを送る。T2のreadのところで、TaskArrayのデータはreadbuff上にあるので - 破壊されてしまう。なので、savedTask->task->self の値はTANにコピーして持っていく必要がある + write T3 T2 T1 TL TA0 TA1 + exec T2 T1 TL TA0 TA1 TA2 + read T1 TL TA TA1 TA2 T2 + next T1 TL TA TA1 TA2* T2 + + *のところで終了mailが出てTaskArrayのデータがfreeされてしまうので、よくない + そうならないように、一段TAN(SchedTaskArrayNop)を挟む。 + + write T3 T2 T1 TL TA0 TA1 TA2 TAN% + exec T2 T1 TL TA0 TA1 TA2 TAN T2 + read T1 TL TA TA1 TA2 TAN T2 T3 + next T1 TL TA TA1 TA2 TAN T2 T3 + + %のところで終了mailを送る。T2のreadのところで、TaskArrayのデータはreadbuff上にあるので + 破壊されてしまう。なので、savedTask->task->self の値はTANにコピーして持っていく必要がある 2009-12-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - そうか、TaskList->next は、SPE 側で自分で呼び出しているわけね。 - と言うことは、schdule(list) が終るまでは、mail check に戻って - こない... それだと、ちょっとまずいね。 - - となると、TaskList のfree(clear)のtimingは? schdule から抜けた - 時と言うことになるわけだけど。 - - waitQueue は、実は不要。しかし、終了条件、dead lock detection には - 必要らしい。 + そうか、TaskList->next は、SPE 側で自分で呼び出しているわけね。 + と言うことは、schdule(list) が終るまでは、mail check に戻って + こない... それだと、ちょっとまずいね。 + + となると、TaskList のfree(clear)のtimingは? schdule から抜けた + 時と言うことになるわけだけど。 + + waitQueue は、実は不要。しかし、終了条件、dead lock detection には + 必要らしい。 2009-12-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が - queue なんだから、トップ二つを特別扱いしているだけでしょう。 - - TaskList をread()しているのと同時にnext()されてしまうので、 - next()の中で、TaskList の中身に触るのは良くない。SchedTask - は微妙に大丈夫らしい。TLのdma waitは、write になっていた。 - - TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、 - これはただしくない。TaskListLoad を間にはさむ手もあるが... - - write T3 T2 T1 TL TA0 ! TL の dma wait - exec T2 T1 TL! TA0 TA1 - read T1 TL* TA TA1 TA2 * TL の dma start - next T1 TL% TA TA1 TA2 % TAの作成判断 - - TaskListLoad をはさむ、安全だけど遅い方法 - - write T3 T2 T1 TLL TL - exec T2 T1 TLL! TL TA0 - read T1 TLL*TL TA0 TA1 - next T1 TLL TL% TA0 TA1 - - なんだけど、pointer の下位ビットで送ると、前者で実行できる。 - next で、TaskList のloadを始めてしまうという手もあるな... - - write T3 T2 T1 TL TA0 ! TL の dma wait - exec T2 T1 TL TA0 TA1 - read T1 TL! TA TA1 TA2 * TL の dma start - next T1* TL% TA TA1 TA2 - - こっっちかな... + CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が + queue なんだから、トップ二つを特別扱いしているだけでしょう。 + + TaskList をread()しているのと同時にnext()されてしまうので、 + next()の中で、TaskList の中身に触るのは良くない。SchedTask + は微妙に大丈夫らしい。TLのdma waitは、write になっていた。 + + TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、 + これはただしくない。TaskListLoad を間にはさむ手もあるが... + + write T3 T2 T1 TL TA0 ! TL の dma wait + exec T2 T1 TL! TA0 TA1 + read T1 TL* TA TA1 TA2 * TL の dma start + next T1 TL% TA TA1 TA2 % TAの作成判断 + + TaskListLoad をはさむ、安全だけど遅い方法 + + write T3 T2 T1 TLL TL + exec T2 T1 TLL! TL TA0 + read T1 TLL*TL TA0 TA1 + next T1 TLL TL% TA0 TA1 + + なんだけど、pointer の下位ビットで送ると、前者で実行できる。 + next で、TaskList のloadを始めてしまうという手もあるな... + + write T3 T2 T1 TL TA0 ! TL の dma wait + exec T2 T1 TL TA0 TA1 + read T1 TL! TA TA1 TA2 * TL の dma start + next T1* TL% TA TA1 TA2 + + こっっちかな... 2009-12-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SimpleTask の実装が出来たので、TaskArray からは、 - PPU側に詳細な情報を返せる。と言うことは、SPU側から - PPU Task を投入出来る。実装すればだけど。 - - Task 側から書き出し情報を設定するAPIが必要。 - マニュアルも書くか。 - - Down cast をすべてなくしたい。Sched*.cc からは取れました。 - - まだ、いらないものが結構あるらしい... + SimpleTask の実装が出来たので、TaskArray からは、 + PPU側に詳細な情報を返せる。と言うことは、SPU側から + PPU Task を投入出来る。実装すればだけど。 + + Task 側から書き出し情報を設定するAPIが必要。 + マニュアルも書くか。 + + Down cast をすべてなくしたい。Sched*.cc からは取れました。 + + まだ、いらないものが結構あるらしい... 2009-12-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - ようやっと動きました。SIMPLE_TASK でないのとの互換性 - を維持するべきか? 頑張れば出来ると思うけど... - - 方法は二つ。TaskList に無理矢理 Task を詰め込むか、 - 今までのHTaskを、TaskArray に読み変えるか。前者は変更が - 多い。後者は、wait_for が微妙。 - - 前者で実装しました。そのうち落すかも。エラーチェックと、 - エラー処理関数が必要。コメントを書かないと。 + ようやっと動きました。SIMPLE_TASK でないのとの互換性 + を維持するべきか? 頑張れば出来ると思うけど... + + 方法は二つ。TaskList に無理矢理 Task を詰め込むか、 + 今までのHTaskを、TaskArray に読み変えるか。前者は変更が + 多い。後者は、wait_for が微妙。 + + 前者で実装しました。そのうち落すかも。エラーチェックと、 + エラー処理関数が必要。コメントを書かないと。 2009-12-12 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SchedTask::next で、TaskArray を認識して、そこで、 - SchedTaskArrayLoad を作る。次のSchedTask を用意して、 - SchedTaskArrayLoad にsavedSchedTaskとして引き渡す。 - - SchedTaskArrayLoad::read は、TaskArray をload する。 - SchedTaskArrayLoad::next は、SchedTaskArray を返す。 - この時に、saveedSchedTask を引き継ぐ。 - write/exec は何もしない。(これで、pipe line を空ける) - - SchedTaskArray::read は、List DMA をload する。 - SchedTaskArrayLoad::next は、TaskArray 上のTaskを返す。 - exec/write は、List DMA 対応で動作する。 - もうない場合には、SchedTaskArrayLoad から伝えられた - saveされた SchedTask を返す。mail も送る。 + SchedTask::next で、TaskArray を認識して、そこで、 + SchedTaskArrayLoad を作る。次のSchedTask を用意して、 + SchedTaskArrayLoad にsavedSchedTaskとして引き渡す。 + + SchedTaskArrayLoad::read は、TaskArray をload する。 + SchedTaskArrayLoad::next は、SchedTaskArray を返す。 + この時に、saveedSchedTask を引き継ぐ。 + write/exec は何もしない。(これで、pipe line を空ける) + + SchedTaskArray::read は、List DMA をload する。 + SchedTaskArrayLoad::next は、TaskArray 上のTaskを返す。 + exec/write は、List DMA 対応で動作する。 + もうない場合には、SchedTaskArrayLoad から伝えられた + saveされた SchedTask を返す。mail も送る。 2009-12-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - pipeline stageは、loop local だから、instance 変数である必 - 要はない。途中で中断することはない。これを一時変数にして、 - 再帰的にpipeline stage を呼び出せば良いらしい。 - - pipeline stage のtask1に引数で new SchedTaskList を渡すと、 - run()でtask1 = new SchedNop() するよりループ二回ぐらい高速 - になるらしい。が、おそらく、ほとんど影響はない。 - - pipelineで既に走っている次のTaskのreadを停める必要があるら - しい。前もってNopを入れて置く方法もあるが、TaskListの境界が - 問題になる。停めないとパイプラインバッファを新たに取る必要 - があり連鎖的にはまる。 - - writeしている奴もいるしな。スケジューラは一段しかネストしな - いから新しくバッファ取るか? いや、やっぱり許されないか。い - や、取るか。うーん、悩ましい。どうせ、Task list は確保しな - いとだめだから… 再帰しないで、もとのスケジューラで動かした - い - - そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask - を投入して、間に TaskList read が入ってもなんとかなるように - 工夫するのが良いっぽい - - なんか、Renew Task の道を歩んでいる気もするが... + pipeline stageは、loop local だから、instance 変数である必 + 要はない。途中で中断することはない。これを一時変数にして、 + 再帰的にpipeline stage を呼び出せば良いらしい。 + + pipeline stage のtask1に引数で new SchedTaskList を渡すと、 + run()でtask1 = new SchedNop() するよりループ二回ぐらい高速 + になるらしい。が、おそらく、ほとんど影響はない。 + + pipelineで既に走っている次のTaskのreadを停める必要があるら + しい。前もってNopを入れて置く方法もあるが、TaskListの境界が + 問題になる。停めないとパイプラインバッファを新たに取る必要 + があり連鎖的にはまる。 + + writeしている奴もいるしな。スケジューラは一段しかネストしな + いから新しくバッファ取るか? いや、やっぱり許されないか。い + や、取るか。うーん、悩ましい。どうせ、Task list は確保しな + いとだめだから… 再帰しないで、もとのスケジューラで動かした + い + + そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask + を投入して、間に TaskList read が入ってもなんとかなるように + 工夫するのが良いっぽい + + なんか、Renew Task の道を歩んでいる気もするが... 2009-12-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている - かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの - が必要。deubg 用のデータ書き出しツールがいるな。 - - log header - command(16) cpu-id(16) event(32) time(64) - struct debug_log { - uint16 command; - uint16 cpu-id; - uint32 event; - uint32 time; - } - ぐらい? get_segment 使うべきか。連続領域に使える get_segement があると - 良いわけね。write とも言うが。 - - sort で、memcpy しているのは変。read/write buffer をflipしてやると - 良い。両方とも握っているんだから問題ない。ただし、read/write buffer - の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か? - sort ちゃんとは動いているんだよ。 - - word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが - あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに - なっている。PPUネックになっているっぽい。 - - TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを - 用意する感じか。inData/outData の処理も。 + やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている + かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの + が必要。deubg 用のデータ書き出しツールがいるな。 + + log header + command(16) cpu-id(16) event(32) time(64) + struct debug_log { + uint16 command; + uint16 cpu-id; + uint32 event; + uint32 time; + } + ぐらい? get_segment 使うべきか。連続領域に使える get_segement があると + 良いわけね。write とも言うが。 + + sort で、memcpy しているのは変。read/write buffer をflipしてやると + 良い。両方とも握っているんだから問題ない。ただし、read/write buffer + の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か? + sort ちゃんとは動いているんだよ。 + + word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが + あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに + なっている。PPUネックになっているっぽい。 + + TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを + 用意する感じか。inData/outData の処理も。 2009-12-5 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - なんかなぁ。一つの機能を付け加えようとすると、 - - TaskManager/Cell/CellTaskManagerImpl.cc - TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/CellDmaManager.cc - TaskManager/Cell/spe/CellDmaManager.h TaskManager/Cell/spe/ShowTime.cc TaskManager/Cell/spe/ShowTime.h - TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h - TaskManager/Cell/spe/main.cc TaskManager/Fifo/FifoTaskManagerImpl.cc - TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManager.h - TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/DmaManager.h - TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h - TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/SysTasks.h - example/word_count_test/main.cc - - こんなにファイルをいじらないと出来ない。それって、全然、ダメじゃん。 - - なんでかなぁ。 + なんかなぁ。一つの機能を付け加えようとすると、 + + TaskManager/Cell/CellTaskManagerImpl.cc + TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/CellDmaManager.cc + TaskManager/Cell/spe/CellDmaManager.h TaskManager/Cell/spe/ShowTime.cc TaskManager/Cell/spe/ShowTime.h + TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h + TaskManager/Cell/spe/main.cc TaskManager/Fifo/FifoTaskManagerImpl.cc + TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManager.h + TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/DmaManager.h + TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h + TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/SysTasks.h + example/word_count_test/main.cc + + こんなにファイルをいじらないと出来ない。それって、全然、ダメじゃん。 + + なんでかなぁ。 SchedTask -> Scheduler -> Connector TaskManagerImpl -> {CellTaskManager,FifoTaskManager/SpeTaskManager} - を全部、いじる羽目になる。 - SchedTask から system call するより、Task を定義して、 - それを呼び出すって方がましかも。 + を全部、いじる羽目になる。 + SchedTask から system call するより、Task を定義して、 + それを呼び出すって方がましかも。 2009-11-23 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - list.bound は廃止。list element から計算可能。 + list.bound は廃止。list element から計算可能。 2009-11-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - mail_sendQueue の実装がだめ。こういう実装をすると、queue の - 正しさを関数の中に閉じ込められない。なんか、無限リストにな - っているらしい。参照が、渡り歩いているどこかの場所でダメに - なっているらしい。 - - 実際、mail_sendQueue は、free list に置き換わってしまう。 - これまで、これがおかしくならなかった理由は不明。 - - connector に外から手を入れないで、ちゃんとfunction callするべし。 - - わかりました。 - if (list) { - ... - mainScheduler->send_mailList(in_mail_list); - } - out_mail_list = mainScheduler->recv_mailList(); - - としてしまったが、recv_mailList() でなく、send_mailList で、 - mail_sendQueue をクリアしていたので、 - } else { - mainScheduler->send_mailList(in_mail_list); - } - とする必要があったらしい。if (list) を入れたせいで、こうなった。 - でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。 - なので、send_mailList() での clear は必要ない。 + mail_sendQueue の実装がだめ。こういう実装をすると、queue の + 正しさを関数の中に閉じ込められない。なんか、無限リストにな + っているらしい。参照が、渡り歩いているどこかの場所でダメに + なっているらしい。 + + 実際、mail_sendQueue は、free list に置き換わってしまう。 + これまで、これがおかしくならなかった理由は不明。 + + connector に外から手を入れないで、ちゃんとfunction callするべし。 + + わかりました。 + if (list) { + ... + mainScheduler->send_mailList(in_mail_list); + } + out_mail_list = mainScheduler->recv_mailList(); + + としてしまったが、recv_mailList() でなく、send_mailList で、 + mail_sendQueue をクリアしていたので、 + } else { + mainScheduler->send_mailList(in_mail_list); + } + とする必要があったらしい。if (list) を入れたせいで、こうなった。 + でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。 + なので、send_mailList() での clear は必要ない。 2009-11-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - finish_task を全員が待つ設定で、finish_task を終了判定に - 使っている。それだと、すべてのtaskが、finish_task のwait queue - を*必ず*触りにいってしまう。 - - finish_task への待ちを取り除くと、CellTaskManagerImpl::run() - が、 + 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 - で、走っているものがあるかどうか見るか? - - Cell だと、MainScheduler と FifoScheduler の二種類の - スケジューラがあるのか。 + とかやっているので、ここで抜けてしまう。 + + 要するに、SPUの状態を見て、running がなくなるのを調べるべき + なんだが、SpeTheads は「一つしかない」らしい。spe_running + で、走っているものがあるかどうか見るか? + + Cell だと、MainScheduler と FifoScheduler の二種類の + スケジューラがあるのか。 MainScheduler --- task list -----> FifoScheduler MainScheduler <-- finish task ---- FifoScheduler - というわけね。 + というわけね。 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> - やっぱり、TaskList の存在が許せない。あったとしても不定長でしょう。 - 無駄なコピーが多すぎる。 + やっぱり、TaskList の存在が許せない。あったとしても不定長でしょう。 + 無駄なコピーが多すぎる。 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - Scheduler / TaskManger / TaskManagerImpl の区別が不明 - HTask は、TaskManagerImpl を持ってる。 - - Scheduler は SchedTask から直接見えないはずだが、SchedTask は、 - Scheduler は知っているが、TaskManager は知らない。これがかなりの - 混乱を生んでいる。 - - SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、 - TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。 - - SchedTask が自分自身で scheduling してしまっているので、Scheduler - には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager - 経由で行うことになる。 + Scheduler / TaskManger / TaskManagerImpl の区別が不明 + HTask は、TaskManagerImpl を持ってる。 + + Scheduler は SchedTask から直接見えないはずだが、SchedTask は、 + Scheduler は知っているが、TaskManager は知らない。これがかなりの + 混乱を生んでいる。 + + SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、 + TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。 + + SchedTask が自分自身で scheduling してしまっているので、Scheduler + には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager + 経由で行うことになる。 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - 要するに、SPE task 側から addOutData できればよい。 - でも、別に、PPE側から計算してもよいはずだけどね。 - そうすれば、renew task は取り外せる。 + 要するに、SPE task 側から addOutData できればよい。 + でも、別に、PPE側から計算してもよいはずだけどね。 + そうすれば、renew task は取り外せる。 SchedDefineTask1(DrawSpanEnd,draw_span_end); - で、名前を指定させておいて、さらに、 - SchedExternTask(DrawSpanEnd); - SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd); - で、新しく名前を要求するのって、なんとかならんの? 読みづらいんだよ。 - DrawSpanEnd を、そのまま使ってもよさそうだけど? - - せっかく、renew task を外したのに、HD crash で失ってしまいました。 - - add_param が順序を持っているのは見づらい。数字で指定する方が合理的。 + で、名前を指定させておいて、さらに、 + SchedExternTask(DrawSpanEnd); + SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd); + で、新しく名前を要求するのって、なんとかならんの? 読みづらいんだよ。 + DrawSpanEnd を、そのまま使ってもよさそうだけど? + + せっかく、renew task を外したのに、HD crash で失ってしまいました。 + + add_param が順序を持っているのは見づらい。数字で指定する方が合理的。 2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - 単純な、rbuf, wbuf + write return size の task のAPI - List DMA の API - 投入 cpu 別の spawn method - Redering 時の内部からの DMA への直接アクセスへの禁止等など - - set_post で登録する関数も、task のrun関数と同じ型にした方が便利そう。 - - SPU側でも配列(TaskList)ではなく、TaskQueue で管理すれば、 - renew task は簡単に実装できる。 - - SchedTask の renew かそうでないかの区別は全部なくす。ex_init とかは、 - なくなるはず。その代わり TaskQueue で管理する。 - - TaskList に inListData/outListData が入っているのは、やはりおかしい。 - もっとコンパクトであるべき。 - - TaskList は、こまめに終了をPPE側へ知らせるのではなく、TaskListの - 書き換えで知らせる方が良い。 - - SPUからPPUへ、create task 出来た方が良い。それはTaskList の書き出し - で行なう。 + 単純な、rbuf, wbuf + write return size の task のAPI + List DMA の API + 投入 cpu 別の spawn method + Redering 時の内部からの DMA への直接アクセスへの禁止等など + + set_post で登録する関数も、task のrun関数と同じ型にした方が便利そう。 + + SPU側でも配列(TaskList)ではなく、TaskQueue で管理すれば、 + renew task は簡単に実装できる。 + + SchedTask の renew かそうでないかの区別は全部なくす。ex_init とかは、 + なくなるはず。その代わり TaskQueue で管理する。 + + TaskList に inListData/outListData が入っているのは、やはりおかしい。 + もっとコンパクトであるべき。 + + TaskList は、こまめに終了をPPE側へ知らせるのではなく、TaskListの + 書き換えで知らせる方が良い。 + + SPUからPPUへ、create task 出来た方が良い。それはTaskList の書き出し + で行なう。 2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - ようやっと直せました。inListData/outListData は別に転送しないで、 - 一緒に転送してしまった方が良い。どうせ、いつも転送しているのだから。 - - word_count が fifo の方が高速なのは、どうにかしてください。 - - Renew Task の addInData は、メインメモリからDMAするので正しいらしい。 - 直し方を間違えた。 - - Task をmemcpyして、TaskList に入れているが、List DMA に直すべき。 - Simple Task を常に起動して、List DMA task は、その中で、Renew Task - として起動するのが良いのでは? そうすれば、Task Load 自体を Task に - 出来る。 - - Renew Task の実行順序が filo になっている。このあたり変なので、 - 修正するべきでしょう。Renew用の TaskList を持てば良いんじゃないか? - task->self の ad-hoc な使い方が泣ける。ひどすぎます。 + ようやっと直せました。inListData/outListData は別に転送しないで、 + 一緒に転送してしまった方が良い。どうせ、いつも転送しているのだから。 + + word_count が fifo の方が高速なのは、どうにかしてください。 + + Renew Task の addInData は、メインメモリからDMAするので正しいらしい。 + 直し方を間違えた。 + + Task をmemcpyして、TaskList に入れているが、List DMA に直すべき。 + Simple Task を常に起動して、List DMA task は、その中で、Renew Task + として起動するのが良いのでは? そうすれば、Task Load 自体を Task に + 出来る。 + + Renew Task の実行順序が filo になっている。このあたり変なので、 + 修正するべきでしょう。Renew用の TaskList を持てば良いんじゃないか? + task->self の ad-hoc な使い方が泣ける。ひどすぎます。 2009-10-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - Task 内の create_task は、SchedTask に対してで、 - PPE 上では、Manager に対してだよね。だから、出来る - ことがかなり異なる。これは、まずいだろ? - - 特に、PPE task に明示的に manager を渡すってのは、 - とっても変。 - - Renew Task の特別扱いが、いろいろ歪めているんだが、 - view.cc で使っているので落せない。 + Task 内の create_task は、SchedTask に対してで、 + PPE 上では、Manager に対してだよね。だから、出来る + ことがかなり異なる。これは、まずいだろ? + + 特に、PPE task に明示的に manager を渡すってのは、 + とっても変。 + + Renew Task の特別扱いが、いろいろ歪めているんだが、 + view.cc で使っているので落せない。 2009-10-05 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - TaskQueue のfree list の管理はシステムで一つであるべき。 - TaskQueue は double linked list が当然らしい。 + TaskQueue のfree list の管理はシステムで一つであるべき。 + TaskQueue は double linked list が当然らしい。 2009-10-02 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT - して、free しているが、これは、抽象化違反。Task で明示的に - DMAするのは禁止。Task 内で、add_outData 出来れば良い。 - - renew が正しいような気がするが... - - Task 内で大域変数は使えない。なので、smanager からallocateする - 必要がある。Task の解放のタイミングではなくて、パイプラインの - タイミングでDMA waitとfreeを行なう必要がある。DrawSpan の場合は、 - add_outData で良いが、内部で allocate/free は行なう必要がある。 - put_segement がパイプライン動作するべきなのか? - - 固定のDMA tagが邪魔。 - - DrawSpan は全般的にダメだな〜 - - でも、その変更は大きいので、とりあえず動くようにしたい。 - - memset 0 は、7.7.3 SL1 Data Cache Range Set to Zero コマンド - つかうべき。SPE側でやっても良い。でも、本来は全面埋まるのが - 普通なのでどうでも良いけど。 + DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT + して、free しているが、これは、抽象化違反。Task で明示的に + DMAするのは禁止。Task 内で、add_outData 出来れば良い。 + + renew が正しいような気がするが... + + Task 内で大域変数は使えない。なので、smanager からallocateする + 必要がある。Task の解放のタイミングではなくて、パイプラインの + タイミングでDMA waitとfreeを行なう必要がある。DrawSpan の場合は、 + add_outData で良いが、内部で allocate/free は行なう必要がある。 + put_segement がパイプライン動作するべきなのか? + + 固定のDMA tagが邪魔。 + + DrawSpan は全般的にダメだな〜 + + でも、その変更は大きいので、とりあえず動くようにしたい。 + + memset 0 は、7.7.3 SL1 Data Cache Range Set to Zero コマンド + つかうべき。SPE側でやっても良い。でも、本来は全面埋まるのが + 普通なのでどうでも良いけど。 2009-08-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - で、MemList/MemHash が TaskManager 側に移ったので、 - これで、code の management を書くことが出来る。 - そうすれば、SPEのメモリの限界をほんと気にする必要がなくなるはず。 - - その前に、get_segment の例題を直さないと。 - - DrawSpanRnew/reboot は使ってないらしい。 - - Tree は、配列にしないでlinkをSPE側からたどるようになっている。 - それは良いのだが、Task 側で dma_wait するような実装は望ましくない。 - この部分も書き直す必要がある。list 構造の SPE上の Iterator を - 実装すれば良い。 - - memory 関係のコードが scheduler の下にあるのは面白くない。 - - Scheduler で実装(__scheduler)に移譲している部分は、headerに - 移した方が良い。 + で、MemList/MemHash が TaskManager 側に移ったので、 + これで、code の management を書くことが出来る。 + そうすれば、SPEのメモリの限界をほんと気にする必要がなくなるはず。 + + その前に、get_segment の例題を直さないと。 + + DrawSpanRnew/reboot は使ってないらしい。 + + Tree は、配列にしないでlinkをSPE側からたどるようになっている。 + それは良いのだが、Task 側で dma_wait するような実装は望ましくない。 + この部分も書き直す必要がある。list 構造の SPE上の Iterator を + 実装すれば良い。 + + memory 関係のコードが scheduler の下にあるのは面白くない。 + + Scheduler で実装(__scheduler)に移譲している部分は、headerに + 移した方が良い。 2009-08-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - うーん、get_segemnt で、dma_wait のtagをなんとかする - 必要があるらしい。get_tag() でなんとかなるけど、 - 他のtag との関係があるかな。 - - 完全に見えなくするべきでしょうけど... 今はいい。 + うーん、get_segemnt で、dma_wait のtagをなんとかする + 必要があるらしい。get_tag() でなんとかなるけど、 + 他のtag との関係があるかな。 + + 完全に見えなくするべきでしょうけど... 今はいい。 2009-08-01 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - MemList は動いたので、今度は TileHash を TaskManager 側に移動する - 必要がある。 - - その後、コードのLRUを書けば、Cerium は一通り出来上がり。 - - TaskManager と Scheduler の関係が一貫してない。複雑すぎる。 + MemList は動いたので、今度は TileHash を TaskManager 側に移動する + 必要がある。 + + その後、コードのLRUを書けば、Cerium は一通り出来上がり。 + + TaskManager と Scheduler の関係が一貫してない。複雑すぎる。 2009-07-24 Kaito TAGANO <tkaito@cr.ie.u-ryukyu.ac.jp> @@ -547,7 +589,7 @@ } class MemList { - MemorySegment* first; + MemorySegment* first; MemorySegment* last; MemList* createMemList(uint32 size, uint32 count); @@ -983,7 +1025,7 @@ --- 記述例 --- printf("the number of available entries = %d\n", - spe_in_mbox_status(spe_ctx)); + spe_in_mbox_status(spe_ctx)); --- 実行結果 --- the number of available entries = 4 @@ -1059,13 +1101,13 @@ 使っているので、SchedTask にそって実行する場合、 __scheduler->dma_load(__inListData, (uint32)__task->inData, - sizeof(ListData), DMA_READ_IN_LIST); + sizeof(ListData), DMA_READ_IN_LIST); __scheduler->dma_load(__outListData, (uint32)__task->outData, - sizeof(ListData), DMA_READ_OUT_LIST); + sizeof(ListData), DMA_READ_OUT_LIST); の代わりに - memcpy(__inListData, __task->inData, sizeof(ListData)); + memcpy(__inListData, __task->inData, sizeof(ListData)); memcpy(__outListData, __task->outData, sizeof(ListData)); free(__task->inData); free(__task->outData); @@ -1088,8 +1130,8 @@ test_cpy(int flag, int *src) { if (flag) { - memcpy(data, src, sizeof(int)*length); - free(src); + memcpy(data, src, sizeof(int)*length); + free(src); } } @@ -1100,13 +1142,13 @@ test_nocpy(int flag, int *src) { if (flag) { - data = src; + data = src; } // この部分を SchedTask::~SchedTask() と // 思ってください if (flag) { - free(data); + free(data); } } @@ -1116,7 +1158,7 @@ flag は 1 or 0 の繰り返しです。 - 実行結果 (1) - :no copy + :no copy SPE time by SPU Decrementer: 0.035500 :copy SPE time by SPU Decrementer: 0.057500 @@ -1141,7 +1183,7 @@ test_nocpy(int flag, int *src) { if (flag) { - data = src; + data = src; } free((void*)(flag*(int)data)); @@ -1213,11 +1255,11 @@ free((TaskListPtr)(__flag_renewTask*(int)(__list))); #else if (__flag_renewTask) { - free(__inListData); - free(__outListData); - free(__list); + free(__inListData); + free(__outListData); + free(__list); } - #endif + #endif こんな感じで、いくつかか if 文を消してみた。 そして、PPE側の main.cc で gettimeofday で計測してみた (各10回) @@ -1332,7 +1374,7 @@ free((void*)(flag_renewTask*(int)(list))); #else if (flag_renewTask) { - free(list); + free(list); } #endif @@ -1611,7 +1653,7 @@ * add (API): set_post - create_task(id, 0); + create_task(id, 0); とかわざわざ 0 付けるのもアレなので、もうそれように @@ -1838,9 +1880,9 @@ 今までは if (spe_out_mbox_read(spe_ctx[speid], &ret, 1) < 0) { - return ret; + return ret; else - return -1; + return -1; とやっていた。これは @@ -1996,7 +2038,7 @@ セマフォの P 動作は、基本的に --------------------- - pthread_mutex_lock(&sem->mutex); + pthread_mutex_lock(&sem->mutex); while(sem->value == 0) { // 資源が無い // 条件付き変数に自分を登録して、ロックを解放して、他の @@ -2166,7 +2208,7 @@ 必要がある。その計算をミスってました。 1 ////////// - <- なぜか書き込まれていない + <- なぜか書き込まれていない ////////// //////////