comparison 2017/2017_04_18/slide.md @ 23:69d99910fc15

Update
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 18 Apr 2017 20:02:29 +0900
parents
children
comparison
equal deleted inserted replaced
22:bf593e6958b1 23:69d99910fc15
1 title: Gears
2 author: Tatsuki IHA
3 profile:
4 lang: Japanese
5 code-engine: coderay
6
7 ## 研究目的
8 - 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて 信頼性が高い並列処理を行う Gears OS を開発している
9 - Gears OS では Task を Code Gear と実行するときに必要な Input Data Gear と出力するための Output Data Gear の組で表現される。 Input Data Gear/Output Data Gear によって依存関係が決定し、それにそって並列実行を行う.
10 - 依存関係の解決やモデル検査等の本論の計算を行うためのメタな計算を Meta Code Gear で行う.
11 - 現在のGears は 依存関係がある並列処理を行うことが出来ない。 今研究ではGears OS の依存関係の解決を目標とする
12
13 ## 進捗
14 - dependency の例題書いてみました
15 - 加算した output を 乗算の input にする
16 - (1+2) * 3 みたいな
17
18 ## Gears の構成
19 <img src="./pictures/gears_structure.svg" alt="" width="700"/>
20
21 ## 依存関係があるTask の生成
22 - ds に依存するtaskをセットする
23
24 ```
25 __code createTask2(LoopCounter* loopCounter, TaskManager* taskManager, struct Context *task, Integer *integer1, Integer *integer2, Integer *integer3) {
26 int i = loopCounter->i;
27 task->idgCount = 1;
28 task->next = C_mult;
29 integer2->value = i;
30 task->data[task->idg] = (union Data*)integer1;
31 task->data[task->idg+1] = (union Data*)integer2;
32 task->maxIdg = task->idg + 2;
33 task->odg = task->maxIdg;
34 task->data[task->odg] = (union Data*)integer3;
35 task->maxOdg = task->odg + 1;
36 taskManager->task = task;
37 taskManager->next = C_createTask3;
38 taskManager->data = (union Data*)integer1;
39 goto meta(context, taskManager->taskManager->TaskManager.setWaitTask);
40 }
41 ```
42
43 ## 依存関係のあるtaskをList にsetする
44
45 ```
46 __code setWaitTask(struct Queue* queue, struct Context* task, Data* data, __code next(...)) {
47 queue->queue = (Data *)GET_WAIT_LIST(data);
48 queue->next = next;
49 queue->data = (Data *)task;
50 goto meta(context, queue->queue->Queue.put);
51 }
52 ```
53
54 ## output Data Gear Commit
55 - ds から wait list を取り, empty でなければ, wait list から taskを取り出し, idgCount をデクリメントする
56 - idgCount が 0になった, spawn する
57
58 ```
59 __code odgCommit1(struct LoopCounter* loopCounter, struct Queue* queue) {
60 int i = loopCounter->i ;
61 queue->queue = (union Data*)GET_WAIT_LIST(context->data[context->odg+i]);
62 queue->whenEmpty = C_odgCommit4;
63 queue->next = C_odgCommit2;
64 goto meta(context, queue->queue->Queue.isEmpty);
65 }
66
67 __code odgCommit3(struct TaskManager* taskManager, struct Context* task) {
68 if(__sync_fetch_and_sub(&task->idgCount, 1)) {
69 if(task->idgCount == 0) {
70 taskManager->taskManager = (union Data*)task->taskManager;
71 taskManager->context = task;
72 taskManager->next = C_odgCommit1;
73 goto meta(context, task->taskManager->spawn);
74 } else {
75 goto meta(context, C_odgCommit1);
76 }
77 } else {
78 goto meta(context, C_odgCommit3);
79 }
80 }
81 ```
82
83 ## で? 動いているの?
84 - assert を仕込んで確認すると動いてるっぽい
85
86 ## まだ解決してない点
87 - multi thread
88 - 複数のCSから同一のDSに書き出した場合の merge 処理
89 - API (par goto?)
90 - meta の分離(idgCount をデクリメントする前の cas等)