単純なデータ転送でも、List DMAデータを構築 Param/List DMA は「8個まで」 一つ一つのTaskがPPEに終了を通知。Task終了時にPPCがメールを受け取るのを待ってしまう。
8個はひどいだろう? 1個でも8個転送しているので、SPE に送る TaskList が大きい。
実装が複雑。
今までのCeriumのTaskから、
RnewTask ListDMAの機能を削除することにより実現。Task List が単純になる。
可変長のParam/inData/outData Taskの終了を通知しない 全部のタスクが終了した時にPPEに通知 Simple Task を使って、Task Array List を転送実装が容易。Simple Taskを複雑にしない。
Task 可変長Param, List DMAを持つしかし、単純にSimple Taskとして実行は出来ない。
次の Simple Task (おそらくは別な TaskArray )が既に、read に入っているので、SchedTaskArray->exec() で実行するのでは、それと衝突してしまう。
SchedTaskArrayLoad Task Array のloadと、pile-line clear SchedTaskArray Task Array の実行SchedTaskArray で次に実行する Task Array がなくなれば、save していた SimpleTask->next() を返す。
これは、TaskArray という SimpleTask で実行される。(実体はない)
全部可変にして、後で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 を従来の TaskList に埋め込むことで、従来の8個 Param, List DMA Task との互換性を取る。
TaskList に8個のParamを埋め込んだのと同等。TaskList の大きさを十分に取れば、従来と同等。
これは、TaskArray1 という SimpleTask で実行される。(実体はない)
pipe-line の乱れもない。
従来のコードは、SIMPLE_TASK で切替え。(そのうち削除?)