changeset 700:d3afc8777daa

fix fix ...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2009 12:16:52 +0900
parents 7e937a1cd121
children 226d95fa2691
files TaskManager/kernel/ppe/HTask.cc TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/Task.cc TaskManager/kernel/ppe/Task.h TaskManager/kernel/ppe/TaskManager.cc TaskManager/kernel/ppe/TaskManager.h TaskManager/kernel/schedule/SchedTaskArray.cc example/Bulk/main.cc
diffstat 8 files changed, 145 insertions(+), 146 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/HTask.cc	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.cc	Mon Dec 14 12:16:52 2009 +0900
@@ -52,25 +52,39 @@
 #ifdef SIMPLE_TASK
 
 Task *
-HTask::create_task_array(int task_id, int pos)
+HTask::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData)
 {
-    Task *task = (Task*)((memaddr)rbuf + pos);
-    task->set_task_id(task_id);
-    task-> param_count = 0;
-    task-> inData_count = 0;
-    task-> outData_count = 0;
-    task-> inData_offset = 0;
-    task-> outData_offset = 0;
+    r_size = Task::calc_size(num_param, num_inData, num_outData)*num_task;
+    rbuf = (memaddr) mimpl->allocate(r_size);
+    Task *task = (Task*)rbuf;
+    task->init(id, num_param,num_inData,num_outData);
+// task->print();
+    return task;  // first task
+}
 
-    return task;
+Task *
+HTask::next_task_array(int id, Task *t)
+{
+    Task *first = (Task*)rbuf;
+    if (t==0) {
+// first->print();
+	return first;
+    }
+
+    Task *next = t->next();
+    next->init(id, first->param_count, first->inData_count, first->outData_count);
+    if ((memaddr)next - (memaddr)rbuf > r_size)
+	printf("too many task array used.\n");
+    return next;
 }
 
 void
-HTask::spawn_task_array(int pos)
+HTask::spawn_task_array(Task * last)
 {
-    if (pos!= r_size) {
-	printf("spawn task array size differ pos 0x%x r_size 0x%x\n",
-	    pos, r_size);
+    int size = (memaddr)last - rbuf;
+    if (size!= r_size) {
+	printf("spawn task array size differ size 0x%x r_size 0x%x\n",
+	    size, r_size);
     }
 }
 
--- a/TaskManager/kernel/ppe/HTask.h	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Mon Dec 14 12:16:52 2009 +0900
@@ -49,8 +49,9 @@
     void set_cpu(CPU_TYPE type);    
     void set_post(PostFunction func, void *read, void *write);
 #ifdef SIMPLE_TASK
-    Task *create_task_array(int task_id, int pos);
-    void spawn_task_array(int pos);
+    Task *create_task_array(int task_id, int num_task, int num_param, int num_inData, int num_outData);
+    Task *next_task_array(int task_id, Task *t);
+    void spawn_task_array(Task *t);
 #endif
 };
 
--- a/TaskManager/kernel/ppe/Task.cc	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Mon Dec 14 12:16:52 2009 +0900
@@ -85,30 +85,6 @@
 
 #else /* ifdef SIMPLE_TASK */
 
-void 
-Task::set_inData_t( int index, memaddr addr, int size)
-{
-    ListElementPtr elm = (ListElementPtr) inData(index);
-#ifdef __CERIUM_CELL__
-    elm->addr = (uint32)(unsigned long)addr;
-#else
-    elm->addr = addr;
-#endif
-    elm->size = size;
-}  
-
-void 
-Task::set_outData_t(int index, memaddr addr, int size)
-{
-    ListElementPtr elm = (ListElementPtr) outData(index);
-#ifdef __CERIUM_CELL__
-    elm->addr = (uint32)(unsigned long)addr;
-#else
-    elm->addr = addr;
-#endif
-    elm->size = size;
-}
-
 void
 Task::print()
 {
--- a/TaskManager/kernel/ppe/Task.h	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Mon Dec 14 12:16:52 2009 +0900
@@ -48,100 +48,26 @@
     int inData_offset;
     int outData_offset;
     void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); 
-    // memaddr param[param_count];
-    // ListEelemnt inData[inData_count];
-    // ListElement outData[outData_count];
 
 public: // functions
-    // int add_inData_t(memaddr addr, int size);  
-    // int add_outData_t(memaddr addr, int size); 
 
     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 + offset();
