# HG changeset patch # User Tatsuki IHA # Date 1468927438 -32400 # Node ID a9a91f4a668890df46e29de5b005427a85e9499f # Parent 8e98a8e122e64cc1c68e9729b557f7168a6f85d2 Update diff -r 8e98a8e122e6 -r a9a91f4a6688 2016/2016_06_14/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2016/2016_06_14/slide.md Tue Jul 19 20:23:58 2016 +0900 @@ -0,0 +1,14 @@ +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 の依存関係の解決を目標とする + +# 今週 + +# hoge diff -r 8e98a8e122e6 -r a9a91f4a6688 2016/2016_07_05/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2016/2016_07_05/slide.md Tue Jul 19 20:23:58 2016 +0900 @@ -0,0 +1,12 @@ +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 の依存関係の解決を目標とする + +# 今週 diff -r 8e98a8e122e6 -r a9a91f4a6688 2016/2016_07_12/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2016/2016_07_12/slide.md Tue Jul 19 20:23:58 2016 +0900 @@ -0,0 +1,12 @@ +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 の依存関係の解決を目標とする + +# 今週 diff -r 8e98a8e122e6 -r a9a91f4a6688 2016/2016_07_19/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2016/2016_07_19/slide.md Tue Jul 19 20:23:58 2016 +0900 @@ -0,0 +1,89 @@ +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 の依存関係の解決を目標とする + +# 今週 +- 依存関係のコードを書いてる途中 + +# どう実装するか? +- とりあえず足し算した後に掛け算するコードを例として動かす + - 2つのInput Data Gear をとって, 1つのOutput Data Gear を出す + - (4+5) * 5 とか + +# どう実装するか? +- とりあえず足し算した後に掛け算するコードを例として動かす +- Data Gear に その Data Gear を待っている Task を持たせる + - Task は Queue に持たせる(Meta Data Gear) +- Task には Input Data Gear の数を持たせる +- Task を実行すると、 Output Data Gear を作るため、そのOutput Data Gear の持っている Queue から Task にアクセスして Input Data Gear の数をデクリメントする +- Task の Input Data Gear の数が0なら Active Queue に inqueue する + +# Data Gear にTask を設定するコード +- このコードの例だと Data Gear の offset から Meta Data Gear である Queue をとってきて、Task を追加する + +``` +__code waitFor(struct Context* context, struct Task* slave, struct Element* element, union Data* data) { + // この辺をstub にやりたい, 型をどうやって取ってくるか + struct Integer integer = (struct Integer *)data; + struct Queue waitMeTasks = (struct Queue *)(integer + integer->mDataOffset); + + element->data = (union Data *)slave; + goto meta_waitFor(context, waitMeTasks, PutQueue1); +} + +__code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) { + context->data[Queue] = (union Data *)queue; + goto (context->code[next])(context); +} +``` + +# Task が完了した後に動かすコード +- Output Data Gear をとって、 Queue の中のTaskから idsCount を デクリメント + +``` +__code checkTaskFinish1(struct Context* context, struct Data* data) { + struct Integer integer = (struct Integer *)data; + struct Queue waitMeTasks = (struct Queue *)(integer + integer->mDataOffset); + context->next = CheckTaskFinish2; + goto meta_checkTaskFinish1(context, waitMeTasks, CheckTaskFinish2); +} + +/* + * ready input data Gear for waitme task + */ +__code checkTaskFinish2(struct Context* context) { + struct Task task = ((struct Task) element -> data); + task->idsCount--; + goto meta(context, CheckTaskFinish1); +} +``` + +# Task を active, wait の Queue に入れる + +``` +__code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) { + if (task->idsCount == 0) { + // enqueue activeQueue + goto meta_spawnTask(context, activeQueue, PutQueue1); + } else { + // enqueue waitQueue + goto meta_spawnTask(context, waitQueue, PutQueue1); + } +} + +__code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) { + context->data[Queue] = (union Data *)queue; + goto (context->code[next])(context); +} +``` + +# 次 +- Task を実行した後に checkTaskFinish1 を呼ぶ +- TaskManager が spawnTask を呼ぶ