# HG changeset patch # User Yutaka Kinjyo # Date 1282858756 -32400 # Node ID d093d601fc14a59cecf603fdd6266efda60814fb # Parent ff3ead9eaa3c1c6081e1b018d368713e3da1e1d4 fix diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Fri Aug 27 06:39:16 2010 +0900 @@ -56,7 +56,7 @@ // 現状では ppe 側からしか動かない // spe 側から Task create できない schedTaskManager = new SchedTask(); - schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); + schedTaskManager->init(0,0,0,ppeManager->get_scheduler(),0); ppeManager->schedTaskManager = schedTaskManager; } diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Aug 27 06:39:16 2010 +0900 @@ -44,7 +44,7 @@ schedTaskManager = new SchedTask(); others = 0; - schedTaskManager->init(0,0,0,mainScheduler); + schedTaskManager->init(0,0,0,mainScheduler,0); } diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/kernel/schedule/SchedMail.cc --- a/TaskManager/kernel/schedule/SchedMail.cc Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedMail.cc Fri Aug 27 06:39:16 2010 +0900 @@ -14,6 +14,7 @@ if ((memaddr)params_addr == (memaddr)MY_SPE_COMMAND_EXIT) { return new SchedExit(); } else { - return new SchedTaskList(params_addr, scheduler); + int dma_tag_switch = 0; + return new SchedTaskList(params_addr, scheduler, dma_tag_switch); } } diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Fri Aug 27 06:39:16 2010 +0900 @@ -39,12 +39,13 @@ } void -SchedTask::init(TaskListPtr _list, TaskPtr _task, int index, Scheduler* sc) +SchedTask::init(TaskListPtr _list, TaskPtr _task, int index, Scheduler* sc, int tag) { list = _list; task = _task; scheduler = sc; cur_index = index; + this->tag = tag; // scheduler->mainMem_wait(); // これはなんで? manager = sc->manager; @@ -73,7 +74,7 @@ if (task->r_size == 0) return; // load Input Data readbuf = manager->allocate(task->r_size); - scheduler->dma_load(readbuf, task->rbuf,task->r_size, DMA_READ); + scheduler->dma_load(readbuf, task->rbuf,task->r_size, DMA_READ + this->tag); } @@ -87,7 +88,7 @@ if (task->w_size > 0) { writebuf = manager->allocate(task->w_size); } - scheduler->dma_wait(DMA_READ); + scheduler->dma_wait(DMA_READ + this->tag); run(this, readbuf, writebuf); free(readbuf); @@ -123,7 +124,7 @@ TaskPtr nextTask = &list->tasks[cur_index]; SchedTask *nextSched = new SchedTask(); - nextSched->init(list, nextTask, cur_index+1, scheduler); + nextSched->init(list, nextTask, cur_index+1, scheduler, this->tag^1); // この時点で、TaskList は down load が済んでないことがある // 最初のTaskの種類に関しては、別な情報で渡す方が良い // あるいはTaskListの最初には、TaskArray1/TaskArray を置かない? @@ -145,7 +146,8 @@ return new SchedNop2Ready(scheduler); } else { // 新しいリストに取り掛かる - return new SchedTaskList(nextList, scheduler); + int dma_tag_switch = 0; + return new SchedTaskList(nextList, scheduler, dma_tag_switch); } } } diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Fri Aug 27 06:39:16 2010 +0900 @@ -33,7 +33,7 @@ /* functions */ void init(TaskListPtr _list, SimpleTaskPtr _task, int index, - Scheduler* sc); + Scheduler* sc, int tag); //--- User API --- int read_size() { return task->r_size; } diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/kernel/schedule/SchedTaskList.cc --- a/TaskManager/kernel/schedule/SchedTaskList.cc Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Fri Aug 27 06:39:16 2010 +0900 @@ -19,7 +19,7 @@ * 0: メインメモリ, 1: SPE */ -SchedTaskList::SchedTaskList(memaddr addr, Scheduler *sched) +SchedTaskList::SchedTaskList(memaddr addr, Scheduler *sched, int tag) { // next() で生成された時に、Task List read を始める params_addr = addr; @@ -29,6 +29,8 @@ scheduler->dma_load(list, params_addr, sizeof(TaskList), DMA_READ_TASKLIST); + this->tag = tag; + } diff -r ff3ead9eaa3c -r d093d601fc14 TaskManager/kernel/schedule/SchedTaskList.h --- a/TaskManager/kernel/schedule/SchedTaskList.h Thu Aug 26 20:40:08 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.h Fri Aug 27 06:39:16 2010 +0900 @@ -11,7 +11,7 @@ class SchedTaskList : public SchedTask { public: /* constructor */ - SchedTaskList(memaddr addr, Scheduler *sched); + SchedTaskList(memaddr addr, Scheduler *sched, int tag); BASE_NEW_DELETE(SchedTaskList); diff -r ff3ead9eaa3c -r d093d601fc14 example/word_count/main.cc --- a/example/word_count/main.cc Thu Aug 26 20:40:08 2010 +0900 +++ b/example/word_count/main.cc Fri Aug 27 06:39:16 2010 +0900 @@ -90,10 +90,40 @@ int loop = (task_count + spl - 1) / spl; for (int i = 0; i < loop; i += 1) { - + if (spl > w->task_num) { - spe_num = 1; - array_task_num = w->task_num; + if (w->task_num >= spe_num) { + array_task_num = w->task_num / spe_num; + } else { + + int task_num = w->task_num; + + for (int j = 0; j < task_num; j++) { + HTask *h_exec = 0; + int i = w->task_spwaned++; + + if (w->size < size) size = w->size; + + h_exec = manager->create_task(TASK_EXEC, + (memaddr)(w->file_mmap + i*w->division_size), size, + (memaddr)(w->o_data + i*w->out_size), w->division_out_size); + + if (all) { + w->t_print->wait_for(h_exec); + } else { + t_next->wait_for(h_exec); + } + + h_exec->set_cpu(SPE_ANY); + h_exec->spawn(); + + w->size -= size; + w->task_num--; + + } + + return; + } }