# HG changeset patch
# User game@zeus.cr.ie.u-ryukyu.ac.jp
# Date 1276047204 -32400
# Node ID 0718a4e4045006f4e518917150f967cbb6038d30
# Parent 0729db4d99fee4af71b4ab4a5a9cc5c65aa733ac
fix
diff -r 0729db4d99fe -r 0718a4e40450 Document/Cerium2010.mm
--- a/Document/Cerium2010.mm Mon Jun 07 15:07:30 2010 +0900
+++ b/Document/Cerium2010.mm Wed Jun 09 10:33:24 2010 +0900
@@ -46,7 +46,9 @@
-
+
+
+
@@ -169,7 +171,8 @@
-
+
+
diff -r 0729db4d99fe -r 0718a4e40450 TaskManager/Cell/CellTaskManagerImpl.cc
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Mon Jun 07 15:07:30 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc Wed Jun 09 10:33:24 2010 +0900
@@ -25,15 +25,17 @@
{
spe_running = 0;
+ // 実行可能な HTask のリスト。 FifoTaskManager と共有される
activeTaskQueue = new HTaskInfo();
-
+ // HTask の factory。 HTaskInfo ならなんでもいい。
htaskImpl = activeTaskQueue ; // any HTaskInfo
-
+
speThreads = new SpeThreads(machineNum);
speThreads->init();
- speTaskList = new TaskListInfoPtr[machineNum];
- taskListInfo = new TaskListInfoPtr[machineNum];
+ // 実行される Task 用の パイプライン用のダブルバッファ
+ speTaskList = new TaskListInfoPtr[machineNum]; // spe上の走っている Task の配列
+ taskListInfo = new TaskListInfoPtr[machineNum]; // 次に走る Task の配列
for (int i = 0; i < machineNum; i++) {
taskListInfo[i] = new TaskListInfo();
@@ -44,10 +46,13 @@
ppeManager = new FifoTaskManagerImpl(machineNum);
// 大半のTaskQueueInfoは、共有される
MainScheduler *mscheduler = new MainScheduler;
- ppeManager->init(mscheduler, this);
+ ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。
ppeManager->get_scheduler()->set_manager(this);
+ // Task 内からManager->task_create() とかするときに必要なTaskManager。
+ // 現状では ppe 側からしか動かない
+ // spe 側から Task create できない
schedTaskManager = new SchedTask();
schedTaskManager->init(0,0,0,ppeManager->get_scheduler());
}
@@ -134,8 +139,8 @@
// SPE side
do {
poll();
- } while (ppeManager->activeTaskQueue->empty() && spe_running >0 );
- } while (!ppeManager->activeTaskQueue->empty() || spe_running >0);
+ } while (activeTaskQueue->empty() && spe_running >0 );
+ } while (!activeTaskQueue->empty() || spe_running >0);
if (!waitTaskQueue->empty()) {
get_scheduler()->printf("Dead lock detected\n");
}
@@ -155,6 +160,8 @@
while (speThreads->has_mail(id, 1, &data)) {
if (data == (memaddr)MY_SPE_STATUS_READY) {
// MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
+ // freeAll する前に循環リストに戻す
+ speTaskList[id]->getLast()->next = speTaskList[id];
speTaskList[id]->freeAll();
spe_running--;
} else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
@@ -223,10 +230,15 @@
CellTaskManagerImpl::send_taskList(int id)
{
if (taskListInfo[id]->empty()) return;
+ // speTaskList は走り終わった ppe の Task の List.
+ // taskListInfo はこれから走る Task の List.
+ // 交換して実行する
TaskListInfoPtr tmp = taskListInfo[id];
taskListInfo[id] = speTaskList[id];
speTaskList[id] = tmp;
+ // speTaskList は本来は循環リストなのだけど、実行中は線形リストである。
+ // spe の Task が終了した時点でなおす。
tmp->getLast()->next = 0;
TaskListPtr p = tmp->getFirst();
speThreads->send_mail(id, 1, (memaddr *)&p);
diff -r 0729db4d99fe -r 0718a4e40450 TaskManager/Fifo/FifoTaskManagerImpl.cc
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Mon Jun 07 15:07:30 2010 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Wed Jun 09 10:33:24 2010 +0900
@@ -22,9 +22,9 @@
}
/**
+ * FifoTaskManager 単独で走るときの初期化
* MailManager は PPE スケジューラとのメール交換、
* FifoScheduler は PPE 側のスケジューラ
- * BufferManager は Task、TaskList などのメモリ管理(大層なことしてないが
*/
void
FifoTaskManagerImpl::init()
@@ -124,9 +124,14 @@
FifoTaskManagerImpl::sendTaskList()
{
if (taskListInfo->empty()) return;
+ // ppeTaskList は走り終わった ppe の Task の List.
+ // taskListInfo はこれから走る Task の List.
+ // 交換して実行する
TaskListInfoPtr tmp = ppeTaskList;
ppeTaskList = taskListInfo;
taskListInfo = tmp;
+ // ppeTaskList は本来は循環リストなのだけど、実行中は線形リストである。
+ // なので、最後に 0 を代入する. 後でなおす。
ppeTaskList->getLast()->next = 0;
// TaskList のアドレスを送る
mainScheduler->mail_write_from_host((memaddr)ppeTaskList->getFirst());
@@ -138,6 +143,9 @@
// scheduler は受け取ったメールを元に実行する
mainScheduler->run(new SchedNop());
// すべてのlistを実行するまで戻らない
+
+ ppeTaskList->getLast()->next = ppeTaskList;
+
}
/**
diff -r 0729db4d99fe -r 0718a4e40450 TaskManager/kernel/ppe/TaskListInfo.cc
--- a/TaskManager/kernel/ppe/TaskListInfo.cc Mon Jun 07 15:07:30 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskListInfo.cc Wed Jun 09 10:33:24 2010 +0900
@@ -73,7 +73,7 @@
TaskListInfo::freeAll()
{
TaskListPtr t;
- if (getLast()->next==0) getLast()->next = this;
+ //if (getLast()->next==0) getLast()->next = this;
while((t=poll())) free_(t);
}
diff -r 0729db4d99fe -r 0718a4e40450 TaskManager/kernel/ppe/TaskManagerImpl.cc
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Jun 07 15:07:30 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Wed Jun 09 10:33:24 2010 +0900
@@ -19,9 +19,13 @@
TaskManagerImpl::TaskManagerImpl(int num)
: machineNum(num){
+ // 実行可能なHTaskのリスト
activeTaskQueue = new HTaskInfo();
+ // wait_forで止まっているHTaskのリスト。必要ないが、Dead lock detection に使う
waitTaskQueue = new HTaskInfo();
+ // HTask の factory. HTaskInfo ならなんでもいい。
htaskImpl = waitTaskQueue ; // any HTaskInfo
+ // Task の dependency を表現する double linked list. HTaskInfo とは別に必要。
taskQueueImpl = new TaskQueueInfo();
}
diff -r 0729db4d99fe -r 0718a4e40450 TaskManager/kernel/ppe/TaskQueue.h
--- a/TaskManager/kernel/ppe/TaskQueue.h Mon Jun 07 15:07:30 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskQueue.h Wed Jun 09 10:33:24 2010 +0900
@@ -6,6 +6,10 @@
class HTask;
class TaskQueue {
+
+ /**
+ HTask 間の dependency を表すリスト。HTask の wait_me と wait_i がこれ。
+ */
public:
TaskQueue(HTask *q = NULL);