changeset 972:d093d601fc14

fix
author Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
date Fri, 27 Aug 2010 06:39:16 +0900
parents ff3ead9eaa3c
children 537d7aa24575 d1700a13513f
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/kernel/schedule/SchedMail.cc TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/SchedTaskList.cc TaskManager/kernel/schedule/SchedTaskList.h example/word_count/main.cc
diffstat 8 files changed, 49 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }
 
--- 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);
 
 }
 
--- 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);
     }
 }
--- 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);
         }
     }
 }
--- 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; }
--- 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;
+
 }
 
 
--- 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);
 
--- 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;
+	}
       }