comparison 2017/2017_05_30/slide.md @ 25:678e6992c8ae

Update
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 20 Jun 2017 20:02:48 +0900
parents
children
comparison
equal deleted inserted replaced
24:a05d9335563f 25:678e6992c8ae
1 title: Gears OS
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 - 信頼性の確保はモデルチェック、検証等を使用して行う。この信頼性のための計算は通常の計算とは別の階層のメタ計算として記述する。
11 - また、 メタ計算は信頼性の他に CPU, GPU などの実行環境の切り替え, データ拡張等の柔軟性を提供する。
12 - 本研究では、 Gears OS の並列処理機構の実装を行う。また、並列処理の実行を検証をメタ計算として記述することで、 並列処理の精度を保証する。
13
14 ## 今週
15 - Task の interface
16
17 ## Taskの interface
18 - par goto に変換するために, task を interface に押し込みたい
19
20
21 ``` c
22 __code code1(struct Integer integer1, struct Integer integer2, struct Integer integer3) {
23 par goto add(integer1, integer2, integer3, _exit());
24 goto next_code();
25 }
26
27
28 ## task の例題: 2つ input, 1つ output
29 __code add(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...)) {
30 output->value = input1->value + input2->value;
31 printf("%d + %d = %d\n", input1->value, input2->value, output->value);
32 goto next(output, ...);
33 }
34 ```
35
36 ## CodeGear の interface
37 - とりあえず meta level のコード(変換後されるはずのコード)を自前で書いてみることに
38 - CodeGear のinterfaceの定義
39 - code に実行する Code Gear 入れる?
40
41 ``` c
42 typedef struct CodeGear<Impl>{
43 union Data* codeGear;
44 enum Code code;
45 __code code(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...));
46 __code setInfo(struct Context* codeGear, union Data** dataGears, __code next(...));
47 union Data* dataGears[10];
48 __code next(...);
49 } CodeGear;
50 ```
51
52 - task の context が CodeGear interface の実装になる?
53
54 ``` c
55 CodeGear* createAddCodeGear(struct Context* context) {
56 struct CodeGear* codeGear = new CodeGear();
57 struct context* addContext = NEW(struct Context);
58 codeGear->codeGear = (union Data*)addContext;
59 initContext(addContext);
60 codeGear->code = C_add;
61 codeGear->setInfo = C_setAddCodeGearInfo;
62 return codeGear;
63 }
64 ```
65
66 ## CodeGear の setInfo
67 - context の設定(もともとべた書きされてた部分)
68 - ここで, dependency の設定と spawn までの一連の流れをやってる
69
70 ``` c
71 __code setAddCodeGearInfo(struct Context* codeGear, union Data** dataGears, __code next(...)) {
72 codeGear->next = C_add;
73 codeGear->idgCount = 2;
74 codeGear->idg = codeGear->datanum;
75 codeGear->data[codeGear->idg] = dataGears[0];
76 codeGear->data[codeGear->idg+1] = dataGears[1];
77 codeGear->maxIdg = codeGear->idg + 2;
78 codeGear->odg = codeGear->maxIdg;
79 codeGear->data[codeGear->odg] = dataGears[2];
80 task->maxOdg = task->odg + 1;
81 goto meta(context, C_setWaitTask)
82 }
83 ```
84
85 - 呼び出しは interfaceを呼び出す用に引数を指定
86
87 ``` c
88 __code createTask3(LoopCounter* loopCounter, TaskManager* taskManager, Integer *integer1, Integer *integer2, Integer *integer3) {
89 int i = loopCounter->i;
90 integer1->value = i;
91 integer2->value = i+1;
92
93 // ここから下もpar goto から自動生成
94 codeGear->codeGear= createAddCodeGear(context);
95 codeGear->codeGear[0] = (union Data*)integer1;
96 codeGear->codeGear[1] = (union Data*)integer2;
97 codeGear->codeGear[2] = (union Data*)integer3;
98 codeGear->next = C_createTask1;
99 goto meta(context, codeGear->codeGear->CodeGear.setInfo);
100 }
101 ```
102
103
104 ## ちょっと考え中
105
106 ``` c
107 typedef struct CodeGear<Impl>{
108 union Data* codeGear;
109 enum Code code;
110 __code code(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...));
111 __code setInfo(struct Context* codeGear, union Data** dataGears, __code next(...));
112 union Data* dataGears[10];
113 __code next(...);
114 } CodeGear;
115 ```