Mercurial > hg > Papers > 2010 > program-symposium
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->exec() で実行するのでは、それと衝突してしまう。 +<p> + +<hr> +<h2><a name="content003">Task ArrayとSimple Task</a></h2> +Pipe-line を乱さないように、実行を切替える必要がある。そこで、SchedTaskArrayLoad / SchedTaskArray の二つにわけで、SchedTaskArrayLoad->next() で、次のSchedTaskを返さず、もう一つ作った、SchedTaskArray を返す。 +<p> + +<pre> + SchedTaskArrayLoad + Task Array のloadと、pile-line clear + SchedTaskArray + Task Array の実行 + +</pre> +SchedTaskArray で次に実行する Task Array がなくなれば、save していた SimpleTask->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->create_task_array( + Twice,count,data_count+1,data_count,data_count); + t = 0; + for(int i = 0;i<count;i++) { + t = twice_main->next_task_array(Twice, t); + for(int j = 0;j<data_count;j++) { + t->set_param(j, (memaddr)length2); + t->set_inData(j,data, sizeof(int)*length2); + t->set_outData(j,data, sizeof(int)*length2); + } + } + twice_main->spawn_task_array(t->next()); + twice_main->set_cpu(SPE_ANY); + twice_main->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>