Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Cell/spe/CellScheduler.cc @ 496:58240647b23b
PS3 double linked TaskQueue worked.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 10 Oct 2009 20:32:55 +0900 |
parents | 7cd207691af1 |
children | ab866bc8a624 |
rev | line source |
---|---|
109 | 1 #include <stdio.h> |
59 | 2 #include <malloc.h> |
3 #include "CellScheduler.h" | |
4 #include "CellDmaManager.h" | |
5 #include "error.h" | |
6 | |
321 | 7 // ユーザプログラムで定義 |
8 // なんだけど、それは微妙じゃね? | |
430
fb62b7acc92b
code loading (on going...)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
388
diff
changeset
|
9 extern void task_init(Scheduler *scheduler); |
88 | 10 |
59 | 11 void |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
12 CellScheduler::init_impl() |
59 | 13 { |
14 connector = new CellDmaManager; | |
15 | |
109 | 16 mainMemNum = 0; |
88 | 17 |
430
fb62b7acc92b
code loading (on going...)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
388
diff
changeset
|
18 task_init(this); // PPE側ではUser 側で既に呼んでいる... |
321 | 19 // SPE側はここで呼び出す必要がある |
20 // Fifo ではSPEは無いので呼び出されない | |
59 | 21 } |
98 | 22 |
23 void* | |
109 | 24 CellScheduler::allocate(int size) |
25 { | |
26 return memalign(DEFAULT_ALIGNMENT, size); | |
98 | 27 } |
28 | |
109 | 29 /** |
321 | 30 * メインメモリ領域を allocate する。 |
31 * allocate した領域のアドレスは mainMem_get で取得するが、 | |
32 * mainMem_get を実行できるのは | |
33 * Renew Task (タスク内で create した Task) から。 | |
34 * alloc してすぐ get しても、アドレス何も入ってないです。 | |
109 | 35 */ |
36 void | |
37 CellScheduler::mainMem_alloc(int id, int size) | |
38 { | |
39 mainMemList[id] = NULL; | |
40 | |
41 mainMemNum++; | |
42 mail_write(MY_SPE_COMMAND_MALLOC); | |
43 mail_write(id); | |
44 mail_write(size); | |
98 | 45 } |
109 | 46 |
47 void | |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
48 CellScheduler::mainMem_wait() |
109 | 49 { |
50 uint32 id; | |
51 uint32 addr; | |
52 | |
141 | 53 while (mainMemNum > 0) { |
109 | 54 id = mail_read(); |
55 addr = mail_read(); | |
56 | |
57 mainMemList[id] = (void*)addr; | |
58 mainMemNum--; | |
141 | 59 } |
109 | 60 } |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
61 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
62 /* |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
63 dma channel を返す |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
64 本来、SPU用に閉じているはず。ユーザが明示的に使うことはない。 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
65 良くわからないが、ある分だけcounterで廻せば良い。しかし、 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
66 そのためには、全部で、get_tag()する必要があるはず。 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
67 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
68 */ |
451
95dbf6bd8cd9
tag fixed... test_nogl move
kazz@henri.cr.ie.u-ryukyu.ac.jp
parents:
442
diff
changeset
|
69 |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
70 #define TEX_LOAD1 0 |
491 | 71 // #define TEX_LOAD2 1 |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
72 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
73 uint32 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
74 CellScheduler::get_tag() |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
75 { |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
76 static int count = 0; |
491 | 77 // int i = (count++ % 2); |
78 // return TEX_LOAD1*i + TEX_LOAD2*(1-i); | |
79 // 0,1,2,3 | |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
491
diff
changeset
|
80 return TEX_LOAD1+(count++ % 2); |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
81 } |
451
95dbf6bd8cd9
tag fixed... test_nogl move
kazz@henri.cr.ie.u-ryukyu.ac.jp
parents:
442
diff
changeset
|
82 |
388
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
83 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
84 |
82cb9368e3ff
MemHash (OS X version)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
356
diff
changeset
|
85 /* end */ |