# HG changeset patch # User kkb # Date 1385091547 -32400 # Node ID 27f5b13ff58ccfd4ae6e83c8853b0ab2a770f996 # Parent f3770342ea9bccd270a21e6b53166839454d13de avoid duplicate excution when multidmesion and multidimension are mixed diff -r f3770342ea9b -r 27f5b13ff58c TaskManager/kernel/ppe/CpuThreads.cc --- a/TaskManager/kernel/ppe/CpuThreads.cc Fri Nov 22 11:17:59 2013 +0900 +++ b/TaskManager/kernel/ppe/CpuThreads.cc Fri Nov 22 12:39:07 2013 +0900 @@ -105,15 +105,17 @@ int CpuThreads::spawn_task(int id, TaskListPtr p) { p->self->flag.dim_count = 1; // always dim_count set min cpu. min cpu is 1. - - if (p->dim>0 && id >= id_offset) { + p->cpu = id - id_offset; + int dim_count = 0; + if ((dim_count = p->ismultidim()) && id >= id_offset) { // emulate ND_range in cpu - int dim_count = (p->x)*(p->y)*(p->z); if (cpu_num < dim_count) { dim_count = cpu_num; } - p->self->flag.dim_count = dim_count; + + // p may contains non multi_dimensional tasks, + // SchedTask skip these using p->cpu int i; for (i = 0; i < dim_count; i++) { send_mail(i+id_offset,1,(memaddr*)&p); diff -r f3770342ea9b -r 27f5b13ff58c TaskManager/kernel/ppe/TaskList.h --- a/TaskManager/kernel/ppe/TaskList.h Fri Nov 22 11:17:59 2013 +0900 +++ b/TaskManager/kernel/ppe/TaskList.h Fri Nov 22 12:39:07 2013 +0900 @@ -6,27 +6,52 @@ class HTask; -#define TASK_MAX_SIZE 31 +#define TASK_MAX_SIZE 29 class TaskList { // 1024 byte public: BASE_NEW_DELETE(TaskList); - long lastTask; // 4 byte - TaskList *next; // 4 byte - TaskList *prev; // 4 byte - TaskList *waiter; // 4 byte - HTask *self; // 4 byte - int dim; - size_t x,y,z; + long lastTask; // 8 byte + TaskList *next; // 8 byte + TaskList *prev; // 8 byte + TaskList *waiter; // 8 byte + HTask *self; // 8 byte + int dim; // 4 byte + int cpu; // 4 byte + size_t x,y,z; // 8*3 byte + unsigned long long task_start_time,task_end_time; // 8*2 byte Task tasks[TASK_MAX_SIZE]; // 32*TASK_MAX_SIZE - unsigned long long task_start_time,task_end_time; + TaskPtr last() { return (TaskPtr)(((memaddr)tasks)+lastTask); } void set_last(Task *t) { lastTask = ((memaddr)t) - ((memaddr)tasks); } void init() { lastTask = ((memaddr)&tasks[TASK_MAX_SIZE])-(memaddr)(tasks); waiter=this; dim=0;} void initOnce() { } void freeOnce() {} + int ismultidim() { + TaskList* p = this; + int dim_count = 0; + int dim_count_max = 0; + while(p) { + + if (p->dim>0) { + dim_count = (p->x)*(p->y)*(p->z); + if (dim_count_max < dim_count) dim_count_max = dim_count; + p->self->flag.dim_count = dim_count; + } + + p = p->next; + } + return dim_count_max; + } + void print() { + printf(""); + while(t) { + printf(t); + t = t->next(); + } + } } ; diff -r f3770342ea9b -r 27f5b13ff58c TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Fri Nov 22 11:17:59 2013 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Fri Nov 22 12:39:07 2013 +0900 @@ -185,8 +185,11 @@ __debug("[SchedTask:%s]\n", __FUNCTION__); if (cur_index == 0) { // 最初の一つ + while (!list->dim && list->cpu != scheduler->id) + list=(memaddr)list->next; + if (list == 0) return new SchedNop2Ready(scheduler); SchedTask *nextSched = new SchedTask(); - nextSched->init(list, &list->tasks[0], scheduler, this->tag^1); + nextSched->init(list, &list->tasks[cur_index], scheduler, this->tag^1); return nextSched; } TaskPtr nextTask = cur_index->next(); // ここで一個一個のtaskを取ってきてる @@ -199,10 +202,13 @@ nextSched->init(list, nextTask, scheduler, this->tag^1); return nextSched; } else { - memaddr nextList = (memaddr)list->next; + list = (memaddr)list->next; + while (!list->dim && list->cpu != scheduler->id) + list=(memaddr)list->next; + memaddr nextList = (memaddr)list; if (nextList == 0) { // もう何もする必要がない - + return new SchedNop2Ready(scheduler); } else { // 新しいリストに取り掛かる diff -r f3770342ea9b -r 27f5b13ff58c TaskManager/test/UtilizationTest/multiply Binary file TaskManager/test/UtilizationTest/multiply has changed