changeset 1755:27f5b13ff58c draft

avoid duplicate excution when multidmesion and multidimension are mixed
author kkb
date Fri, 22 Nov 2013 12:39:07 +0900
parents f3770342ea9b
children 165e11832816
files TaskManager/kernel/ppe/CpuThreads.cc TaskManager/kernel/ppe/TaskList.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/test/UtilizationTest/multiply
diffstat 4 files changed, 49 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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();
+        }
+    }
 
 } ;
 
--- 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 {
             // 新しいリストに取り掛かる
Binary file TaskManager/test/UtilizationTest/multiply has changed