view 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 source

<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>