comparison task_array.html @ 0:a9fda18657b3 default tip

add
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 16 Dec 2009 10:05:04 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:a9fda18657b3
1 <html>
2 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
3 <head>
4 <title>Task Array in Cerium</title>
5 </head>
6 <body>
7 <h1>Task Array in Cerium</h1>
8 <a href=#content>content</a><br>
9 <nr>
10
11 <p>
12
13 <hr>
14 <h2><a name="content000">従来のTaskの問題点</a></h2>
15
16 <pre>
17 単純なデータ転送でも、List DMAデータを構築
18 Param/List DMA は「8個まで」
19 一つ一つのTaskがPPEに終了を通知。
20
21 </pre>
22 Task終了時にPPCがメールを受け取るのを待ってしまう。
23 <p>
24 8個はひどいだろう? 1個でも8個転送しているので、SPE
25 に送る TaskList が大きい。
26 <p>
27 実装が複雑。
28 <p>
29
30 <hr>
31 <h2><a name="content001">Simple Task</a></h2>
32 HTask の同期機能だけを持ち、単純転送の機能だけを持つTask。
33 <p>
34 今までのCeriumのTaskから、
35 <p>
36
37 <pre>
38 RnewTask
39 ListDMA
40
41 </pre>
42 の機能を削除することにより実現。Task List が単純になる。
43 <p>
44 <center><img src="fig/simple-pipeline.jpg"></center>
45 <p>
46
47 <hr>
48 <h2><a name="content002">Task Array</a></h2>
49
50 <pre>
51 可変長のParam/inData/outData
52 Taskの終了を通知しない
53 全部のタスクが終了した時にPPEに通知
54 Simple Task を使って、Task Array List を転送
55
56 </pre>
57 実装が容易。Simple Taskを複雑にしない。
58 <p>
59 <center><img src="fig/TaskArrayList.png"></center>
60 <p>
61
62 <pre>
63 Task 可変長Param, List DMAを持つ
64
65 </pre>
66 しかし、単純にSimple Taskとして実行は出来ない。
67 <p>
68 <center><img src="fig/TaskArray-bad.jpg"></center>
69 <p>
70 次の Simple Task (おそらくは別な TaskArray )が既に、read に入っているので、SchedTaskArray-&gt;exec() で実行するのでは、それと衝突してしまう。
71 <p>
72
73 <hr>
74 <h2><a name="content003">Task ArrayとSimple Task</a></h2>
75 Pipe-line を乱さないように、実行を切替える必要がある。そこで、SchedTaskArrayLoad / SchedTaskArray の二つにわけで、SchedTaskArrayLoad-&gt;next() で、次のSchedTaskを返さず、もう一つ作った、SchedTaskArray を返す。
76 <p>
77
78 <pre>
79 SchedTaskArrayLoad
80 Task Array のloadと、pile-line clear
81 SchedTaskArray
82 Task Array の実行
83
84 </pre>
85 SchedTaskArray で次に実行する Task Array がなくなれば、save していた SimpleTask-&gt;next() を返す。
86 <p>
87 これは、TaskArray という SimpleTask で実行される。(実体はない)
88 <p>
89 <center><img src="fig/TaskArray.jpg"></center>
90 <p>
91
92 <hr>
93 <h2><a name="content004">API</a></h2>
94 create_task_arrayで、param/inData/outData の数を指定する。全部同じparam/inData/outData の数なのは、allocate のsizeを計算するため。
95 <p>
96 全部可変にして、後でsizeを指定しても良い。そういうAPIを用意することも可能。 でも、そんなの使うの?
97 <p>
98 HTask の方で array_task を生成。これは、create_array_task
99 で allocate した rbuf 上に生成する。最後に、大きさがあっているかどうかを、task_array_spawn() で調べている。
100 <p>
101 本来は、HTaskArray を作って、array_task ではない場合には、APIを生成出来ないようにするべきだろう... (field は同じ)でも、そうすると、またvirtualになる...
102 <p>
103 最後に、create_task_array がSimpleTaskなので、それをspawn() する。
104 <p>
105
106 <pre>
107 HTask *twice_main = manager-&gt;create_task_array(
108 Twice,count,data_count+1,data_count,data_count);
109 t = 0;
110 for(int i = 0;i&lt;count;i++) {
111 t = twice_main-&gt;next_task_array(Twice, t);
112 for(int j = 0;j&lt;data_count;j++) {
113 t-&gt;set_param(j, (memaddr)length2);
114 t-&gt;set_inData(j,data, sizeof(int)*length2);
115 t-&gt;set_outData(j,data, sizeof(int)*length2);
116 }
117 }
118 twice_main-&gt;spawn_task_array(t-&gt;next());
119 twice_main-&gt;set_cpu(SPE_ANY);
120 twice_main-&gt;spawn();
121
122 </pre>
123
124 <hr>
125 <h2><a name="content005">従来の Task との互換性</a></h2>
126
127 <p>
128 可変長Task を従来の TaskList に埋め込むことで、従来の8個 Param, List DMA Task との互換性を取る。
129 <p>
130 TaskList に8個のParamを埋め込んだのと同等。TaskList の大きさを十分に取れば、従来と同等。
131 <p>
132 これは、TaskArray1 という SimpleTask で実行される。(実体はない)
133 <p>
134 pipe-line の乱れもない。
135 <p>
136 従来のコードは、SIMPLE_TASK で切替え。(そのうち削除?)
137 <p>
138
139 <h2><a name="content">Content</h2>
140 <ol>
141 <li><a href="#content000"> 従来のTaskの問題点</a>
142 <li><a href="#content001"> Simple Task</a>
143 <li><a href="#content002"> Task Array</a>
144 <li><a href="#content003"> Task ArrayとSimple Task</a>
145 <li><a href="#content004"> API</a>
146 <li><a href="#content005"> 従来の Task との互換性</a>
147 </ol>
148
149 </body></html>