changeset 640:a909c50081c2

SimpeTask on Cell worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 20 Nov 2009 23:12:34 +0900
parents 70c5c2d2eb24
children 0692b08f1cd6
files TaskManager/Cell/CellHTaskInfo.cc TaskManager/Cell/CellHTaskInfo.h TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/ChangeLog TaskManager/Fifo/FifoDmaManager.cc TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Fifo/MainScheduler.cc TaskManager/kernel/ppe/MailManager.cc TaskManager/kernel/ppe/MailManager.h example/Simple/ppe/Twice.cc example/Simple/spe/Twice.cc
diffstat 12 files changed, 72 insertions(+), 104 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/CellHTaskInfo.cc	Thu Nov 19 18:45:24 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include "CellHTaskInfo.h"
-
--- a/TaskManager/Cell/CellHTaskInfo.h	Thu Nov 19 18:45:24 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-#ifndef INCLUDED_CELL_HTASK_INFO
-#define INCLUDED_CELL_HTASK_INFO
-
-#include "HTaskInfo.h"
-
-class CellHTaskInfo : public HTaskInfo {
-public:
-    /* functions */
-};
-
-#endif
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -172,7 +172,9 @@
  *
  * @return PPE Scheduler に対してのメール。
  *         次に実行する TaskList のアドレスや、終了コマンドを送る
- */TaskListPtr
+ */
+
+TaskListPtr
 CellTaskManagerImpl::mail_check(MailQueuePtr mail_list)
 {
     // PPE Scheduler からの mail check
@@ -284,36 +286,6 @@
     flag_sendTaskList[id] = 0;
 }
 
-#if 0
-void*
-CellTaskManagerImpl::allocate(int size, int alignment)
-{
-    if (size==0) return 0;
-    void *buff;
-    posix_memalign(&buff, alignment, size);
-    return buff;
-}
-
-void*
-CellTaskManagerImpl::allocate(int size)
-{
-    if (size==0) return 0;
-    void *buff;
-    
-    posix_memalign(&buff, DEFAULT_ALIGNMENT, size);
-
-    // bzero はコストが高いのでやりたくない
-    // bzero(buff, size);
-
-    return buff;
-}
-
-Scheduler*
-CellTaskManagerImpl::get_scheduler()
-{
-    return ppeManager->get_scheduler();
-}
-#endif
 
 #ifdef __CERIUM_CELL__
 TaskManagerImpl*
--- a/TaskManager/ChangeLog	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/ChangeLog	Fri Nov 20 23:12:34 2009 +0900
@@ -1,3 +1,15 @@
+2009-11-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+mail_sendQueue の実装がだめ。こういう実装をすると、queue の
+正しさを関数の中に閉じ込められない。なんか、無限リストにな
+っているらしい。参照が、渡り歩いているどこかの場所でダメに
+なっているらしい。
+
+実際、mail_sendQueue は、free list に置き換わってしまう。
+これまで、これがおかしならなかった理由は不明。
+
+connector に外から手を入れないで、ちゃんとfunction callするべし。
+
 2009-11-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
 finish_task を全員が待つ設定で、finish_task を終了判定に
--- a/TaskManager/Fifo/FifoDmaManager.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/Fifo/FifoDmaManager.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -31,6 +31,12 @@
     mail_sendQueue
 	= MailManager::append_mailQueue(mail_sendQueue,
 					mailManager->create(data));
+#if 0
+    if (MailManager::length(mail_sendQueue)== -1) {
+       fprintf(stderr,"Mail Queue Error\n");
+       exit(1);
+    }
+#endif
 }
 
 memaddr
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -10,7 +10,7 @@
 FifoTaskManagerImpl::~FifoTaskManagerImpl()
 {
     delete mailManager;
-    delete scheduler;
+    delete mainScheduler;
 
     delete taskListImpl  ;
     delete taskQueueImpl ;
@@ -29,11 +29,11 @@
     mailManager = new MailManager();
     mailManager->init(20);
 
-    scheduler = new MainScheduler();
-    scheduler->init(this);
-    scheduler->set_mailManager(mailManager);
-    scheduler->id = 0;
-    set_scheduler(scheduler);
+    mainScheduler = new MainScheduler();
+    mainScheduler->init(this);
+    mainScheduler->set_mailManager(mailManager);
+    mainScheduler->id = 0;
+    set_scheduler(mainScheduler);
 
     taskListImpl  = new TaskListInfo;
     taskQueueImpl = new TaskQueueInfo;
@@ -42,7 +42,7 @@
     mainTaskList = taskListImpl->create();
 
     schedTaskManager = new SchedTask();
-    schedTaskManager->init(0,0,0,scheduler);
+    schedTaskManager->init(0,0,0,mainScheduler);
 
 }
 
@@ -59,10 +59,10 @@
     mailManager->init(20);
 
     //scheduler = new MainScheduler();
-    scheduler = _sched;
-    scheduler->init(this);
-    scheduler->set_mailManager(mailManager);
-    set_scheduler(scheduler);
+    mainScheduler = _sched;
+    mainScheduler->init(this);
+    mainScheduler->set_mailManager(mailManager);
+    set_scheduler(mainScheduler);
 
     taskListImpl  = tm-> taskListImpl  ;
     taskQueueImpl = tm-> taskQueueImpl ;
