Mercurial > hg > Members > innparusu > slides
view 2016/2016_07_26/slide.md @ 19:fe6ea065e36a
Update
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 02 Aug 2016 17:45:20 +0900 |
parents | |
children |
line wrap: on
line source
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 を見て 依存関係の解決をする?