-	ListElement *list = (ListElement *)(data+inData_offset);
-	return list;
-    }
-
-    // on client
-    ListElement *outListData() {
-	memaddr data = (memaddr)this + offset();
-	ListElement *list = (ListElement *)(data+outData_offset);
-	return list; 
+    memaddr *param(int index) {
+	memaddr p =  (memaddr)data + sizeof(memaddr)*index;
+	return (memaddr *)p;
     }
 
-    void set_param_length(int i) { 
-	param_count = i; 
-	inData_offset = round_up16(sizeof(Task))+param_count*sizeof(memaddr);
-    }
-    void set_inData_length(int length)  { 
-	inData_count = length; 
-	if (inData_offset==0) {
-	    printf("call set_param_length before\n");
-	}
-	outData_offset = 
-	    round_up16(inData_offset+inData_count*sizeof(ListElement)); 
-    }
-    void set_outData_length(int length) { 
-	outData_count = length; 
-	if (outData_offset==0) {
-	    printf("call set_outData_length before\n");
-	}
-	task_size = round_up16(outData_offset+outData_count*sizeof(ListElement)); 
-    }
-    int size() {
-	if (task_size==0) {
-	    printf("call set_outData_length before\n");
-	}
-	return task_size;
-    }
-    int inData_total_size() {
-	int size = 0;
-	ListElement *inData = inListData();
-	for(int i=0; i< inData_count; i++) {
-	    size += inData[i].size;
-	}
-	return size;
-    }
-    int outData_total_size() {
-	int size = 0;
-	ListElement *outData = inListData();
-	for(int i=0; i< outData_count; i++) {
-	    size += outData[i].size;
-	}
-	return size;
+    ListElement *inData(int index) {
+	memaddr p = (memaddr)data + inData_offset;
+	p += sizeof(ListElement)*index;
+	return (ListElement*)p;
     }
 
-    void set_inData_t( int index, memaddr addr, int size); 
-    void set_outData_t(int index, memaddr addr, int size); 
-    void set_task_id(int id) { command = id; }
-    void set_param_t(int index, memaddr param) {
-	memaddr *p = (memaddr*)this->param(index);
-	*p = param;
+    ListElement *outData(int index) {
+	memaddr p = (memaddr)data + outData_offset;
+	p += sizeof(ListElement)* index;
+	return (ListElement*)p;
     }
 
     static int calc_size(int params, int ins, int outs) {
@@ -149,9 +75,75 @@
 	   + round_up16(sizeof(memaddr)*params)
            + round_up16(sizeof(ListElement)*ins)
            + round_up16(sizeof(ListElement)*outs);
+#if 0
+printf("   calc_size 0x%x\n",size);
+#endif
 	return size;
     }
 
+    void init(int task_id, int params, int ins, int outs) {
+	set_task_id(task_id);
+	param_count = params;
+	inData_count = ins;
+	outData_count = outs;
+	inData_offset = round_up16(sizeof(memaddr)*params);
+	outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins);
+	task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs);
+#if 0
+printf("task_id %d params %d ins %d outs %d\n",task_id, params, ins, outs);
+printf("   inData_offset %d\n",inData_offset);
+printf("   outData_offset %d\n",outData_offset);
+printf("   task_size 0x%x\n",task_size);
+	this->print();
+#endif
+    }
+
+    int size() {
+	return task_size;
+    }
+
+    int inData_total_size() {
+	int size = 0;
+	ListElement *in= inData(0);
+	for(int i=0; i< inData_count; i++) {
+	    size += in[i].size;
+	}
+	return size;
+    }
+    int outData_total_size() {
+	int size = 0;
+	ListElement *out= outData(0);
+	for(int i=0; i< outData_count; i++) {
+	    size += out[i].size;
+	}
+	return size;
+    }
+
+    void set_inData_t( int index, memaddr addr, int size) {
+	ListElement *list = inData(index);
+#ifdef __CERIUM_CELL__
+	list->addr = (uint32)addr;
+#else
+	list->addr = addr;
+#endif
+	list->size = size;
+    }
+
+    void set_outData_t(int index, memaddr addr, int size) {
+	ListElement *list = outData(index);
+#ifdef __CERIUM_CELL__
+	list->addr = (uint32)addr;
+#else
+	list->addr = addr;
+#endif
+	list->size = size;
+    }
+    void set_task_id(int id) { command = id; }
+    void set_param_t(int index, memaddr param) {
+	memaddr *p = (memaddr*)this->param(index);
+	*p = param;
+    }
+
     Task * next()
     {
 	char *p = (char*)this;
--- a/TaskManager/kernel/ppe/TaskManager.cc	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.cc	Mon Dec 14 12:16:52 2009 +0900
@@ -1,5 +1,10 @@
 #include "TaskManager.h"
 #include "Scheduler.h"
+#ifdef SIMPLE_TASK
+#include "HTask.h"
+#include "Task.h"
+#include "SysFunc.h"
+#endif
 
 TaskManager::TaskManager(int num) : machineNum(num)
 {
@@ -59,6 +64,14 @@
     return m_impl->create_task(cmd,r,rs,w,ws);
 }
 
+#ifdef SIMPLE_TASK
+HTaskPtr 
+TaskManager::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData) {
+    HTaskPtr ta = create_task(TaskArray,0,0,0,0);
+    ta->create_task_array(id, num_task, num_param, num_inData, num_outData) ;
+    return ta;
+}
+#endif
 
 /**
  * TaskManaer 終了時に実行される関数の設定
--- a/TaskManager/kernel/ppe/TaskManager.h	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.h	Mon Dec 14 12:16:52 2009 +0900
@@ -36,6 +36,11 @@
     void init();
     void finish();
 
+#ifdef SIMPLE_TASK
+    HTask *create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData);
+#endif
+
+
 private:
     int machineNum;
 };
--- a/TaskManager/kernel/schedule/SchedTaskArray.cc	Sun Dec 13 22:46:15 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArray.cc	Mon Dec 14 12:16:52 2009 +0900
@@ -51,7 +51,7 @@
 
     inListData.length = task->inData_count;
     inListData.size = task->inData_total_size();
-    inListData.element = task->inListData();
+    inListData.element = task->inData(0);
     inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int));
 
     // load Input Data
@@ -71,7 +71,7 @@
     if (task->outData_count > 0) {
 	outListData.length = task->outData_count;
 	outListData.size = task->outData_total_size();
-	outListData.element = task->outListData();
+	outListData.element = task->outData(0);
 	outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int));
 	bound(&outListData);
 
@@ -201,7 +201,7 @@
 memaddr
 SchedTaskArray::get_param(int index)
 {
-    return task->get_param(index);
+    return *task->param(index);
 }
 
 
--- a/example/Bulk/main.cc	Sun Dec 13 22:46:15 2009 +0900
+++ b/example/Bulk/main.cc	Mon Dec 14 12:16:52 2009 +0900
@@ -64,10 +64,9 @@
 }
 
 void
-twice_init(TaskManager *manager)
+twice_init(TaskManager *manager,int *data, int length)
 {
 
-    int *data = (int*)manager->allocate(sizeof(int)*length);
 
     for (int i = 0; i < length; i++) {
 	data[i] = i;
@@ -79,16 +78,18 @@
      * Create Task
      *   create_task(Task ID);
      */ 
-    int size = Task::calc_size(2,2,2);
-    printf("allocate task size 0x%0x\n",size);
-    printf("allocate task total size 0x%0x\n",(size *= count));
 
-    memaddr task_buf = (memaddr)manager->allocate(size);
-    HTask *twice_main = manager->create_task(TaskArray, task_buf, size, 0, 0);
+    HTask *twice_main = manager->create_task_array(Twice,count,2,2,2);
+    Task *t = twice_main->next_task_array(Twice, 0);
+    printf("allocate task size 0x%0x\n",t->size());
+    printf("allocate task total size 0x%0x = 0x%0x * %d\n",twice_main->r_size,
+		t->size(), count);
+    void *task_buf = twice_main->rbuf;
+    twice_main->set_post(twice_result, (void*)data, task_buf);
 
-    int pos = 0;
+    t = 0;
     for(int i = 0;i<count;i++) {
-	Task *t = twice_main->create_task_array(Twice,pos);
+	t = twice_main->next_task_array(Twice, t);
 	int length2 = length/2;
         //  以下の順序でデータを追加する必要がある。
         //  length を先に指定すればsetは後からでも良い。
@@ -96,35 +97,31 @@
 	 * 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->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());
+	print_ListData(2,t->inData(0));
 	/**
 	 * Set of Output area
 	 *   add_outData(address of output area, size of output area);
 	 */
-	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());
+	print_ListData(2,t->outData(0));
+	data += length;
+	printf("pos 0x%0lx size 0x%0x\n",(unsigned long)t, t->size());
     }
-    twice_main->spawn_task_array(pos);
+    twice_main->spawn_task_array(t->next());
 
     twice_main->set_cpu(SPE_ANY);
     /*
      * set_post() で ppe task を渡せるようにしたい
      */
-    twice_main->set_post(twice_result, (void*)data, (void*)task_buf);
     // add Active Queue
     twice_main->spawn();    
 }
@@ -141,7 +138,8 @@
     task_init();
 
     for (int i = 0; i < task; ++i) {
-	twice_init(manager);
+	int *data = (int*)manager->allocate(sizeof(int)*length*count);
+	twice_init(manager, data, length);
     }
 
     return 0;