@@ -171,10 +171,16 @@
 	in_mail_list = MailManager::append_mailQueue(in_mail_list, sentinel);
 
 	// scheduler は受け取ったメールを元に実行する
-	scheduler->send_mailList(in_mail_list);
-	scheduler->run();
+	mainScheduler->send_mailList(in_mail_list);
+	mainScheduler->run();
     }
-    out_mail_list = scheduler->recv_mailList();
+    out_mail_list = mainScheduler->recv_mailList();
+#if 0
+    if (MailManager::length(out_mail_list )==-1) {
+	fprintf(stderr, "Error on mail list\n");
+	exit(0);
+    }
+#endif
 
     return out_mail_list;
 }
@@ -208,6 +214,8 @@
 
         if (data == (memaddr)MY_SPE_STATUS_READY) {
             __debug_ppe("mail_check(): Task List finish\n");
+        } else if (data == (memaddr)MY_SPE_COMMAND_EXIT) {
+            __debug_ppe("mail_check(): Task List finish COMMAND\n");
         } else if (data != (memaddr)MY_SPE_NOP) {
             __debug_ppe("mail_check(): recv from 0x%x\n", data);
 	    // post_func を先に実行しないと、systask_finish が active_queue
@@ -224,38 +232,6 @@
     }
 }
 
-#if 0
-void*
-FifoTaskManagerImpl::allocate(int size, int alignment)
-{
-    if (size==0) return 0;
-#if defined(__APPLE__) && ! defined(HAS_POSIZ_MEMALIGN)
-    return malloc(size);
-#else
-    void *buff;
-    posix_memalign(&buff, alignment, size);
-    return buff;
-#endif
-}
-
-void*
-FifoTaskManagerImpl::allocate(int size)
-{
-    if (size==0) return 0;
-#if defined(__APPLE__) && ! defined(HAS_POSIZ_MEMALIGN)
-    return malloc(size);
-#else
-    void *buff;
-    posix_memalign(&buff, DEFAULT_ALIGNMENT, size);
-    return buff;
-#endif
-}
-
-Scheduler*
-FifoTaskManagerImpl::get_scheduler() {
-    return scheduler;
-}
-#endif
 
 /**
  * # # # # # # # # 
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.h	Fri Nov 20 23:12:34 2009 +0900
@@ -16,7 +16,7 @@
     TaskListPtr mainTaskList;  // activeTask であるべきなんじゃないの?
 
     MailManager *mailManager;
-    MainScheduler *scheduler;
+    MainScheduler *mainScheduler;
 
     /* functions */
     // call by system
--- a/TaskManager/Fifo/MainScheduler.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/Fifo/MainScheduler.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -34,7 +34,9 @@
 MailQueuePtr
 MainScheduler::recv_mailList(void)
 {
-    return ((FifoDmaManager*)connector)->mail_sendQueue;
+    MailQueuePtr m = ((FifoDmaManager*)connector)->mail_sendQueue;
+    ((FifoDmaManager*)connector)->mail_sendQueue = 0;
+    return m;
 }
 
 
@@ -49,13 +51,4 @@
     mainMemList[id] = (memaddr)allocate(size);
 }
 
-#if 0
-/**
- * MainScheduler.h に書いてます
- */ 
-void
-MainScheduler::mainMem_wait(void)
-{
-    // 何もしねえ
-}
-#endif
+/* end */
--- a/TaskManager/kernel/ppe/MailManager.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/kernel/ppe/MailManager.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -98,3 +98,24 @@
 	return list;
     }
 }
+
+int
+MailManager::length(MailQueuePtr list)
+{
+    MailQueuePtr p = list;
+    MailQueuePtr q = p;
+    int i = 0;
+
+    while(p) {
+	i++;
+	p=p->next;
+	if (i%2==0) {
+	    q = q->next;
+	}
+	if (p==q)
+	    return -1; // means loop
+    }
+    return i;
+}
+
+/* end */
--- a/TaskManager/kernel/ppe/MailManager.h	Thu Nov 19 18:45:24 2009 +0900
+++ b/TaskManager/kernel/ppe/MailManager.h	Fri Nov 20 23:12:34 2009 +0900
@@ -19,6 +19,7 @@
     MailQueuePtr create(memaddr data);
     void free(MailQueuePtr q);
     static MailQueuePtr append_mailQueue(MailQueuePtr list, MailQueuePtr q);
+    static int length(MailQueuePtr list);
 
 private:
     /* variables */
--- a/example/Simple/ppe/Twice.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/example/Simple/ppe/Twice.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -20,6 +20,7 @@
     for (int i = 0; i < length; i++) {
 	o_data[i] = i_data[i] * 2;
     }
+    s->printf("PPE %d end\n",s->get_cpuid());
     
     return 0;
 }
--- a/example/Simple/spe/Twice.cc	Thu Nov 19 18:45:24 2009 +0900
+++ b/example/Simple/spe/Twice.cc	Fri Nov 20 23:12:34 2009 +0900
@@ -20,6 +20,7 @@
     for (int i = 0; i < length; i++) {
 	o_data[i] = i_data[i] * 2;
     }
+    s->printf("SPE %d end\n",s->get_cpuid());
     
     return 0;
 }