Mercurial > hg > Members > kono > Cerium
changeset 837:4318c1f750d1
merge
author | tkaito |
---|---|
date | Tue, 25 May 2010 19:14:44 +0900 |
parents | cc06efc75ad9 (current diff) dc3621ee7816 (diff) |
children | 41302b72c895 2432c7fe291c |
files | |
diffstat | 15 files changed, 213 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/Document/Cerium2010.mm Tue May 25 19:13:28 2010 +0900 +++ b/Document/Cerium2010.mm Tue May 25 19:14:44 2010 +0900 @@ -7,38 +7,76 @@ <node CREATED="1271152654975" ID="Freemind_Link_872288409" MODIFIED="1271152689305" TEXT="simple task"/> <node CREATED="1271152689941" ID="Freemind_Link_394170420" MODIFIED="1271152696744" TEXT="array task"/> <node CREATED="1271152707076" ID="Freemind_Link_821908954" MODIFIED="1271152710024" TEXT="old task"/> +<node CREATED="1274588901430" ID="Freemind_Link_93256422" MODIFIED="1274588930968" TEXT="bulk task iterator が必要"/> +<node CREATED="1274589056845" ID="Freemind_Link_525207414" MODIFIED="1274589066504" TEXT="TaskManager は必要でないらしい"> +<node CREATED="1274589068245" ID="Freemind_Link_491724576" MODIFIED="1274589092436" TEXT="TMmain に TaskManager を渡すのではない"/> +<node CREATED="1274589093907" ID="Freemind_Link_479464644" MODIFIED="1274589110014" TEXT="TMmain には SchedTask を渡す"/> </node> -<node CREATED="1272359816085" ID="Freemind_Link_1141511333" MODIFIED="1272359822079" TEXT="Code load"> -<node CREATED="1272359838763" ID="Freemind_Link_559440262" MODIFIED="1272359874862" TEXT="overlayの領域をcode領域に追加する"/> -<node CREATED="1272359908849" ID="Freemind_Link_385235315" MODIFIED="1272359935147" TEXT="Task List を main memoryに追い出す"/> +<node CREATED="1274589412122" ID="Freemind_Link_1178859006" MODIFIED="1274589421381" TEXT="wait for"> +<node CREATED="1274589422665" ID="Freemind_Link_430196306" MODIFIED="1274589445468" TEXT="wait for したときに、その Task が既に終わってるとまずい"/> +<node CREATED="1274589448968" ID="Freemind_Link_1819112747" MODIFIED="1274589485129" TEXT="既に free されてるかもしれない"/> +<node CREATED="1274589463647" ID="Freemind_Link_628313303" MODIFIED="1274589501161" TEXT="既に再利用されてる可能性もある"/> +<node CREATED="1274589504213" ID="Freemind_Link_1256949293" MODIFIED="1274589543285" TEXT="これを防ぐために HTask queue に sequence 番号をつける"> +<node CREATED="1274589543690" ID="Freemind_Link_571012406" MODIFIED="1274589565709" TEXT="pointer と sequence 番号で判断する"/> +</node> +<node CREATED="1274589592652" ID="Freemind_Link_633880071" MODIFIED="1274589611826" TEXT="wait for する先がまだ spawn されてなければ問題ない"/> +</node> +<node CREATED="1274591484600" ID="Freemind_Link_326262522" MODIFIED="1274591901958" TEXT="Scheduler からの Task の終了の通知"> +<icon BUILTIN="bookmark"/> +<node CREATED="1274591515950" ID="Freemind_Link_1155992623" MODIFIED="1274591524009" TEXT="現状"> +<node CREATED="1274591525062" ID="Freemind_Link_1807292931" MODIFIED="1274591565447" TEXT="Simple Task とTask Array の終了ごとに mail がくる"/> +<node CREATED="1274591534573" ID="Freemind_Link_1511819683" MODIFIED="1274591595048" TEXT="ppe が mail を取らないと spe が止まってしまう"/> +</node> +<node CREATED="1274591601138" ID="Freemind_Link_382514949" MODIFIED="1274591605413" TEXT="解決策"> +<node CREATED="1274591606025" ID="Freemind_Link_353884996" MODIFIED="1274591631556" TEXT="ppe 側で task の終了ごとに spe の mail をチェックする"/> +<node CREATED="1274591639087" ID="Freemind_Link_1901780159" MODIFIED="1274591678257" TEXT="task ごとではなくて、tasklist ごとに終了の mail を送る"/> +<node CREATED="1274591690357" ID="Freemind_Link_755676138" MODIFIED="1274591731374" TEXT="tasklist には複数の task が入っているので、それを TaskManagerImpl がチェックする"/> +<node CREATED="1274591739066" ID="Freemind_Link_832928459" MODIFIED="1274591771190" TEXT="post_func の後にも mail をチェックする"/> +<node CREATED="1274591763785" ID="Freemind_Link_781498285" MODIFIED="1274591809082" TEXT="ppe 側を multithread 化すると mail のチェックは速くなる"> +<node CREATED="1274591811494" ID="Freemind_Link_142692230" MODIFIED="1274591847760" TEXT="ただし、ppe の mail check は busy wait なので CPU を食う可能性がある"/> +</node> +</node> +</node> </node> <node CREATED="1271152816566" ID="Freemind_Link_1565696016" MODIFIED="1271152823147" TEXT="RenderingEngine"> <node CREATED="1271152752178" ID="Freemind_Link_547968057" MODIFIED="1271152770913" TEXT="simple task に書き直す"/> <node CREATED="1271152774825" ID="Freemind_Link_1913385705" MODIFIED="1271152782596" TEXT="array task に書き直す"/> -<node CREATED="1272360043545" ID="Freemind_Link_1681599734" MODIFIED="1272360049917" TEXT="光源"> -<node CREATED="1272360050585" ID="Freemind_Link_315378051" MODIFIED="1272360162478" TEXT="光源のスイッチ"> -<icon BUILTIN="button_ok"/> +<node CREATED="1274590740681" ID="Freemind_Link_276160769" MODIFIED="1274590761477" TEXT="createPolygonFromSceneGraph"/> +<node CREATED="1274590763872" ID="Freemind_Link_149309559" MODIFIED="1274590768587" TEXT="createSpan"> +<node CREATED="1274590806277" ID="Freemind_Link_956150988" MODIFIED="1274590821313" TEXT="get_segment で書き直す"/> +</node> +<node CREATED="1274590776014" ID="Freemind_Link_1512564455" MODIFIED="1274590781674" TEXT="DrawSpan"> +<node CREATED="1274591872323" ID="Freemind_Link_694643331" MODIFIED="1274591883214" TEXT="Task Array で書き直す"/> +</node> </node> -<node CREATED="1272360057184" ID="Freemind_Link_208005955" MODIFIED="1272360063316" TEXT="光源機能のスイッチ"/> -<node CREATED="1272360078399" ID="Freemind_Link_1262318818" MODIFIED="1272360104442" TEXT="Material の情報取得"> -<node CREATED="1272360104814" ID="Freemind_Link_647651975" MODIFIED="1272360118536" TEXT="script側から取得"/> -<node CREATED="1272360126181" ID="Freemind_Link_591710456" MODIFIED="1272360136128" TEXT="SceneGraph側から取得"/> +<node CREATED="1271152865996" ID="Freemind_Link_1369046890" MODIFIED="1274591464598" TEXT="ppu の multi threads 化"> +<icon BUILTIN="full-2"/> +<icon BUILTIN="ksmiletris"/> +<icon BUILTIN="bookmark"/> +<node CREATED="1271152923312" ID="Freemind_Link_751477936" MODIFIED="1271154172144" TEXT="ppu の fifo を synchronized queue に書き換える"/> +<node CREATED="1274588938972" ID="Freemind_Link_1843780088" MODIFIED="1274588948726" TEXT="CPU thread を作った"> +<node CREATED="1274589123218" ID="Freemind_Link_1266246688" MODIFIED="1274589152996" TEXT="mail を Blocking queue にする"/> +</node> +<node CREATED="1274588957790" ID="Freemind_Link_1367800310" MODIFIED="1274589249636" TEXT="task 側から createTask する場合"> +<node CREATED="1274588987609" ID="Freemind_Link_869382645" MODIFIED="1274589006891" TEXT="local thread で local でqueue を作成する"/> +<node CREATED="1274589011943" ID="Freemind_Link_1937839870" MODIFIED="1274589047697" TEXT="queue を mail で TaskManagerImpl に投げる"/> +<node CREATED="1274589048518" ID="Freemind_Link_1379141754" MODIFIED="1274589192562" TEXT="task queue は TaskManagerImpl からしかアクセスしないようにする"/> +<node CREATED="1274589260394" ID="Freemind_Link_1946382151" MODIFIED="1274589278845" TEXT="task queue にアクセスするのに lock が不要になる"/> +<node CREATED="1274589321823" ID="Freemind_Link_1691404099" MODIFIED="1274589339817" TEXT="wait for は task queue にアクセスしてしまう"> +<node CREATED="1274589342886" ID="Freemind_Link_374709913" MODIFIED="1274589363144" TEXT="とりあえず、dummy の task に wait for する"/> +<node CREATED="1274589365484" ID="Freemind_Link_664545631" MODIFIED="1274589401118" TEXT="dummy の task を TaskManagerImpl で実際の Task に書き直す"/> </node> </node> </node> -<node CREATED="1271152865996" ID="Freemind_Link_1369046890" MODIFIED="1271154765327" TEXT="ppu の multi threads 化"> -<icon BUILTIN="full-2"/> -<icon BUILTIN="ksmiletris"/> -<node CREATED="1271152923312" ID="Freemind_Link_751477936" MODIFIED="1271154172144" TEXT="ppu の fifo を synchronized queue に書き換える"/> -</node> -<node CREATED="1271153003844" ID="Freemind_Link_11749018" MODIFIED="1272359609370" TEXT="WordCount のネックの検証"> +<node CREATED="1271153003844" ID="Freemind_Link_11749018" MODIFIED="1274588839080" TEXT="WordCount のネックの検証"> <icon BUILTIN="ksmiletris"/> <icon BUILTIN="button_ok"/> <node CREATED="1271153026411" ID="Freemind_Link_245323343" MODIFIED="1271153038270" TEXT="おそらくmail がネック"> -<node CREATED="1271153052617" ID="Freemind_Link_1149688811" MODIFIED="1271153081388" TEXT="TaskArray を使う"/> +<node CREATED="1271153052617" ID="Freemind_Link_1149688811" MODIFIED="1271153081388" TEXT="TaskArray を使う"> +<node CREATED="1274589296144" ID="Freemind_Link_1285789074" MODIFIED="1274589304753" TEXT="ちゃんと早くなる"/> </node> -<node CREATED="1272359665972" ID="Freemind_Link_726453210" MODIFIED="1272359683624" TEXT="run16 バージョン"/> -<node CREATED="1272359696037" ID="Freemind_Link_1920589964" MODIFIED="1272359713399" TEXT="TaskArrayではないものの計測"/> +</node> +<node CREATED="1274588860001" ID="Freemind_Link_248066319" MODIFIED="1274588875979" TEXT="run16がまだ遅い"/> </node> <node CREATED="1271153108206" ID="Freemind_Link_164399149" MODIFIED="1271153120857" TEXT="sort"> <node CREATED="1271153121669" ID="Freemind_Link_618072996" MODIFIED="1271153131585" TEXT="buffer の swap"/> @@ -51,6 +89,7 @@ <node CREATED="1271153157556" ID="Freemind_Link_1374547416" MODIFIED="1271153271401" TEXT="pipeline 未実装"/> <node CREATED="1271153285333" ID="Freemind_Link_214169447" MODIFIED="1271154810421" TEXT="data segment の付加"> <icon BUILTIN="full-4"/> +<node CREATED="1274589620322" ID="Freemind_Link_768784354" MODIFIED="1274589620322" TEXT=""/> </node> <node CREATED="1271153410710" ID="Freemind_Link_285733382" MODIFIED="1271154693091" TEXT="task configuration"> <icon BUILTIN="full-1"/> @@ -64,7 +103,67 @@ </node> <node CREATED="1271152611017" ID="Freemind_Link_1716904506" MODIFIED="1271154668916" POSITION="right" TEXT="c"> <icon BUILTIN="full-1"/> -<node CREATED="1271153567589" ID="Freemind_Link_1467411845" MODIFIED="1271153602887" TEXT="data segment"/> +<node CREATED="1274589647087" ID="Freemind_Link_1711203047" MODIFIED="1274590187203" TEXT="data segment"> +<node CREATED="1274589663940" ID="Freemind_Link_1761381255" MODIFIED="1274589674103" TEXT="double linked list"/> +<node CREATED="1274589679195" ID="Freemind_Link_716452315" MODIFIED="1274602559867" TEXT="template で抽象化する"> +<icon BUILTIN="button_ok"/> +</node> +<node CREATED="1274589705349" ID="Freemind_Link_832842868" MODIFIED="1274602587441" TEXT="CPUごとに2の冪乗ごとのメモリプールで管理する"/> +<node CREATED="1274589739704" ID="Freemind_Link_206718102" MODIFIED="1274589760354" TEXT="Cerium 上のすべての object をこれで管理する"/> +<node CREATED="1274589761446" ID="Freemind_Link_182554869" MODIFIED="1274589772530" TEXT="malloc を追放する"/> +</node> +<node CREATED="1274589813524" ID="Freemind_Link_586150605" MODIFIED="1274589820551" TEXT="Scheduler"> +<node CREATED="1274589827947" ID="Freemind_Link_1419717866" MODIFIED="1274589836750" TEXT="conector"> +<node CREATED="1274589840322" ID="Freemind_Link_1088245803" MODIFIED="1274589849869" TEXT="dma"/> +<node CREATED="1274589850490" ID="Freemind_Link_369884542" MODIFIED="1274589854901" TEXT="mail"/> +</node> +<node CREATED="1274589865633" ID="Freemind_Link_211891458" MODIFIED="1274589869620" TEXT="Manager"> +<node CREATED="1274589873008" ID="Freemind_Link_268505657" MODIFIED="1274589880204" TEXT="createTask"/> +</node> +<node CREATED="1274589893039" ID="Freemind_Link_587727506" MODIFIED="1274589895499" TEXT="memory"> +<node CREATED="1274589904975" ID="Freemind_Link_965289748" MODIFIED="1274589908610" TEXT="memory pool"/> +<node CREATED="1274589910950" ID="Freemind_Link_578423126" MODIFIED="1274590840204" TEXT="get_segment/put_segment"/> +<node CREATED="1274590934078" ID="Freemind_Link_143382264" MODIFIED="1274590965424" TEXT="mainMemGet を廃止"/> +<node CREATED="1274590970972" ID="Freemind_Link_1136306406" MODIFIED="1274590999524" TEXT="その代わりにget_segment のオプション"> +<node CREATED="1274591004146" ID="Freemind_Link_1768521435" MODIFIED="1274591026932" TEXT="write back"> +<node CREATED="1274591080102" ID="Freemind_Link_1090183022" MODIFIED="1274591111872" TEXT="変更をmainmemory に書き戻す"/> +</node> +<node CREATED="1274591031697" ID="Freemind_Link_1603087582" MODIFIED="1274591064235" TEXT="create"> +<node CREATED="1274591116492" ID="Freemind_Link_307854380" MODIFIED="1274591136847" TEXT="新しくmemory を allocate"/> +<node CREATED="1274591140579" ID="Freemind_Link_1504695289" MODIFIED="1274591154135" TEXT="読み出しは行わない"/> +<node CREATED="1274591181001" ID="Freemind_Link_794364854" MODIFIED="1274591198083" TEXT="CPU ごとに前もって pool を割り当てる"/> +</node> +<node CREATED="1274591065575" ID="Freemind_Link_1910072627" MODIFIED="1274591074018" TEXT="read only"> +<node CREATED="1274591220334" ID="Freemind_Link_1059008005" MODIFIED="1274591225706" TEXT="書き込みを行わない"/> +</node> +</node> +<node CREATED="1274591251837" ID="Freemind_Link_430171688" MODIFIED="1274591351305" TEXT="set_inData、set_outData を使わずに get_segment を用いる"/> +<node CREATED="1274591366721" ID="Freemind_Link_1197326816" MODIFIED="1274591403984" TEXT="task の read buff、write buff は get_segment の集合になる"/> +</node> +<node CREATED="1274589942029" ID="Freemind_Link_1433001406" MODIFIED="1274589946856" TEXT="CPU"> +<node CREATED="1274589947596" ID="Freemind_Link_682604250" MODIFIED="1274589966263" TEXT="CPU ごとに Scheduler が存在する"/> +<node CREATED="1274589968071" ID="Freemind_Link_1380281338" MODIFIED="1274589994149" TEXT="conector と memory と Manager は SchedTask に渡す"/> +<node CREATED="1274590016681" ID="Freemind_Link_80180247" MODIFIED="1274590121501" TEXT="こうしないと API を変更する度に、
Scheduler と TaskManagerImpl と SchedTask を変更しないといけない"/> +</node> +</node> +<node CREATED="1274590223101" ID="Freemind_Link_1008928487" MODIFIED="1274590229233" TEXT="code segment"> +<node CREATED="1274590233461" ID="Freemind_Link_911750720" MODIFIED="1274590248855" TEXT="現状"> +<node CREATED="1274590250084" ID="Freemind_Link_1646689425" MODIFIED="1274590260735" TEXT="ppe 上の Task List"/> +<node CREATED="1274590266755" ID="Freemind_Link_1607174160" MODIFIED="1274590277006" TEXT="spe 上の Task List"/> +<node CREATED="1274590277538" ID="Freemind_Link_434593725" MODIFIED="1274590303464" TEXT="gcc の overlay table"/> +<node CREATED="1274590319280" ID="Freemind_Link_182869923" MODIFIED="1274590353362" TEXT="これだと Task の数に比例して Task List が大きくなってしまう"> +<node CREATED="1274590354958" ID="Freemind_Link_598814020" MODIFIED="1274590364501" TEXT="spe に収まりきらない"/> +</node> +<node CREATED="1274590367421" ID="Freemind_Link_1140067654" MODIFIED="1274590402015" TEXT="overlay があるので、どこで切られるか不明"/> +</node> +<node CREATED="1274590421469" ID="Freemind_Link_1440216976" MODIFIED="1274590426038" TEXT="解決"> +<node CREATED="1274590426970" ID="Freemind_Link_1282019170" MODIFIED="1274590448396" TEXT="Task List を main memory 上にただ一つにする"/> +<node CREATED="1274590455731" ID="Freemind_Link_1164092429" MODIFIED="1274590513145" TEXT="Task List に architecture ごとの code を入れる。"/> +<node CREATED="1274590477575" ID="Freemind_Link_1673350057" MODIFIED="1274590505702" TEXT="code は ld を使って一つの object に完結させる"/> +<node CREATED="1274590519829" ID="Freemind_Link_1325862525" MODIFIED="1274590558391" TEXT="Task List を getSegment を使ってキャッシュする"/> +<node CREATED="1274590587801" ID="Freemind_Link_1691372243" MODIFIED="1274590595900" TEXT="overlay を使わない"/> +</node> +</node> </node> <node CREATED="1271153725261" ID="Freemind_Link_1021236986" MODIFIED="1271154721545" POSITION="left" TEXT="SceneGraph"> <icon BUILTIN="full-2"/> @@ -72,6 +171,7 @@ <icon BUILTIN="full-3"/> <node CREATED="1271153732060" ID="Freemind_Link_1208701551" MODIFIED="1271153747479" TEXT="super dandy"> <node CREATED="1271153867093" ID="Freemind_Link_933024710" MODIFIED="1271154718432" TEXT="scale"/> +<node CREATED="1274590639383" ID="Freemind_Link_1328300488" MODIFIED="1274590660969" TEXT="とりあえずFifoManager で動かす"/> </node> <node CREATED="1271153855085" ID="Freemind_Link_443719007" MODIFIED="1271153859665" TEXT="chain"> <node CREATED="1271153871244" ID="Freemind_Link_71013239" MODIFIED="1271153873224" TEXT="speed"/>
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Tue May 25 19:14:44 2010 +0900 @@ -161,16 +161,29 @@ // MY_SPE_COMMAND_MALLOC SPE からのmain memory request send_alloc_reply(this, id, speThreads); } else if (data > (memaddr)MY_SPE_NOP) { +#ifdef TASK_LIST_MAIL + TaskListPtr list = (TaskListPtr)data; + check_task_list_finish(schedTaskManager, list, waitTaskQueue); +#else // 終了したタスク(PPEにあるのでアドレス) HTaskPtr task = (HTaskPtr)data; task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); - check_task_finish(task,waitTaskQueue); + check_task_finish(task, waitTaskQueue); +#endif } // MY_SPE_NOP: 特に意味のないコマンド } } } +void +CellTaskManagerImpl::polling() +{ + // may call recursively check_task_list_finish() + // we need fifo here + mail_check(); +} + static void send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads) {
--- a/TaskManager/Cell/CellTaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -30,6 +30,7 @@ void append_activeTask(HTaskPtr); void show_profile() ; void start_profile() ; + void polling(); private: void send_taskList(int id);
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -25,7 +25,7 @@ void set_task_depend(HTaskPtr master, HTaskPtr slave); void spawn_task(HTaskPtr); void set_task_cpu(HTaskPtr, CPU_TYPE); - + void polling() {} };
--- a/TaskManager/ChangeLog Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/ChangeLog Tue May 25 19:14:44 2010 +0900 @@ -1,3 +1,12 @@ +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 すれば良い。 + 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp> CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue May 25 19:14:44 2010 +0900 @@ -40,6 +40,7 @@ ppeTaskList = new TaskListInfo; schedTaskManager = new SchedTask(); + others = 0; schedTaskManager->init(0,0,0,mainScheduler); } @@ -66,6 +67,7 @@ ppeTaskList = new TaskListInfo; schedTaskManager = new SchedTask(); + others = tm; schedTaskManager->init(0,0,0,mainScheduler); } @@ -168,14 +170,24 @@ __debug_ppe("mail_check(): recv from 0x%x\n", data); // post_func を先に実行しないと、systask_finish が active_queue // 移されてから、wait_for されるという事態が起きることがある。 +#ifdef TASK_LIST_MAIL + TaskListPtr list = (TaskListPtr)data; + check_task_list_finish(schedTaskManager, list, waitTaskQueue); +#else HTaskPtr task = (HTaskPtr)data; task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); check_task_finish(task, waitTaskQueue); +#endif } } } - +void +FifoTaskManagerImpl::polling() +{ + if (others!=0) + others->polling(); +} /** * # # # # # # # #
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -27,6 +27,7 @@ void run(); void show_profile() {}; void start_profile() {}; + void polling(); void mail_check();
--- a/TaskManager/Makefile.def Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Makefile.def Tue May 25 19:14:44 2010 +0900 @@ -30,7 +30,7 @@ ABIBIT = 32 # OPT = -O9 -OPT = -g +OPT = -g -DTASK_LIST_MAIL CC = g++ CFLAGS = -Wall `sdl-config --cflags` -m$(ABIBIT) $(OPT)
--- a/TaskManager/kernel/ppe/TaskList.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskList.h Tue May 25 19:14:44 2010 +0900 @@ -17,7 +17,7 @@ TaskList *waiter; // 4 byte SimpleTask tasks[TASK_MAX_SIZE]; // 24*TASK_MAX_SIZE - void init() { length = 0; } + void init() { length = 0; waiter=this; } }; typedef TaskList* TaskListPtr;
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue May 25 19:14:44 2010 +0900 @@ -18,7 +18,7 @@ } TaskManagerImpl::TaskManagerImpl(int num) - : machineNum(num) { + : machineNum(num){ activeTaskQueue = new HTaskInfo(); waitTaskQueue = new HTaskInfo(); htaskImpl = waitTaskQueue ; // any HTaskInfo @@ -143,7 +143,7 @@ } /** - * 終了したタスクから依存の処理とか + * @brief 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 * * @param [task] 終了したタスク @@ -171,13 +171,45 @@ htaskImpl->free_(me); } +/** + * @brief 終了したタスクリストの依存の処理 + * @param [task] 終了したタスク + */ +void +TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, HTaskInfo *wait_queue) +{ + for(int i = 0;i<list->length;i++) { + SimpleTaskPtr task = &list->tasks[i]; + HTask *me = (HTask*)task->self; + me->post_func(s, me->post_arg1, me->post_arg2); + if (task->command==TaskArray1) { + int next = ((task->r_size)/sizeof(SimpleTask))+1; + // assert(next<list->length); + i+=next; + } + s->polling(); + check_task_finish(me, wait_queue); + } +} +/** + * @brief waitTaskqueue への挿入 。必須ではない。 + * 現状では、dead lock 検出にしか使ってない + * + * @param [task] 終了したタスク + */ void TaskManagerImpl::append_waitTask(HTaskPtr q) { waitTaskQueue ->addLast(q); } +/** + @brief htask を DMA でCPUに渡すための TaskList に入れる (copy) + @param htask + @param taskList + TaskList は自動的に延長される + */ void TaskManagerImpl::set_taskList(HTaskPtr htask, TaskListInfoPtr taskList) { TaskListPtr list ; @@ -204,7 +236,7 @@ } memcpy(array, htask->rbuf, htask->r_size); free(htask->rbuf); - htask->rbuf = 0; htask->r_size = 0; + // htask->rbuf = 0; htask->r_size = 0; we need this... *task = *(SimpleTask*)htask; } else { *task = *(SimpleTask*)htask;
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -23,6 +23,7 @@ SchedTask *schedTaskManager; Scheduler *scheduler; + TaskManagerImpl *others; /* constructor */ TaskManagerImpl(int num = 1) ; @@ -37,8 +38,10 @@ virtual void show_profile() = 0; virtual void append_activeTask(HTaskPtr); virtual void append_waitTask(HTaskPtr); + virtual void polling() = 0; void check_task_finish(HTaskPtr task, HTaskInfo *wait_queue); + void check_task_list_finish(SchedTask *s, TaskListPtr list, HTaskInfo *wait_queue); void systask_init();
--- a/TaskManager/kernel/schedule/SchedTask.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Tue May 25 19:14:44 2010 +0900 @@ -102,8 +102,9 @@ scheduler->dma_wait(DMA_WRITE); free(writebuf); - +#ifndef TASK_LIST_MAIL scheduler->mail_write((memaddr)task->self); +#endif } SchedTaskBase* @@ -131,6 +132,9 @@ } return nextSched; } else { +#ifdef TASK_LIST_MAIL + scheduler->mail_write((memaddr)list->waiter); +#endif memaddr nextList = (memaddr)list->next; if (nextList == 0) { // もう何もする必要がない @@ -293,6 +297,11 @@ return manager->allocate(size,align) ; } +void SchedTask::polling() +{ + manager->polling(); +} + Scheduler* SchedTask::get_scheduler() { return scheduler;
--- a/TaskManager/kernel/schedule/SchedTask.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Tue May 25 19:14:44 2010 +0900 @@ -71,6 +71,8 @@ void *allocate(int size); void free_(void *p) ; + void polling(); + /* これは禁止するべき */ void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask); void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask);
--- a/TaskManager/kernel/schedule/SchedTaskArray.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Tue May 25 19:14:44 2010 +0900 @@ -162,15 +162,6 @@ //1ステージを稼ぐ必要がある return new SchedTaskArrayNop(scheduler, savedTask, next, array); -#if 0 - // このTaskArrayは終り。save していた Task の次を返す。 - // savedTask の read/exec は実行されない (command = TaskArray) - SchedTaskBase *n = savedTask->next(scheduler, savedTask); - scheduler->mail_write((memaddr)savedTask->task->self); - free(array); - delete savedTask; - return n; -#endif } }
--- a/TaskManager/kernel/schedule/SchedTaskArrayNop.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArrayNop.cc Tue May 25 19:14:44 2010 +0900 @@ -54,8 +54,9 @@ void SchedTaskArrayNop::write() { - +#ifndef TASK_LIST_MAIL scheduler->mail_write((memaddr)params_addr); +#endif free(atask); }