/* * $Id: README,v 1.5 2008/10/20 10:02:01 gongo Exp $ */ - 概要 Task 内で新たに Task を生成する。 以後、新たに生成された Task を RenewTask とする ------------------------------------- Task の生成 ------------------------------------- HTaskPtr create_task(int TASK_ID); これは PPE 内で使う manager->create_task(id); と同じ使い方です。以下の関数も同様です。 add_inData(), add_outData(), add_input() Task 内部でこれらの関数にアクセスする際は、 smanager->create_task, smanager->add_inData, というように、smanager から呼び出してください。 これは、PPE 内での TaskManager と同じです。 注 SPU からは使えません... ------------------------------------- RenewTask を待ちたい場合 ------------------------------------- TaskA : PPE で生成 TaskB : TaskA で生成 だったとする。 このとき、TaskA が終了した時点で、PPE 側に 「TaskA が終了した」と送るのですが 場合によっては、TaskB が終了するまで待って、初めて TaskA 終了を 通知したい時があると思います。そういうときは HTaskPtr taskB = smanager->create_task(TASK_B); taskB->spawn(); ------------------------------------- RenewTask の生成から実行までの時間 ------------------------------------- SPE 上で時間の計測を行う際、SPU Decrementer を使う方法が一般的らしい。 ./spe/SpeProfile.cc の中でそのルーチンを入れてます。 SpeProfile *profile = new SpeProfile; でオブジェクトを生成した後、測定したい範囲の最初で profile->ProfStart(); 計測の最後の範囲で profile->ProfStop(); その結果を表示したい時は profile->ProfPrint(); とします。 - 実行方法 ./renew_task - 実行例 流れは、 1. PPE で RenewStart を起動 2. RenewStart 内で Renew1 を起動 3. Renew1 内で Renew2 を起動 4. Renew2 内で Renew3 を起動 5. Renew3 内で Renew4 を起動 6. Renew4 で終了 % ./renew_task [PPE] Program Start [PPE] Create Task : RenewStart [SPE] ** running RenewStart [SPE] Create Task : Renew1 [SPE] ** finish RenewStart SPE time by SPU Decrementer: 40392.515625 [SPE] ** running Renew1 [SPE] Create Task : Renew2 [SPE] ** finish Renew1 SPE time by SPU Decrementer: 13483.305664 [SPE] ** running Renew2 [SPE] Create Task : Renew3 [SPE] ** finish Renew2 SPE time by SPU Decrementer: 0.005163 [SPE] ** running Renew3 [SPE] Create Task : Renew4 [SPE] ** finish Renew3 SPE time by SPU Decrementer: 0.005150 [SPE] ** running Renew4 [SPE] ** finish Renew4 測定の単位は msec です