changeset 19:fe6ea065e36a

Update
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 02 Aug 2016 17:45:20 +0900
parents a9a91f4a6688
children 3d6b9e5ae730
files 2016/2016_07_26/slide.md
diffstat 1 files changed, 115 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2016/2016_07_26/slide.md	Tue Aug 02 17:45:20 2016 +0900
@@ -0,0 +1,115 @@
+title: Gears OS
+author: Tatsuki IHA
+profile:
+lang: Japanese
+code-engine: coderay
+
+# 研究目的
+- 当研究室では  処理の単位を Code Gear、 データの単位を Data Gear を用いて 信頼性が高い並列処理を行う Gears OS を開発している
+- Gears OS では Task を Code Gear と実行するときに必要な Input Data Gear と出力するための Output Data Gear の組で表現される。 Input Data Gear/Output Data Gear によって依存関係が決定し、それにそって並列実行を行う
+- 現在のGears OS は 依存関係がある並列処理を行うことが出来ない。 今研究ではGears OS の依存関係の解決を目標とする
+
+# 今週
+- Task を実行した後に終わったことを TaskManager に通知する
+- まだコードにできてない
+
+# Cerium の実装
+- FifoTaskManagerImpl の run
+- mail のチェックを polling している
+
+``` c++
+void
+FifoTaskManagerImpl::run()
+{
+    do {
+        poll1();
+    } while(!activeTaskQueue->empty()) ;
+
+    if (!waitTaskQueue->empty()) {
+        get_scheduler()->printf("Dead lock detected\n");
+    }
+}
+
+
+void
+FifoTaskManagerImpl::poll1()
+{
+    set_runTaskList1(activeTaskQueue);
+    // list を実行する
+    sendTaskList();
+    // ppe scheduler からの mail を調べる
+    mail_check();
+}
+```
+
+# Cerium の実装
+- FifoTaskManagerImpl の mail_check
+- NOP が スケジューラーから MY_SPE_NOP が送られたら check_task_list_finish をよぶ
+
+``` c++
+void
+FifoTaskManagerImpl::mail_check()
+{
+    while (mainScheduler->has_mail_from_host()) {
+        memaddr data = mainScheduler->mail_read_from_host();
+        
+        if (data == (memaddr)MY_SPE_STATUS_READY) {
+            __debug_ppe(this->scheduler, "mail_check(): Task List finish\n");
+            ppeTaskList->freeAll(); 
+        } else if (data == (memaddr)MY_SPE_COMMAND_EXIT) {
+            __debug_ppe(this->scheduler, "mail_check(): Task List finish COMMAND\n");
+        } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
+            send_alloc_reply(this, 0, mainScheduler);
+        } else if (data != (memaddr)MY_SPE_NOP) {
+            __debug_ppe(this->scheduler, "mail_check(): recv from 0x%x\n", data);
+            TaskListPtr list = (TaskListPtr)data;
+            check_task_list_finish(schedTaskManager, list, waitTaskQueue);
+        }
+    }
+}
+```
+
+# Cerium の実装
+
+``` c++
+void
+TaskManagerImpl::check_task_finish(HTaskPtr me, QueueInfo<HTask> *wait_queue)
+{
+    if (_export_task_log)
+        tasklog->finish_time = rdtsc();
+
+    while(TaskQueue *p = me->wait_me->poll()) {
+        HTaskPtr you = p->task;
+        QueueInfo<TaskQueue> *wait_i = you->wait_i;
+        // 相手の wait queue から自分(を指しているTaskQueue)を削除
+        wait_i->remove(p->waiter);
+        // queue を free する
+        wait_i->free_(p->waiter);
+        
+        if (wait_i->empty()) {
+            wait_queue->remove(you);
+            append_activeTask(you);
+        }
+
+        wait_i->free_(p);   // p->wait_i, p->wait_me は再利用される
+    }
+    me->self = 0;
+    if (!me->flag.no_auto_free)
+	htaskImpl->free_(me);
+}
+
+void
+TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue)
+{
+    HTask *me = list->self;
+    if (me) {
+        me->post_func(s, me->post_arg1, me->post_arg2);
+        check_task_finish(me, wait_queue);
+    }
+}
+```
+
+# Gears でどうする?
+- Gears では Output Data Gear に 待っているTaskを入れている
+- なので、 その Output Data Gear を入れる List の構造 を TaskManager を含む全ての Thread で共有する
+- Task Manager は ODG が入っている List を見て 依存関係の解決をする?