Mercurial > hg > Members > kono > Cerium
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);