changeset 652:dbe137505f2e

bulk task list start.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 23 Nov 2009 12:01:45 +0900
parents c13bbb7d70b3
children 94c6b7ea87c2
files Renderer/Engine/viewer.cc TaskManager/ChangeLog TaskManager/kernel/ppe/Task.h example/Bulk/ChangeLog example/Bulk/Func.h example/Bulk/Makefile example/Bulk/Makefile.cell example/Bulk/Makefile.def example/Bulk/Makefile.linux example/Bulk/Makefile.macosx example/Bulk/README example/Bulk/main.cc example/Bulk/ppe/Twice.cc example/Bulk/ppe/Twice.h example/Bulk/ppe/task_init.cc example/Bulk/spe/Makefile example/Bulk/spe/Twice.cc example/Bulk/spe/Twice.h example/Bulk/spe/spe-main.cc
diffstat 19 files changed, 526 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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();
--- 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 <kono@ie.u-ryukyu.ac.jp>
+    list.bound は廃止。list element から計算可能。
+
 2009-11-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     mail_sendQueue の実装がだめ。こういう実装をすると、queue の
--- 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
--- /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  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* memo
+	Fifo СǤϳǧޤ
+	Cell СϡCerium ޤ̤ʤΤǤ줫
+
--- /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
--- /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
--- /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
--- /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
--- /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/\#*
--- /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/\#*
--- /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転送によるデータの受け渡し
+
+とか見ればわかると思います
--- /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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#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;i<count;i++) {
+	Task t = twice_main->create_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;
+}
--- /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 <stdio.h>
+#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;
+}
--- /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
--- /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);
+}
--- /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
--- /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 <stdio.h>
+#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;
+}
--- /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
--- /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);
+}