changeset 699:7e937a1cd121

....
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 13 Dec 2009 22:46:15 +0900
parents dcaa40ec963d
children d3afc8777daa
files TaskManager/kernel/ppe/Task.cc TaskManager/kernel/ppe/Task.h TaskManager/kernel/schedule/ListData.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskArray.cc TaskManager/kernel/schedule/SchedTaskArray.h TaskManager/kernel/schedule/SchedTaskArrayLoad.cc TaskManager/kernel/schedule/SchedTaskArrayLoad.h example/Bulk/main.cc example/Bulk/ppe/Twice.cc example/Simple/Makefile.def example/Simple/Makefile.macosx example/Simple/spe/Makefile
diffstat 13 files changed, 79 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/Task.cc	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Sun Dec 13 22:46:15 2009 +0900
@@ -88,7 +88,7 @@
 void 
 Task::set_inData_t( int index, memaddr addr, int size)
 {
-    ListElementPtr elm = (ListElementPtr) inData(0);
+    ListElementPtr elm = (ListElementPtr) inData(index);
 #ifdef __CERIUM_CELL__
     elm->addr = (uint32)(unsigned long)addr;
 #else
@@ -100,7 +100,7 @@
 void 
 Task::set_outData_t(int index, memaddr addr, int size)
 {
-    ListElementPtr elm = (ListElementPtr) outData(0);
+    ListElementPtr elm = (ListElementPtr) outData(index);
 #ifdef __CERIUM_CELL__
     elm->addr = (uint32)(unsigned long)addr;
 #else
--- a/TaskManager/kernel/ppe/Task.h	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Sun Dec 13 22:46:15 2009 +0900
@@ -58,26 +58,38 @@
 
     void print();
 
+    int const offset() { return (memaddr)data-(memaddr)&task_size; }
+
+    // on host
     memaddr param(int index) {
 	return (memaddr)data + sizeof(memaddr)*index;
     }
+    // on host
     memaddr inData(int index) {
 	memaddr p = (memaddr)data + inData_offset;
 	return p + sizeof(ListElement)*index;
     }
+    // on host
     memaddr outData(int index) {
 	memaddr p = (memaddr)data + outData_offset;
 	return p + sizeof(ListElement)* index;
     }
 
+    // on client
+    memaddr get_param(int index) {
+	memaddr data = (memaddr)this + offset();
+	return (memaddr)data + sizeof(memaddr)*index;
+    }
+    // on client
     ListElement *inListData() {
-	memaddr data = (memaddr)this;
+	memaddr data = (memaddr)this + offset();
 	ListElement *list = (ListElement *)(data+inData_offset);
 	return list;
     }
 
+    // on client
     ListElement *outListData() {
-	memaddr data = (memaddr)this;
+	memaddr data = (memaddr)this + offset();
 	ListElement *list = (ListElement *)(data+outData_offset);
 	return list; 
     }
--- a/TaskManager/kernel/schedule/ListData.h	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/schedule/ListData.h	Sun Dec 13 22:46:15 2009 +0900
@@ -40,6 +40,13 @@
 	length = 0;
 	size = 0;
     }
+
+    void print() {
+	printf("inList length %d size %d\n",length, size);
+	for(int i=0;i<length;i++) {
+	    printf("inList element[%d] size %d addr %lx\n",i, element[i].size, (unsigned long)element[i].addr);
+	}
+    }
 };
 
 typedef ListData* ListDataPtr;
--- a/TaskManager/kernel/schedule/SchedTask.cc	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Sun Dec 13 22:46:15 2009 +0900
@@ -123,6 +123,15 @@
 {
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
+#ifdef SIMPLE_TASK
+    if (task->w_size > 0) {
+	writebuf = scheduler->allocate(task->w_size);
+    }
+#else
+    if (outListData->length > 0) {
+	writebuf = scheduler->allocate(outListData->size);
+    }
+#endif
     scheduler->dma_wait(DMA_READ);
     task_list[task->command].wait(scheduler,task->command);
     task_list[task->command].run(this, readbuf, writebuf);
@@ -169,7 +178,7 @@
 					  scheduler);
 	if (nextTask->command==TaskArray) {
 	    // Start Task Array
-	    return (SchedTaskBase*)(new SchedTaskArrayLoad(nextSched));
+	    return (SchedTaskBase*)(new SchedTaskArrayLoad(scheduler, nextSched));
 	}
 
 	return nextSched;
