diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/task_array.html	Wed Dec 16 10:05:04 2009 +0900
@@ -0,0 +1,149 @@
+<html>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+<head>
+<title>Task Array in Cerium</title>
+</head>
+<body>
+<h1>Task Array in Cerium</h1>
+<a href=#content>content</a><br>
+<nr>
+
+<p>
+
+<hr>
+<h2><a name="content000">従来のTaskの問題点</a></h2>
+
+<pre>
+    単純なデータ転送でも、List DMAデータを構築
+    Param/List DMA は「8個まで」
+    一つ一つのTaskがPPEに終了を通知。
+
+</pre>
+Task終了時にPPCがメールを受け取るのを待ってしまう。
+<p>
+8個はひどいだろう? 1個でも8個転送しているので、SPE
+に送る TaskList が大きい。
+<p>
+実装が複雑。
+<p>
+
+<hr>
+<h2><a name="content001">Simple Task</a></h2>
+HTask の同期機能だけを持ち、単純転送の機能だけを持つTask。
+<p>
+今までのCeriumのTaskから、
+<p>
+
+<pre>
+    RnewTask
+    ListDMA
+
+</pre>
+の機能を削除することにより実現。Task List が単純になる。
+<p>
+<center><img src="fig/simple-pipeline.jpg"></center>
+<p>
+
+<hr>
+<h2><a name="content002">Task Array</a></h2>
+
+<pre>
+    可変長のParam/inData/outData
+    Taskの終了を通知しない
+    全部のタスクが終了した時にPPEに通知
+    Simple Task を使って、Task Array List を転送
+
+</pre>
+実装が容易。Simple Taskを複雑にしない。
+<p>
+<center><img src="fig/TaskArrayList.png"></center>
+<p>
+
+<pre>
+    Task 可変長Param,  List DMAを持つ
+
+</pre>
+しかし、単純にSimple Taskとして実行は出来ない。
+<p>
+<center><img src="fig/TaskArray-bad.jpg"></center>
+<p>
+次の Simple Task (おそらくは別な TaskArray )が既に、read に入っているので、SchedTaskArray-&gt;exec() で実行するのでは、それと衝突してしまう。
+<p>
+
+<hr>
+<h2><a name="content003">Task ArrayとSimple Task</a></h2>
+Pipe-line を乱さないように、実行を切替える必要がある。そこで、SchedTaskArrayLoad / SchedTaskArray の二つにわけで、SchedTaskArrayLoad-&gt;next() で、次のSchedTaskを返さず、もう一つ作った、SchedTaskArray を返す。
+<p>
+
+<pre>
+    SchedTaskArrayLoad  
+       Task Array のloadと、pile-line clear
+    SchedTaskArray
+       Task Array の実行
+
+</pre>
+SchedTaskArray で次に実行する Task Array がなくなれば、save していた SimpleTask-&gt;next() を返す。
+<p>
+これは、TaskArray という SimpleTask で実行される。(実体はない)
+<p>
+<center><img src="fig/TaskArray.jpg"></center>
+<p>
+
+<hr>
+<h2><a name="content004">API</a></h2>
+create_task_arrayで、param/inData/outData の数を指定する。全部同じparam/inData/outData の数なのは、allocate のsizeを計算するため。
+<p>
+全部可変にして、後でsizeを指定しても良い。そういうAPIを用意することも可能。 でも、そんなの使うの?
+<p>
+HTask の方で array_task を生成。これは、create_array_task
+で allocate した rbuf 上に生成する。最後に、大きさがあっているかどうかを、task_array_spawn() で調べている。
+<p>
+本来は、HTaskArray を作って、array_task ではない場合には、APIを生成出来ないようにするべきだろう... (field は同じ)でも、そうすると、またvirtualになる...
+<p>
+最後に、create_task_array がSimpleTaskなので、それをspawn() する。
+<p>
+
+<pre>
+    HTask *twice_main = manager-&gt;create_task_array(
+           Twice,count,data_count+1,data_count,data_count);
+    t = 0;
+    for(int i = 0;i&lt;count;i++) {
+	t = twice_main-&gt;next_task_array(Twice, t);
+	for(int j = 0;j&lt;data_count;j++) {
+	    t-&gt;set_param(j, (memaddr)length2);
+	    t-&gt;set_inData(j,data, sizeof(int)*length2);
+	    t-&gt;set_outData(j,data, sizeof(int)*length2);
+	}
+    }
+    twice_main-&gt;spawn_task_array(t-&gt;next());
+    twice_main-&gt;set_cpu(SPE_ANY);
+    twice_main-&gt;spawn();    
+
+</pre>
+
+<hr>
+<h2><a name="content005">従来の Task との互換性</a></h2>
+
+<p>
+可変長Task を従来の TaskList に埋め込むことで、従来の8個 Param, List DMA Task との互換性を取る。
+<p>
+TaskList に8個のParamを埋め込んだのと同等。TaskList の大きさを十分に取れば、従来と同等。
+<p>
+これは、TaskArray1 という SimpleTask で実行される。(実体はない)
+<p>
+pipe-line の乱れもない。
+<p>
+従来のコードは、SIMPLE_TASK で切替え。(そのうち削除?)
+<p>
+
+<h2><a name="content">Content</h2>
+<ol>
+<li><a href="#content000">  従来のTaskの問題点</a>
+<li><a href="#content001">  Simple Task</a>
+<li><a href="#content002">  Task Array</a>
+<li><a href="#content003">  Task ArrayとSimple Task</a>
+<li><a href="#content004">  API</a>
+<li><a href="#content005">  従来の Task との互換性</a>
+</ol>
+
+</body></html>