# HG changeset patch # User Tatsuki IHA # Date 1470127520 -32400 # Node ID fe6ea065e36ad184881b229ca2dbb2208c38e0b3 # Parent a9a91f4a668890df46e29de5b005427a85e9499f Update diff -r a9a91f4a6688 -r fe6ea065e36a 2016/2016_07_26/slide.md --- /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 *wait_queue) +{ + if (_export_task_log) + tasklog->finish_time = rdtsc(); + + while(TaskQueue *p = me->wait_me->poll()) { + HTaskPtr you = p->task; + QueueInfo *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 *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 を見て 依存関係の解決をする?