Mercurial > hg > Papers > 2010 > program-symposium
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->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>