# HG changeset patch # User Tatsuki IHA # Date 1492513349 -32400 # Node ID 69d99910fc15d493d959737943744ab4608190bf # Parent bf593e6958b1942cacb1bb285bf78adbe8980d8b Update diff -r bf593e6958b1 -r 69d99910fc15 2017/2017_04_11/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2017/2017_04_11/slide.md Tue Apr 18 20:02:29 2017 +0900 @@ -0,0 +1,23 @@ +title: OS 研究会 +author: Tatsuki IHA +profile: +lang: Japanese +code-engine: coderay + +## 研究会に出すもの(出せそうなもの?) +- Gears OS関連 + - Gears OS の言語support(generate stub とか generate context とか) + - Gears のコード記述 + - Gears のプログラミング + - GPU 対応 + - Task dependency の設計 + - Gears OSの並列処理 +- Jungle + - 分散version の測定が必要? + - disk 書き出し + - 複数implementation + - Jungle には同じデータが書き出される + - その同じデータの中にも複数のimplementationがある + +## Akatsuki +- Felica Devices(edy 対応で新しくしたモデル) は ちゃんとid 付いてました diff -r bf593e6958b1 -r 69d99910fc15 2017/2017_04_18/slide.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2017/2017_04_18/slide.md Tue Apr 18 20:02:29 2017 +0900 @@ -0,0 +1,90 @@ +title: Gears +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 によって依存関係が決定し、それにそって並列実行を行う. +- 依存関係の解決やモデル検査等の本論の計算を行うためのメタな計算を Meta Code Gear で行う. +- 現在のGears は 依存関係がある並列処理を行うことが出来ない。 今研究ではGears OS の依存関係の解決を目標とする + +## 進捗 +- dependency の例題書いてみました + - 加算した output を 乗算の input にする + - (1+2) * 3 みたいな + +## Gears の構成 + + +## 依存関係があるTask の生成 +- ds に依存するtaskをセットする + +``` +__code createTask2(LoopCounter* loopCounter, TaskManager* taskManager, struct Context *task, Integer *integer1, Integer *integer2, Integer *integer3) { + int i = loopCounter->i; + task->idgCount = 1; + task->next = C_mult; + integer2->value = i; + task->data[task->idg] = (union Data*)integer1; + task->data[task->idg+1] = (union Data*)integer2; + task->maxIdg = task->idg + 2; + task->odg = task->maxIdg; + task->data[task->odg] = (union Data*)integer3; + task->maxOdg = task->odg + 1; + taskManager->task = task; + taskManager->next = C_createTask3; + taskManager->data = (union Data*)integer1; + goto meta(context, taskManager->taskManager->TaskManager.setWaitTask); +} +``` + +## 依存関係のあるtaskをList にsetする + +``` +__code setWaitTask(struct Queue* queue, struct Context* task, Data* data, __code next(...)) { + queue->queue = (Data *)GET_WAIT_LIST(data); + queue->next = next; + queue->data = (Data *)task; + goto meta(context, queue->queue->Queue.put); +} +``` + +## output Data Gear Commit +- ds から wait list を取り, empty でなければ, wait list から taskを取り出し, idgCount をデクリメントする +- idgCount が 0になった, spawn する + +``` +__code odgCommit1(struct LoopCounter* loopCounter, struct Queue* queue) { + int i = loopCounter->i ; + queue->queue = (union Data*)GET_WAIT_LIST(context->data[context->odg+i]); + queue->whenEmpty = C_odgCommit4; + queue->next = C_odgCommit2; + goto meta(context, queue->queue->Queue.isEmpty); +} + +__code odgCommit3(struct TaskManager* taskManager, struct Context* task) { + if(__sync_fetch_and_sub(&task->idgCount, 1)) { + if(task->idgCount == 0) { + taskManager->taskManager = (union Data*)task->taskManager; + taskManager->context = task; + taskManager->next = C_odgCommit1; + goto meta(context, task->taskManager->spawn); + } else { + goto meta(context, C_odgCommit1); + } + } else { + goto meta(context, C_odgCommit3); + } +} +``` + +## で? 動いているの? +- assert を仕込んで確認すると動いてるっぽい + +## まだ解決してない点 +- multi thread +- 複数のCSから同一のDSに書き出した場合の merge 処理 +- API (par goto?) +- meta の分離(idgCount をデクリメントする前の cas等)