# HG changeset patch # User Shinji KONO # Date 1258945305 -32400 # Node ID dbe137505f2e3bdb3e2cf549274288682b38f6e8 # Parent c13bbb7d70b330685b2332d7f087cba1fc5b887e bulk task list start. diff -r c13bbb7d70b3 -r dbe137505f2e Renderer/Engine/viewer.cc --- a/Renderer/Engine/viewer.cc Mon Nov 23 10:01:02 2009 +0900 +++ b/Renderer/Engine/viewer.cc Mon Nov 23 12:01:45 2009 +0900 @@ -148,11 +148,9 @@ task_next = manager->create_task(Dummy); + // ここは、Iterator を用意するべきだよね for (int i = 0; i < spe_num; i++) { task_tex = manager->create_task(LoadTexture); - /* - * ここはもう少しわかりやすい使い方がいいかもしれぬ。こんなもん? - */ task_tex->set_cpu((CPU_TYPE)((int)SPE_0 + i)); task_next->wait_for(task_tex); task_tex->spawn(); @@ -466,11 +464,7 @@ int index_end = (index_start + range >= spackList_length) ? spackList_length : index_start + range; - HTaskPtr task_create_sp = manager->create_task(CreateSpan); - task_create_sp->add_inData(ppack, sizeof(PolygonPack)); - task_create_sp->add_inData(spackList_ptr, - sizeof(SpanPack*)*spackList_length_align); - task_create_sp->add_inData(&spackList[index_start], sizeof(SpanPack)); + HTaskPtr task_create_sp = manager->create_task(CreateSpan); task_create_sp->set_param(0,index_start); @@ -486,6 +480,11 @@ task_create_sp->set_param(1,index_start*split_screen_h + 1); task_create_sp->set_param(2,index_end*split_screen_h); + task_create_sp->add_inData(ppack, sizeof(PolygonPack)); + task_create_sp->add_inData(spackList_ptr, + sizeof(SpanPack*)*spackList_length_align); + task_create_sp->add_inData(&spackList[index_start], sizeof(SpanPack)); + task_next->wait_for(task_create_sp); task_create_sp->wait_for(task_create_pp); @@ -519,11 +518,15 @@ if (spack->info.size > 0) { // Draw SpanPack task_draw = manager->create_task(DrawSpan); - task_draw->add_inData(spack, sizeof(SpanPack)); task_draw->set_param(0, (memaddr)&pixels[(startx-1) + this->width*(starty-1)]); task_draw->set_param(1,this->width); + task_draw->set_param(2,startx); + task_draw->set_param(3,endx); + task_draw->set_param(4,rangey); + + task_draw->add_inData(spack, sizeof(SpanPack)); for (int i = 0; i < rangey; i++) { task_draw->add_outData( @@ -539,9 +542,6 @@ break; } - task_draw->set_param(2,startx); - task_draw->set_param(3,endx); - task_draw->set_param(4,rangey); task_draw->set_cpu(SPE_ANY); task_next->wait_for(task_draw); task_draw->spawn(); diff -r c13bbb7d70b3 -r dbe137505f2e TaskManager/ChangeLog --- a/TaskManager/ChangeLog Mon Nov 23 10:01:02 2009 +0900 +++ b/TaskManager/ChangeLog Mon Nov 23 12:01:45 2009 +0900 @@ -1,3 +1,6 @@ +2009-11-23 Shinji KONO + list.bound は廃止。list element から計算可能。 + 2009-11-20 Shinji KONO mail_sendQueue の実装がだめ。こういう実装をすると、queue の diff -r c13bbb7d70b3 -r dbe137505f2e TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Mon Nov 23 10:01:02 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Mon Nov 23 12:01:45 2009 +0900 @@ -12,11 +12,12 @@ 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 diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/ChangeLog --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/ChangeLog Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,6 @@ +2008-05-27 Wataru MIYAGUNI + + * memo + Fifo СǤϳǧޤ + Cell СϡCerium ޤ̤ʤΤǤ줫 + diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/Func.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/Func.h Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,7 @@ +enum { +#include "SysTasks.h" + Twice, + TwiceMain, +}; + +#define DATA_NUM 12 diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/Makefile Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,20 @@ +default: macosx + +macosx: FORCE + @echo "Make for Mac OS X" + @$(MAKE) -f Makefile.macosx + +linux: FORCE + @echo "Make for Linux" + @$(MAKE) -f Makefile.linux + +cell: FORCE + @echo "Make for PS3 (Cell)" + @$(MAKE) -f Makefile.cell + +FORCE: + +clean: + @$(MAKE) -f Makefile.macosx clean + @$(MAKE) -f Makefile.linux clean + @$(MAKE) -f Makefile.cell clean \ No newline at end of file diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/Makefile.cell --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/Makefile.cell Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,39 @@ +include ./Makefile.def + +SRCS_TMP = $(wildcard *.cc) +SRCS_EXCLUDE = # ե +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +TASK_DIR = ppe +TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) +TASK_SRCS_EXCLUDE = +TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) +TASK_OBJS = $(TASK_SRCS:.cc=.o) + +LIBS += -lCellManager -lspe2 -lpthread -Wl,--gc-sections + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) speobject + +$(TARGET): $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +speobject: + cd spe; $(MAKE) + +link: + $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) + +debug: $(TARGET) + sudo ppu-gdb ./$(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) $(TASK_OBJS) + rm -f *~ \#* + rm -f ppe/*~ ppe/\#* + cd spe; $(MAKE) clean diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/Makefile.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/Makefile.def Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,16 @@ +TARGET = twice + +# include/library path +# ex macosx +#CERIUM = /Users/gongo/Source/Cerium + +# ex linux/ps3 +CERIUM = ../../../Cerium + +CC = g++ +CFLAGS = -g -Wall -O9 + +ABIBIT = 32 + +INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. +LIBS = -L${CERIUM}/TaskManager diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/Makefile.linux --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/Makefile.linux Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,36 @@ +include ./Makefile.def + +SRCS_TMP = $(wildcard *.cc) +SRCS_EXCLUDE = # ե +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +TASK_DIR = ppe +TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) +TASK_SRCS_EXCLUDE = +TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) +TASK_OBJS = $(TASK_SRCS:.cc=.o) + +LIBS += -lFifoManager + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +link: + $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) + +debug: $(TARGET) + sudo gdb ./$(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) $(TASK_OBJS) + rm -f *~ \#* + rm -f ppe/*~ ppe/\#* + rm -f spe/*~ spe/\#* diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/Makefile.macosx --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/Makefile.macosx Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,37 @@ +include ./Makefile.def + +SRCS_TMP = $(wildcard *.cc) +SRCS_EXCLUDE = # ե +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +TASK_DIR = ppe +TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) +TASK_SRCS_EXCLUDE = +TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) +TASK_OBJS = $(TASK_SRCS:.cc=.o) + +LIBS += -lFifoManager `sdl-config --libs` +CC += -m$(ABIBIT) + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +link: + $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) + +debug: $(TARGET) + sudo gdb ./$(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) $(TASK_OBJS) + rm -f *~ \#* + rm -f ppe/*~ ppe/\#* + rm -f spe/*~ spe/\#* diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/README Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,87 @@ +/* + * $Id: README,v 1.5 2008/10/20 10:02:01 gongo Exp $ + */ + +- 概要 + +int の配列を送り、タスク(Twice) で、配列の要素を2倍にして送り返します。 + +PPE->SPE の DMA 転送は main.cc の twice_init に +書いてるのでわかってもらえるかなと信じて、タスク側で +そのデータの受け取り方を説明する。 + +------------------------------------- +PPE から送られてきたデータの受け取り +------------------------------------- + +void *get_input(void *p, int index) を使う。 + +p には rbuf が入ります。今のところ確定なのでわざわざ書かせる必要も無いか。。。 +index は、create task 時に add_inData したと思うけど、その順番になります。 + +add_inData(data1, size1); +add_inData(data2, size2); + +の順番で記述した場合、 + +data1 = get_input(rbuf, 0); +data2 = get_input(rbuf, 0); + +で取れます。 + +------------------------------------- +PPE へデータを送る +------------------------------------- + +void *get_output(void *p, int index) を使う。 + +p は wbuf, index は input と同じ感じでいいです。 +get_output で受け取った領域でデータを書けば、 +このタスクが終了した後に、add_outData で指定したアドレスに書き込まれます。 + + +- 実行方法 + +./twice [-cpu spe_num] [-length data_length] + + -cpu 使用する SPU の数 + // 今回はあまり意味の無いオプションです。 + // 巨大な配列の場合、複数に振り分けてそれぞれで 2 倍させるっていう + // 処理を入れれば意味のあるものになります。誰か(ry + + -length 配列の要素の数 + + +- 実行例 + +% ./twice +before --- + 0 1 2 3 4 5 6 7 8 9 10 11 +after --- + 0 2 4 6 8 10 12 14 16 18 20 22 + +% ./twice -length 20 +before --- + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 +after --- + 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 + +% ./twice -length 15 +before --- + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +zsh: bus error ./twice -length 15 + +上の場合、PS3上(SPE使った場合)では bus error が出ます。 +この理由は length にあって、送るデータのバイト数が +4バイト(int) x 15 = 60 バイト だからです。 +PPE <-> SPE での DMA 転送のサイズは +1,2,4,8バイト, もしくは 16バイト倍数と決まっています。 +このサイズに誤りがある場合、上のように bus error が出ます。 +この辺の詳しい仕様は、 + +Game_project/ps3/docs にある PDF や + +Fixstars のサイト +http://cell.fixstars.com/ps3linux/index.php/3.3 DMA転送によるデータの受け渡し + +とか見ればわかると思います diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/main.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/main.cc Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,122 @@ +#include +#include +#include +#include "TaskManager.h" +#include "Func.h" + +extern void task_init(void); + +static int length = DATA_NUM; +static int task = 1; +static int count = 1; + +const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\ + -length Number of data (default DATA_NUM (Func.h))\n\ + -count Number of task (default 1)\n"; + + +void +print_data(int *data, int size, const char *title) +{ + printf("%s ---\n", title); + for (int i = 0; i < size; i++) { + printf("%2d ", data[i]); + } + printf("\n"); +} + +/** + * タスク終了後の data1, data2 の確認 + */ +void +twice_result(SchedTask *s, void *a, void *b) +{ + int* data = (int*)a; + print_data(data, length, "after"); + free(data); +} + +int +init(int argc, char **argv) +{ + for (int i = 1; argv[i]; ++i) { + if (strcmp(argv[i], "-length") == 0) { + length = atoi(argv[++i]); + } else if (strcmp(argv[i], "-count") == 0) { + task = atoi(argv[++i]); + } else if (strcmp(argv[i], "-bluk") == 0) { + count = atoi(argv[++i]); + } + } + + return 0; +} + +void +twice_init(TaskManager *manager) +{ + TaskArray *twice; + + int *data = (int*)manager->allocate(sizeof(int)*length); + + for (int i = 0; i < length; i++) { + data[i] = i; + } + + print_data(data, length, "before"); + + /** + * Create Task + * create_task(Task ID); + */ + twice = manager->create_bulk_task(count); + for(int i = 0;icreate_stask(Twice); + int length2 = length/2; + /** + * Set 32bits parameter + * add_param(32bit parameter); + */ + 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); + /** + * 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); + } + twice_main->set_cpu(SPE_ANY); + + /* + * set_post() で ppe task を渡せるようにしたい + */ + twice->set_post(twice_result, (void*)data, 0); + + // add Active Queue + twice->spawn_bulk(); +} + +int +TMmain(TaskManager *manager,int argc, char *argv[]) +{ + if (init(argc, argv) < 0) { + return -1; + } + + // Task Register + // ppe/task_init.cc + task_init(); + + for (int i = 0; i < task; ++i) { + twice_init(manager); + } + + return 0; +} diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/ppe/Twice.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/ppe/Twice.cc Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,25 @@ +#include +#include "SchedTask.h" +#include "Twice.h" +#include "Func.h" + +/* これは必須 */ +SchedDefineTask(Twice); + +static int +run(SchedTask *s,void *rbuf, void *wbuf) +{ + int *i_data; + int *o_data; + long length; + + i_data = (int*)s->get_input(rbuf, 0); + o_data = (int*)s->get_output(wbuf, 0); + length = (long)s->get_param(0); + + for (int i = 0; i < length; i++) { + o_data[i] = i_data[i] * 2; + } + + return 0; +} diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/ppe/Twice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/ppe/Twice.h Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,16 @@ +#ifndef INCLUDED_TASK_HELLO +#define INCLUDED_TASK_HELLO + +#ifndef INCLUDED_SCHED_TASK +# include "SchedTask.h" +#endif +/* +class Twice : public SchedTask { +public: + SchedConstructor(Twice); + + int run(void *r, void *w); +}; + */ + +#endif diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/ppe/task_init.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/ppe/task_init.cc Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,17 @@ +#include "Func.h" +#include "Scheduler.h" + +/* 必ずこの位置に書いて */ +SchedExternTask(Twice); + +/** + * この関数は ../spe/spe-main と違って + * 自分で呼び出せばいい関数なので + * 好きな関数名でおk (SchedRegisterTask は必須) + */ + +void +task_init(void) +{ + SchedRegisterTask(TWICE_TASK, Twice); +} diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/spe/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/spe/Makefile Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,26 @@ +include ../Makefile.def + +TARGET = ../spe-main + +SRCS_TMP = $(wildcard *.cc) +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +CC = spu-g++ +CFLAGS = -g -Wall -fno-exceptions -fno-rtti #-DDEBUG +INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I.. +LIBS = -L../${CERIUM}/TaskManager -lspemanager + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +clean: + rm -f $(TARGET) $(OBJS) + rm -f *~ \#* \ No newline at end of file diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/spe/Twice.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/spe/Twice.cc Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,25 @@ +#include +#include "SchedTask.h" +#include "Twice.h" +#include "Func.h" + +/* これは必須 */ +SchedDefineTask(Twice); + +static int +run(SchedTask *s, void *rbuf, void *wbuf) +{ + int *i_data; + int *o_data; + int length; + + i_data = (int*)s->get_input(rbuf, 0); + o_data = (int*)s->get_output(wbuf, 0); + length = (long)s->get_param(0); + + for (int i = 0; i < length; i++) { + o_data[i] = i_data[i] * 2; + } + + return 0; +} diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/spe/Twice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/spe/Twice.h Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,16 @@ +#ifndef INCLUDED_TASK_HELLO +#define INCLUDED_TASK_HELLO + +#ifndef INCLUDED_SCHED_TASK +# include "SchedTask.h" +#endif +/* +class Twice : public SchedTask { +public: + SchedConstructor(Twice); + + int run(void *r, void *w); +}; + */ + +#endif diff -r c13bbb7d70b3 -r dbe137505f2e example/Bulk/spe/spe-main.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/Bulk/spe/spe-main.cc Mon Nov 23 12:01:45 2009 +0900 @@ -0,0 +1,14 @@ +#include "Func.h" +#include "SchedTask.h" + +SchedExternTask(Twice); + +/** + * この関数は SpeScheduler から呼ばれるので + * 必ずこの関数名でお願いします。 + */ +void +task_init(Scheduler *s) +{ + SchedRegisterTask(TWICE_TASK, Twice); +}