Mercurial > hg > Game > Cerium
changeset 638:250c7353ddaf draft
hmmmm
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Thu Nov 19 11:13:42 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Thu Nov 19 18:18:20 2009 +0900 @@ -55,7 +55,6 @@ ppeManager = new FifoTaskManagerImpl(machineNum); // 大半のTaskQueueInfoは、共有される MainScheduler *mscheduler = new MainScheduler; - set_scheduler((Scheduler*)mscheduler); ppeManager->init(mscheduler, this); ppeManager->get_scheduler()->set_manager(this);
--- a/TaskManager/ChangeLog Thu Nov 19 11:13:42 2009 +0900 +++ b/TaskManager/ChangeLog Thu Nov 19 18:18:20 2009 +0900 @@ -17,6 +17,13 @@ なんだが、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>
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Thu Nov 19 11:13:42 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Thu Nov 19 18:18:20 2009 +0900 @@ -156,22 +156,24 @@ MailQueuePtr FifoTaskManagerImpl::schedule(TaskListPtr list) { - MailQueuePtr list_mail; // task list - MailQueuePtr sentinel; // 番兵 - MailQueuePtr in_mail_list = NULL; MailQueuePtr out_mail_list = NULL; + if (list) { + MailQueuePtr list_mail; // task list + MailQueuePtr sentinel; // 番兵 + MailQueuePtr in_mail_list = NULL; - // TaskList のアドレス - list_mail = mailManager->create((memaddr)list); - in_mail_list = MailManager::append_mailQueue(in_mail_list, list_mail); + // TaskList のアドレス + list_mail = mailManager->create((memaddr)list); + in_mail_list = MailManager::append_mailQueue(in_mail_list, list_mail); - // EXIT_COMMAND (番兵的な意味で) - sentinel = mailManager->create((memaddr)MY_SPE_COMMAND_EXIT); - in_mail_list = MailManager::append_mailQueue(in_mail_list, sentinel); + // EXIT_COMMAND (番兵的な意味で) + sentinel = mailManager->create((memaddr)MY_SPE_COMMAND_EXIT); + in_mail_list = MailManager::append_mailQueue(in_mail_list, sentinel); - // scheduler は受け取ったメールを元に実行する - scheduler->send_mailList(in_mail_list); - scheduler->run(); + // scheduler は受け取ったメールを元に実行する + scheduler->send_mailList(in_mail_list); + scheduler->run(); + } out_mail_list = scheduler->recv_mailList(); return out_mail_list;
--- a/example/Simple/README Thu Nov 19 11:13:42 2009 +0900 +++ b/example/Simple/README Thu Nov 19 18:18:20 2009 +0900 @@ -2,57 +2,57 @@ * $Id: README,v 1.5 2008/10/20 10:02:01 gongo Exp $ */ -- +- 概要 -int ꡢ(Twice) ǡǤ2ܤˤ֤ޤ +int の配列を送り、タスク(Twice) で、配列の要素を2倍にして送り返します。 -PPE->SPE DMA ž main.cc twice_init -ƤΤǤ狼äƤ館뤫ʤȿơ¦ -Υǡμ롣 +PPE->SPE の DMA 転送は main.cc の twice_init に +書いてるのでわかってもらえるかなと信じて、タスク側で +そのデータの受け取り方を説明する。 ------------------------------------- -PPE Ƥǡμ +PPE から送られてきたデータの受け取り ------------------------------------- -void *get_input(void *p, int index) Ȥ +void *get_input(void *p, int index) を使う。 -p ˤ rbuf ޤΤȤʤΤǤ虜虜ɬפ̵ -index ϡcreate task add_inData Ȼפɡν֤ˤʤޤ +p には rbuf が入ります。今のところ確定なのでわざわざ書かせる必要も無いか。。。 +index は、create task 時に add_inData したと思うけど、その順番になります。 add_inData(data1, size1); add_inData(data2, size2); -ν֤ǵҤ硢 +の順番で記述した場合、 data1 = get_input(rbuf, 0); data2 = get_input(rbuf, 0); -Ǽޤ +で取れます。 ------------------------------------- -PPE إǡ +PPE へデータを送る ------------------------------------- -void *get_output(void *p, int index) Ȥ +void *get_output(void *p, int index) を使う。 -p wbuf, index input ƱǤǤ -get_output ǼäΰǥǡС -Υλˡadd_outData ǻꤷɥ쥹˽ޤޤ +p は wbuf, index は input と同じ感じでいいです。 +get_output で受け取った領域でデータを書けば、 +このタスクが終了した後に、add_outData で指定したアドレスに書き込まれます。 -- ¹ˡ +- 実行方法 ./twice [-cpu spe_num] [-length data_length] - -cpu Ѥ SPU ο - // Ϥޤ̵̣ץǤ - // ξ硢ʣ˿ʬƤ줾 2 ܤäƤ - // а̣ΤΤˤʤޤï(ry + -cpu 使用する SPU の数 + // 今回はあまり意味の無いオプションです。 + // 巨大な配列の場合、複数に振り分けてそれぞれで 2 倍させるっていう + // 処理を入れれば意味のあるものになります。誰か(ry - -length Ǥο + -length 配列の要素の数 -- ¹ +- 実行例 % ./twice before --- @@ -71,17 +71,17 @@ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 zsh: bus error ./twice -length 15 -ξ硢PS3(SPEȤä)Ǥ bus error Фޤ -ͳ length ˤäơǡΥХȿ -4Х(int) x 15 = 60 Х Ǥ -PPE <-> SPE Ǥ DMA žΥ -1,2,4,8Х, ⤷ 16ХܿȷޤäƤޤ -Υ˸꤬硢Τ褦 bus error Фޤ -դξܤͤϡ +上の場合、PS3上(SPE使った場合)では bus error が出ます。 +この理由は length にあって、送るデータのバイト数が +4バイト(int) x 15 = 60 バイト だからです。 +PPE <-> SPE での DMA 転送のサイズは +1,2,4,8バイト, もしくは 16バイト倍数と決まっています。 +このサイズに誤りがある場合、上のように bus error が出ます。 +この辺の詳しい仕様は、 -Game_project/ps3/docs ˤ PDF +Game_project/ps3/docs にある PDF や -Fixstars Υ -http://cell.fixstars.com/ps3linux/index.php/3.3DMAžˤǡμϤ +Fixstars のサイト +http://cell.fixstars.com/ps3linux/index.php/3.3 DMA転送によるデータの受け渡し -ȤФ狼Ȼפޤ +とか見ればわかると思います
--- a/example/basic/README Thu Nov 19 11:13:42 2009 +0900 +++ b/example/basic/README Thu Nov 19 18:18:20 2009 +0900 @@ -2,57 +2,57 @@ * $Id: README,v 1.5 2008/10/20 10:02:01 gongo Exp $ */ -- +- 概要 -int ꡢ(Twice) ǡǤ2ܤˤ֤ޤ +int の配列を送り、タスク(Twice) で、配列の要素を2倍にして送り返します。 -PPE->SPE DMA ž main.cc twice_init -ƤΤǤ狼äƤ館뤫ʤȿơ¦ -Υǡμ롣 +PPE->SPE の DMA 転送は main.cc の twice_init に +書いてるのでわかってもらえるかなと信じて、タスク側で +そのデータの受け取り方を説明する。 ------------------------------------- -PPE Ƥǡμ +PPE から送られてきたデータの受け取り ------------------------------------- -void *get_input(void *p, int index) Ȥ +void *get_input(void *p, int index) を使う。 -p ˤ rbuf ޤΤȤʤΤǤ虜虜ɬפ̵ -index ϡcreate task add_inData Ȼפɡν֤ˤʤޤ +p には rbuf が入ります。今のところ確定なのでわざわざ書かせる必要も無いか。。。 +index は、create task 時に add_inData したと思うけど、その順番になります。 add_inData(data1, size1); add_inData(data2, size2); -ν֤ǵҤ硢 +の順番で記述した場合、 data1 = get_input(rbuf, 0); data2 = get_input(rbuf, 0); -Ǽޤ +で取れます。 ------------------------------------- -PPE إǡ +PPE へデータを送る ------------------------------------- -void *get_output(void *p, int index) Ȥ +void *get_output(void *p, int index) を使う。 -p wbuf, index input ƱǤǤ -get_output ǼäΰǥǡС -Υλˡadd_outData ǻꤷɥ쥹˽ޤޤ +p は wbuf, index は input と同じ感じでいいです。 +get_output で受け取った領域でデータを書けば、 +このタスクが終了した後に、add_outData で指定したアドレスに書き込まれます。 -- ¹ˡ +- 実行方法 ./twice [-cpu spe_num] [-length data_length] - -cpu Ѥ SPU ο - // Ϥޤ̵̣ץǤ - // ξ硢ʣ˿ʬƤ줾 2 ܤäƤ - // а̣ΤΤˤʤޤï(ry + -cpu 使用する SPU の数 + // 今回はあまり意味の無いオプションです。 + // 巨大な配列の場合、複数に振り分けてそれぞれで 2 倍させるっていう + // 処理を入れれば意味のあるものになります。誰か(ry - -length Ǥο + -length 配列の要素の数 -- ¹ +- 実行例 % ./twice before --- @@ -71,17 +71,17 @@ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 zsh: bus error ./twice -length 15 -ξ硢PS3(SPEȤä)Ǥ bus error Фޤ -ͳ length ˤäơǡΥХȿ -4Х(int) x 15 = 60 Х Ǥ -PPE <-> SPE Ǥ DMA žΥ -1,2,4,8Х, ⤷ 16ХܿȷޤäƤޤ -Υ˸꤬硢Τ褦 bus error Фޤ -դξܤͤϡ +上の場合、PS3上(SPE使った場合)では bus error が出ます。 +この理由は length にあって、送るデータのバイト数が +4バイト(int) x 15 = 60 バイト だからです。 +PPE <-> SPE での DMA 転送のサイズは +1,2,4,8バイト, もしくは 16バイト倍数と決まっています。 +このサイズに誤りがある場合、上のように bus error が出ます。 +この辺の詳しい仕様は、 -Game_project/ps3/docs ˤ PDF +Game_project/ps3/docs にある PDF や -Fixstars Υ -http://cell.fixstars.com/ps3linux/index.php/3.3DMAžˤǡμϤ +Fixstars のサイト +http://cell.fixstars.com/ps3linux/index.php/3.3 DMA転送によるデータの受け渡し -ȤФ狼Ȼפޤ +とか見ればわかると思います