Mercurial > hg > Members > kono > Cerium
changeset 679:14d179ff1e9f
adding Array Task.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 06 Dec 2009 11:33:09 +0900 |
parents | fd3492a767c7 (diff) e201be3f6897 (current diff) |
children | af0942d42de0 |
files | TaskManager/ChangeLog TaskManager/Makefile.def TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/Task.h TaskManager/kernel/sys_task/SysTasks.h example/Bulk/main.cc |
diffstat | 6 files changed, 105 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/ChangeLog Sun Dec 06 07:40:26 2009 +0900 +++ b/TaskManager/ChangeLog Sun Dec 06 11:33:09 2009 +0900 @@ -1,3 +1,32 @@ +2009-12-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている + かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの + が必要。deubg 用のデータ書き出しツールがいるな。 + + log header + command(16) cpu-id(16) event(32) time(64) + struct debug_log { + uint16 command; + uint16 cpu-id; + uint32 event; + uint32 time; + } + ぐらい? get_segment 使うべきか。連続領域に使える get_segement があると + 良いわけね。write とも言うが。 + + sort で、memcpy しているのは変。read/write buffer をflipしてやると + 良い。両方とも握っているんだから問題ない。ただし、read/write buffer + の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か? + sort ちゃんとは動いているんだよ。 + + word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが + あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに + なっている。PPUネックになっているっぽい。 + + TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを + 用意する感じか。inData/outData の処理も。 + 2009-12-5 Shinji KONO <kono@ie.u-ryukyu.ac.jp> なんかなぁ。一つの機能を付け加えようとすると、 @@ -34,7 +63,7 @@ なっているらしい。 実際、mail_sendQueue は、free list に置き換わってしまう。 - これまで、これがおかしならなかった理由は不明。 + これまで、これがおかしくならなかった理由は不明。 connector に外から手を入れないで、ちゃんとfunction callするべし。
--- a/TaskManager/Makefile.def Sun Dec 06 07:40:26 2009 +0900 +++ b/TaskManager/Makefile.def Sun Dec 06 11:33:09 2009 +0900 @@ -29,11 +29,11 @@ ABIBIT = 32 -# SIMPLE_TASK=-DSIMPLE_TASK -SIMPLE_TASK= +SIMPLE_TASK=-DSIMPLE_TASK +# SIMPLE_TASK= -OPT = -O9 -# OPT = -g +# OPT = -O9 +OPT = -g CC = g++ CFLAGS = $(SIMPLE_TASK) -Wall `sdl-config --cflags` -m$(ABIBIT) $(OPT)
--- a/TaskManager/kernel/ppe/HTask.h Sun Dec 06 07:40:26 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Sun Dec 06 11:33:09 2009 +0900 @@ -45,6 +45,9 @@ void wait_for(HTask *); void set_cpu(CPU_TYPE type); void set_post(PostFunction func, void *read, void *write); +#ifdef SIPMLE_TASK + Task *create_task_array(int size); +#endif }; typedef HTask* HTaskPtr;
--- a/TaskManager/kernel/ppe/Task.h Sun Dec 06 07:40:26 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Sun Dec 06 11:33:09 2009 +0900 @@ -8,32 +8,71 @@ #define MAX_PARAMS 8 +#ifndef SIMPLE_TASK class Task : public SimpleTask { public: // variables BASE_NEW_DELETE(Task); -#ifndef SIMPLE_TASK int param_size; // 4 byte memaddr param[MAX_PARAMS]; // 4*MAX_PARAMS byte ListData inData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); ListData outData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); -#endif public: // functions int add_inData_t(memaddr addr, int size); // unsigned int ではなく 64bit int add_outData_t(memaddr addr, int size); // unsigned int ではなく 64bit int add_data(ListData &list, memaddr addr, int size); - int add_param0(memaddr param); // obsolete. do not use. - int set_param0(int index, memaddr param); + int add_param_t(memaddr param); // obsolete. do not use. + int set_param_t(int index, memaddr param); -#define add_param(param) add_param0((memaddr)(param)) -#define set_param(index,param) set_param0(index, (memaddr) (param)) +#define add_param(param) add_param_t((memaddr)(param)) +#define set_param(index,param) set_param_t(index, (memaddr) (param)) #define add_inData(addr, size) \ add_inData_t((memaddr)(addr), (size)); #define add_outData(addr, size) \ add_outData_t((memaddr)(addr), (size)); }; +#else +class Task { +public: // variables + + BASE_NEW_DELETE(Task); + + int size; + int param_size; + memaddr *param; + int inData_size; + ListEelemnt *inData; + int outData_size; + ListElement *outData; + +public: // functions + int add_inData_t(memaddr addr, int size); + int add_outData_t(memaddr addr, int size); + int set_inData_length(int length); + int set_inData_t(int index, memaddr addr, int size); + int set_outData_length(int length); + int set_outData_t(int index, memaddr addr, int size); + int add_data(ListData &list, memaddr addr, int size); + void set_param_length(int i); + int add_param_t(memaddr param); // obsolete. do not use. + int set_param_t(int index, memaddr param); + int size() { return size; } + +#define add_param(param) add_param_t((memaddr)(param)) +#define set_param(index,param) set_param_t(index, (memaddr) (param)) + +#define add_inData(addr, size) \ + add_inData_t((memaddr)(addr), (size)); +#define add_outData(addr, size) \ + add_outData_t((memaddr)(addr), (size)); +#define set_inData(index, addr, size) \ + set_inData_t(index, (memaddr)(addr), (size)); +#define set_outData(index, addr, size) \ + set_outData_t(index, (memaddr)(addr), (size)); +}; +#endif typedef Task* TaskPtr;
--- a/TaskManager/kernel/sys_task/SysTasks.h Sun Dec 06 07:40:26 2009 +0900 +++ b/TaskManager/kernel/sys_task/SysTasks.h Sun Dec 06 11:33:09 2009 +0900 @@ -1,5 +1,6 @@ StartTask, FinishTask, +TaskArray, ShowTime, StartProfile, #define Dummy StartTask
--- a/example/Bulk/main.cc Sun Dec 06 07:40:26 2009 +0900 +++ b/example/Bulk/main.cc Sun Dec 06 11:33:09 2009 +0900 @@ -7,8 +7,8 @@ extern void task_init(void); static int length = DATA_NUM; -static int task = 1; -static int count = 1; +static int task = 10; +static int count = 10; const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\ -length Number of data (default DATA_NUM (Func.h))\n\ @@ -55,7 +55,6 @@ void twice_init(TaskManager *manager) { - TaskArray *twice; int *data = (int*)manager->allocate(sizeof(int)*length); @@ -69,38 +68,47 @@ * Create Task * create_task(Task ID); */ - twice = manager->create_bulk_task(count); + int size = count*(SizeOfParam(2) + SizeOfData(sizeof(int)*length) + + SizeOfData(sizeof(int)*length)); + HTask *twice_main = manager->create_task_array(size); + int pos = 0; for(int i = 0;i<count;i++) { - Task t = twice_main->create_stask(Twice); + Task t = twice_main->create_task(Twice,pos); int length2 = length/2; + // 以下の順序でデータを追加する必要がある。 + // length を先に指定すればsetは後からでも良い。 /** * Set 32bits parameter * add_param(32bit parameter); */ + t->set_param_length(2); t->set_param(0, (memaddr)length2); t->set_param(1, (memaddr)length2); /** * Set of Input Data * add_inData(address of input data, size of input data); */ - t->add_inData(data, sizeof(int)*length2); - t->add_inData(data+length2, sizeof(int)*length2); + t->set_inData_length(2); + t->set_inData(0,data, sizeof(int)*length2); + t->set_inData(1,data+length2, sizeof(int)*length2); /** - * Set of OutPut area + * Set of Output area * add_outData(address of output area, size of output area); */ - t->add_outData(data, sizeof(int)*length2); - t->add_outData(data+length2, sizeof(int)*length2); + t->set_outData_length(2); + t->set_outData(0,data, sizeof(int)*length2); + t->set_outData(1,data+length2, sizeof(int)*length2); + pos += t->size(); + + delete t; // Wao! } twice_main->set_cpu(SPE_ANY); - /* * set_post() で ppe task を渡せるようにしたい */ - twice->set_post(twice_result, (void*)data, 0); - + twice_main->set_post(twice_result, (void*)data, 0); // add Active Queue - twice->spawn_bulk(); + twice_main->spawn(); } int