Task Array in Cerium

content


従来のTaskの問題点

    単純なデータ転送でも、List DMAデータを構築
    Param/List DMA は「8個まで」
    一つ一つのTaskがPPEに終了を通知。

Task終了時にPPCがメールを受け取るのを待ってしまう。

8個はひどいだろう? 1個でも8個転送しているので、SPE に送る TaskList が大きい。

実装が複雑。


Simple Task

HTask の同期機能だけを持ち、単純転送の機能だけを持つTask。

今までのCeriumのTaskから、

    RnewTask
    ListDMA

の機能を削除することにより実現。Task List が単純になる。


Task Array

    可変長のParam/inData/outData
    Taskの終了を通知しない
    全部のタスクが終了した時にPPEに通知
    Simple Task を使って、Task Array List を転送

実装が容易。Simple Taskを複雑にしない。

    Task 可変長Param,  List DMAを持つ

しかし、単純にSimple Taskとして実行は出来ない。

次の Simple Task (おそらくは別な TaskArray )が既に、read に入っているので、SchedTaskArray->exec() で実行するのでは、それと衝突してしまう。


Task ArrayとSimple Task

Pipe-line を乱さないように、実行を切替える必要がある。そこで、SchedTaskArrayLoad / SchedTaskArray の二つにわけで、SchedTaskArrayLoad->next() で、次のSchedTaskを返さず、もう一つ作った、SchedTaskArray を返す。

    SchedTaskArrayLoad  
       Task Array のloadと、pile-line clear
    SchedTaskArray
       Task Array の実行

SchedTaskArray で次に実行する Task Array がなくなれば、save していた SimpleTask->next() を返す。

これは、TaskArray という SimpleTask で実行される。(実体はない)


API

create_task_arrayで、param/inData/outData の数を指定する。全部同じparam/inData/outData の数なのは、allocate のsizeを計算するため。

全部可変にして、後でsizeを指定しても良い。そういうAPIを用意することも可能。 でも、そんなの使うの?

HTask の方で array_task を生成。これは、create_array_task で allocate した rbuf 上に生成する。最後に、大きさがあっているかどうかを、task_array_spawn() で調べている。

本来は、HTaskArray を作って、array_task ではない場合には、APIを生成出来ないようにするべきだろう... (field は同じ)でも、そうすると、またvirtualになる...

最後に、create_task_array がSimpleTaskなので、それをspawn() する。

    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();    


従来の Task との互換性

可変長Task を従来の TaskList に埋め込むことで、従来の8個 Param, List DMA Task との互換性を取る。

TaskList に8個のParamを埋め込んだのと同等。TaskList の大きさを十分に取れば、従来と同等。

これは、TaskArray1 という SimpleTask で実行される。(実体はない)

pipe-line の乱れもない。

従来のコードは、SIMPLE_TASK で切替え。(そのうち削除?)

Content

  1. 従来のTaskの問題点
  2. Simple Task
  3. Task Array
  4. Task ArrayとSimple Task
  5. API
  6. 従来の Task との互換性