--- a/TaskManager/kernel/schedule/SchedTaskArray.cc	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArray.cc	Sun Dec 13 22:46:15 2009 +0900
@@ -2,11 +2,12 @@
 #include "Scheduler.h"
 
 
-SchedTaskArray::SchedTaskArray(SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
+SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
 {
     savedTask = savedTask_;
     task = curTask_;
     array = _array;
+    scheduler = s;
 
     inListData.bound = 0;
     inListData.size = 0;
@@ -55,6 +56,7 @@
 
     // load Input Data
     readbuf = scheduler->allocate(inListData.size);
+    inListData.print();
     scheduler->dma_loadList(&inListData, readbuf, DMA_READ);
     bound(&inListData);
 
@@ -66,6 +68,16 @@
 {
     __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
 
+    if (task->outData_count > 0) {
+	outListData.length = task->outData_count;
+	outListData.size = task->outData_total_size();
+	outListData.element = task->outListData();
+	outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int));
+	bound(&outListData);
+
+	writebuf = scheduler->allocate(outListData.size);
+    }
+
     scheduler->dma_wait(DMA_READ);
     task_list[task->command].wait(scheduler,task->command);
     task_list[task->command].run(this, readbuf, writebuf);
@@ -75,14 +87,8 @@
     // User 側で作る方法が必要...
 
     if (task->outData_count > 0) {
-	outListData.length = task->outData_count;
-	outListData.size = task->outData_total_size();
-	outListData.element = task->outListData();
-	outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int));
-
-	writebuf = scheduler->allocate(outListData.size);
+	outListData.print();
         scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE);
-	bound(&outListData);
     }
 }
 
