changeset 10:7aa4c006e4be

*** empty log message ***
author gongo
date Wed, 06 Feb 2008 18:31:30 +0900
parents 964b3b27846d
children 587baff06cbc
files TaskManager/Changelog TaskManager/Fifo/FifoTaskInfo.cc TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Makefile.def TaskManager/Test/Sum/main.cpp TaskManager/kernel/ppe/TaskInfo.cc TaskManager/kernel/spe/SpeTask.cc TaskManager/kernel/spe/SpeTaskList.cc include/TaskManager/FifoTaskInfo.h include/TaskManager/SpeTask.h include/TaskManager/TaskInfo.h
diffstat 11 files changed, 157 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/Changelog	Wed Feb 06 18:31:30 2008 +0900
@@ -0,0 +1,61 @@
+2008-02-06  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* kernel/spe/*.cpp: new と placement new
+	現在、spe kernel のタスクは、切り替わる毎に
+	new/delete を繰り返しています。今はこれでいいんだけど、
+	速度的にも、いずれは直さないといけないと思うわけで。
+	で、予め allocate された領域を利用した placement new を使えば
+	new よりもそれなりに早くなるっぽい。
+	例題として、与えられた回数分 new/delete を繰り返すプログラムと、
+	同じ回数分、placement new したときの速度の比較
+
+	for (int i = 0; i < num; i++) {
+
+	<   task = new Task;
+	<   task->init(i);
+	<   task->printID();
+	<   delete task;
+	---
+	>   task = new(buff) Task; // buff = malloc(BUFF_SIZE);
+	>   task->init(id);
+	>   task->printID(id);
+	}
+	
+	placement new では、delete の必要は無い。
+	その中で新たに allocate してるなら必要かもしれないが。
+	速度比較は以下。no_new が placement new で、ln_new が new/delete 。
+
+	% ./a.out 10 // 10 回
+	no_new:         time: 0.012135(msec)
+	ln_new:         time: 0.003572(msec)
+
+	% ./a.out 100
+	no_new:         time: 0.022453(msec)
+	ln_new:         time: 0.018989(msec)
+
+	% ./a.out 1000
+	no_new:         time: 0.115277(msec)
+	ln_new:         time: 0.136335(msec)
+
+	% ./a.out 10000
+	no_new:         time: 1.056156(msec)
+	ln_new:         time: 1.322709(msec)
+
+	% ./a.out 100000
+	no_new:         time: 10.622221(msec)
+	ln_new:         time: 13.362414(msec)
+
+	% ./a.out 1000000
+	no_new:         time: 109.436496(msec)
+	ln_new:         time: 136.956872(msec)
+
+	10、100 回だと負けてるが、まあ無視しよう(ぇ
+	回数が多くなるにつれて、ほんの少しだが no_new が勝ってる。
+	どうなんだろうね。ちなみに printID を無くすと
+
+	% ./a.out 1000000
+	no_new:         time: 0.008512(msec)
+	ln_new:         time: 27.100296(msec)
+
+	I/O に左右され過ぎ。まあそんなもんだろうけどさ。
+	
--- a/TaskManager/Fifo/FifoTaskInfo.cc	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/Fifo/FifoTaskInfo.cc	Wed Feb 06 18:31:30 2008 +0900
@@ -2,27 +2,6 @@
 #include <stdlib.h>
 #include "FifoTaskInfo.h"
 
-void
-FifoTaskInfo::init(void)
-{
-    taskListPool = NULL;
-    freeTaskList = NULL;
-
-    taskQueuePool = NULL;
-    freeTaskQueue = NULL;
-    activeTaskQueue = NULL;
-    waitTaskQueue = NULL;
-
-    taskPool = NULL;
-    freeTask = NULL;
-    
-    init_taskList(2);
-    init_taskQueue(TASK_MAX_SIZE*4);
-    init_task(TASK_MAX_SIZE);
-
-    machineTaskList = get_free_taskList();
-}
-
 int
 FifoTaskInfo::extend_pool_taskList(int num)
 {
@@ -52,7 +31,7 @@
 {
     TaskListPtr list, q;
 
-    list = machineTaskList;
+    list = machineTaskList[0];
 
     while (list->next) list = list->next;
 
@@ -60,7 +39,7 @@
 	return list;
     } else {
 	q = get_free_taskList();
-	machineTaskList = append_taskList(machineTaskList, q);
+	machineTaskList[0] = append_taskList(machineTaskList[0], q);
 	return q;
     }
 }
@@ -70,9 +49,9 @@
 {
     TaskListPtr p, p1;
 
-    machineTaskList->length = 0;
+    machineTaskList[0]->length = 0;
 
-    p = machineTaskList->next;
+    p = machineTaskList[0]->next;
     while (p) {
 	p1 = p;
 	p = p->next;
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Wed Feb 06 18:31:30 2008 +0900
@@ -99,14 +99,18 @@
 	data = q->data;
 
 	if (data == MY_SPE_STATUS_READY) {
-	    //printf("[FIFO] finish\n");
+#ifdef _PPE_DEBUG
+	    printf("[FIFO] finish\n");
+#endif
 	    next_list = set_task();
 	    if (next_list != NULL) {
 		d = mailManager->create_mail((unsigned int)next_list);
 		ret = append_mailQueue(ret, d);
 	    }
 	} else {
-	    //printf("[PPE] recv from : 0x%x\n", data);
+#ifdef _PPE_DEBUG
+	    printf("[PPE] recv from : 0x%x\n", data);
+#endif
 	    taskInfo->check_task_finish((HTaskPtr)data);
 	}
 
--- a/TaskManager/Makefile.def	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/Makefile.def	Wed Feb 06 18:31:30 2008 +0900
@@ -20,7 +20,7 @@
 IMPL_CELL_OBJS = $(IMPL_CELL_SRCS:.cpp=.o)
 
 CC     = g++
-CFLAGS = -Wall -g -O2
+CFLAGS = -Wall -g -O2 -D_PPE_DEBUG
 LIBS   = 
 
 INCLUDE = -I../include/TaskManager
\ No newline at end of file
--- a/TaskManager/Test/Sum/main.cpp	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/Test/Sum/main.cpp	Wed Feb 06 18:31:30 2008 +0900
@@ -42,7 +42,7 @@
     last = manager->create_task(5, sizeof(int)*256,
 				(Uint32)buff, (Uint32)&out[0], NULL);
 
-#if 0
+#if 1
     for (i = 0; i < div-1; i++) {
 	manager->set_task_depend(task[i], task[i+1]);
     }
--- a/TaskManager/kernel/ppe/TaskInfo.cc	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/kernel/ppe/TaskInfo.cc	Wed Feb 06 18:31:30 2008 +0900
@@ -7,6 +7,31 @@
     machineNum = num;
 }
 
+void
+TaskInfo::init(void)
+{
+    taskListPool = NULL;
+    freeTaskList = NULL;
+
+    taskQueuePool = NULL;
+    freeTaskQueue = NULL;
+    activeTaskQueue = NULL;
+    waitTaskQueue = NULL;
+
+    taskPool = NULL;
+    freeTask = NULL;
+
+    init_taskList(machineNum*2);
+    init_taskQueue(TASK_MAX_SIZE*4);
+    init_task(TASK_MAX_SIZE*2);
+
+    machineTaskList = new TaskListPtr[machineNum];
+
+    for (int i = 0; i < machineNum; i++) {
+	machineTaskList[i] = get_free_taskList();
+    }
+}
+
 /**
  * initialize pool of task_pack_list
  * @return if (success) ? 0 : -1
@@ -278,6 +303,50 @@
     return list;    
 }
 
+
+void
+TaskInfo::finish(void)
+{
+    destroy_taskList();
+    destroy_taskQueue();
+    destroy_task();
+
+    delete [] machineTaskList;
+}
+
+void
+TaskInfo::destroy_taskList(void)
+{
+    TaskListPtr q;
+
+    for (q = taskListPool; q; q = q->next) {
+	free(q);
+    }
+    freeTaskList = taskListPool = NULL;
+}
+
+void
+TaskInfo::destroy_taskQueue(void)
+{
+    TaskQueuePtr q;
+
+    for (q = taskQueuePool; q; q = q->next) {
+	free(q);
+    }
+    freeTaskQueue = taskQueuePool = NULL;
+}
+
+void
+TaskInfo::destroy_task(void)
+{
+    HTaskPtr q;
+
+    for (q = taskPool; q; q = q->next) {
+	free(q);
+    }
+    freeTask = taskPool = NULL;
+}
+
 TaskListPtr
 append_taskList(TaskListPtr list, TaskListPtr q)
 {
--- a/TaskManager/kernel/spe/SpeTask.cc	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/kernel/spe/SpeTask.cc	Wed Feb 06 18:31:30 2008 +0900
@@ -161,8 +161,6 @@
 
 	// 本当は、ここで task->command に対応する、
 	// SpeTask を継承する class を作ればいい。。。はず
-	return TaskFactory(
-	
 	return new SpeTask(list, &list->tasks[--list->length],
 			   m->get_curReadBuf(), m->get_curWriteBuf(),
 			   connector);
--- a/TaskManager/kernel/spe/SpeTaskList.cc	Wed Feb 06 18:31:30 2008 +0900
+++ b/TaskManager/kernel/spe/SpeTaskList.cc	Wed Feb 06 18:31:30 2008 +0900
@@ -47,7 +47,11 @@
     if (list->length < 1) {
 	return new SpeNop2Ready(connector);
     } else {
-	return new SpeTask(list, m->get_curReadBuf(),
-			   m->get_curWriteBuf(), connector);
+	// 本当は、ここで task->command に対応する、
+	// SpeTask を継承する class を作ればいい。。。はず
+	return new SpeTask(list, &list->tasks[--list->length],
+			   m->get_curReadBuf(),
+			   m->get_curWriteBuf(),
+			   connector);
     }
 }
--- a/include/TaskManager/FifoTaskInfo.h	Wed Feb 06 18:31:30 2008 +0900
+++ b/include/TaskManager/FifoTaskInfo.h	Wed Feb 06 18:31:30 2008 +0900
@@ -8,13 +8,11 @@
 class FifoTaskInfo : public TaskInfo {
 public:
     /* function */
-    void init(void);
     int extend_pool_taskList(int num);
     TaskListPtr get_available_taskList(void);
     void clear_taskList(void);
 
     /* variables */
-    TaskListPtr machineTaskList;
 };
 
 #endif
--- a/include/TaskManager/SpeTask.h	Wed Feb 06 18:31:30 2008 +0900
+++ b/include/TaskManager/SpeTask.h	Wed Feb 06 18:31:30 2008 +0900
@@ -8,7 +8,7 @@
 class SpeTask : public SpeTaskBase {
 public:
     /* constructor */
-    SpeTask(TaskListPtr, void*, void*, DmaManager*);
+    SpeTask(TaskListPtr, TaskPtr, void*, void*, DmaManager*);
 
     /* variables */
     TaskListPtr list;
--- a/include/TaskManager/TaskInfo.h	Wed Feb 06 18:31:30 2008 +0900
+++ b/include/TaskManager/TaskInfo.h	Wed Feb 06 18:31:30 2008 +0900
@@ -23,8 +23,10 @@
     HTaskPtr taskPool;
     HTaskPtr freeTask;
 
+    TaskListPtr *machineTaskList;
+
     /* function */
-    virtual void init(void) = 0;
+    void init(void);
 
     // task list
     int init_taskList(int num);
@@ -44,6 +46,11 @@
 			  unsigned long long in_addr,
 			  unsigned long long out_addr);
 
+    void finish(void);
+    void destroy_taskList(void);
+    void destroy_taskQueue(void);
+    void destroy_task(void);
+
     virtual void clear_taskList(void) = 0;
 
     void append_activeTask(HTaskPtr);