@@ -119,7 +125,7 @@
     Task *next = task->next();
     if (next < last()) {
 	// Task List が残っているので、次を準備
-	return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array);
+	return (SchedTaskBase*)new SchedTaskArray(scheduler, savedTask, next, array);
     } else {
 	// このTaskArrayは終り。save していた Task の次を返す。
 	// savedTask の read/exec は実行されない (command = TaskArray)
@@ -195,8 +201,7 @@
 memaddr
 SchedTaskArray::get_param(int index)
 {
-    memaddr *param =  (memaddr*)task->param(index);
-    return *param;
+    return task->get_param(index);
 }
 
 
--- a/TaskManager/kernel/schedule/SchedTaskArray.h	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArray.h	Sun Dec 13 22:46:15 2009 +0900
@@ -9,7 +9,7 @@
 class SchedTaskArray : public SchedTask {
 public:
     /* constructor */
-    SchedTaskArray(SchedTaskBase *savedTask_, Task *task_, Task *array_);
+    SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_, Task *task_, Task *array_);
     virtual ~SchedTaskArray();
 
     BASE_NEW_DELETE(SchedTaskArray);
--- a/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc	Sun Dec 13 22:46:15 2009 +0900
@@ -2,9 +2,12 @@
 #include "SchedTaskArray.h"
 #include "Task.h"
 
-SchedTaskArrayLoad::SchedTaskArrayLoad(SchedTaskBase *savedTask_)
+SchedTaskArrayLoad::SchedTaskArrayLoad(Scheduler *s, SchedTaskBase *savedTask_)
 {
+    SchedTask *sv = (SchedTask*)savedTask_;
+    scheduler = s;
     savedTask = savedTask_;
+    task = sv->task;
 }
 
 SchedTaskArrayLoad::~SchedTaskArrayLoad() {}
@@ -28,7 +31,7 @@
 SchedTaskArrayLoad::next(Scheduler *scheduler, SchedTaskBase *p)
 {
     Task *nextTask = (Task *)readbuf;
-    return new SchedTaskArray(savedTask, nextTask, nextTask);
+    return new SchedTaskArray(scheduler, savedTask, nextTask, nextTask);
 }
 
 /* end */
--- a/TaskManager/kernel/schedule/SchedTaskArrayLoad.h	Sun Dec 13 20:14:18 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArrayLoad.h	Sun Dec 13 22:46:15 2009 +0900
@@ -8,7 +8,7 @@
 class SchedTaskArrayLoad : public SchedTask {
 public:
     /* constructor */
-    SchedTaskArrayLoad(SchedTaskBase *savedTask_);
+    SchedTaskArrayLoad(Scheduler *s, SchedTaskBase *savedTask_);
     virtual ~SchedTaskArrayLoad();
 
     BASE_NEW_DELETE(SchedTaskArrayLoad);
@@ -19,6 +19,7 @@
     /* variables */
 
     void *readbuf;
+    SimpleTask *task;
 
     /* functions */
 
--- a/example/Bulk/main.cc	Sun Dec 13 20:14:18 2009 +0900
+++ b/example/Bulk/main.cc	Sun Dec 13 22:46:15 2009 +0900
@@ -3,20 +3,21 @@
 #include <string.h>
 #include "TaskManager.h"
 #include "Task.h"
+#include "ListData.h"
 #include "Func.h"
 
 extern void task_init(void);
 
 static int length = DATA_NUM;
-static int task = 10;
-static int count = 10;
+static int task = 3;
+static int count = 3;
 
 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
+static void
 print_data(int *data, int size, const char *title)
 {
     printf("%s ---\n", title);
@@ -29,7 +30,7 @@
 /**
  * タスク終了後の data1, data2 の確認
  */
-void
+static void
 twice_result(SchedTask *s, void *a, void *b)
 {
     int* data = (int*)a;
@@ -39,7 +40,7 @@
     free(task_buf);
 }
 
-int
+static int
 init(int argc, char **argv)
 {
     for (int i = 1; argv[i]; ++i) {
@@ -55,6 +56,13 @@
     return 0;
 }
 
+static void print_ListData(int count, ListElement *t) 
+{
+    for(int i = 0;i<count;i++) {
+	printf("ListData %d %d %lx\n",i,t[i].size,(unsigned long)t[i].addr);
+    }
+}
+
 void
 twice_init(TaskManager *manager)
 {
@@ -98,6 +106,7 @@
 	t->set_inData_length(2);
 	t->set_inData(0,data, sizeof(int)*length2);
 	t->set_inData(1,data+length2, sizeof(int)*length2);
+	print_ListData(2,t->inListData());
 	/**
 	 * Set of Output area
 	 *   add_outData(address of output area, size of output area);
@@ -105,6 +114,7 @@
 	t->set_outData_length(2);
 	t->set_outData(0,data, sizeof(int)*length2);
 	t->set_outData(1,data+length2, sizeof(int)*length2);
+	print_ListData(2,t->outListData());
 	pos += t->size();
 	printf("pos 0x%0x size 0x%0x\n",pos, t->size());
     }
--- a/example/Bulk/ppe/Twice.cc	Sun Dec 13 20:14:18 2009 +0900
+++ b/example/Bulk/ppe/Twice.cc	Sun Dec 13 22:46:15 2009 +0900
@@ -9,7 +9,7 @@
 static int
 run(SchedTask *s,void *rbuf, void *wbuf)
 {
-    SchedTaskArray *a = (SchedTaskArray *)s;
+    // SchedTaskArray *a = (SchedTaskArray *)s;
 
     int *i_data;
     int *o_data;
--- a/example/Simple/Makefile.def	Sun Dec 13 20:14:18 2009 +0900
+++ b/example/Simple/Makefile.def	Sun Dec 13 22:46:15 2009 +0900
@@ -8,8 +8,10 @@
 SIMPLE_TASK=-DSIMPLE_TASK
 # SIMPLE_TASK=
 
+OPT= -g
+
 CC      = g++
-CFLAGS  = -g -Wall -O9 $(SIMPLE_TASK)
+CFLAGS  = -Wall $(OPT) $(SIMPLE_TASK)
 
 INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
 LIBS = -L${CERIUM}/TaskManager
--- a/example/Simple/Makefile.macosx	Sun Dec 13 20:14:18 2009 +0900
+++ b/example/Simple/Makefile.macosx	Sun Dec 13 22:46:15 2009 +0900
@@ -22,7 +22,7 @@
 all: $(TARGET)
 
 $(TARGET): $(OBJS) $(TASK_OBJS)
-	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) $(OPT)
 
 link:
 	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
--- a/example/Simple/spe/Makefile	Sun Dec 13 20:14:18 2009 +0900
+++ b/example/Simple/spe/Makefile	Sun Dec 13 22:46:15 2009 +0900
@@ -6,7 +6,7 @@
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
-CC      = spu-g++ -DABIBIT=$(ABIBIT) $(SIMPLE_TASK)
+CC      = spu-g++ -DABIBIT=$(ABIBIT) $(SIMPLE_TASK) $(OPT)
 CFLAGS  = -g -Wall -fno-exceptions -fno-rtti #-DDEBUG
 INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I..
 LIBS = -L../${CERIUM}/TaskManager -lspemanager
@@ -19,7 +19,7 @@
 all: $(TARGET)
 
 $(TARGET): $(OBJS)
-	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) $(OPT)
 
 clean:
 	rm -f $(TARGET) $(OBJS)