24
|
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 - GW たのしかったです
|
|
16
|
|
17 ## par goto
|
|
18 - par goto の変換スクリプトを書きたい
|
|
19
|
|
20 ```
|
|
21 par goto add(integer1, integer2, output, __exit)
|
|
22 ```
|
|
23
|
|
24 ## 問題点
|
|
25 - par goto は↓のように変換されるはず
|
|
26 - idg, odg をtaskのdataをセットするための切り分けをしたい
|
|
27
|
|
28 ```
|
|
29 task->next = C_add;
|
|
30 task->idgCount = 2;
|
|
31
|
|
32 // DG のセットを切り分けたい
|
|
33 task->data[task->idg] = (union Data*)integer1;
|
|
34 task->data[task->idg+1] = (union Data*)integer2;
|
|
35 task->maxIdg = task->idg + 2;
|
|
36 task->odg = task->maxIdg;
|
|
37 task->data[task->odg] = (union Data*)integer3;
|
|
38
|
|
39
|
|
40 task->maxOdg = task->odg + 1;
|
|
41 taskManager->next = C_createTask1;
|
|
42 goto meta(context, taskManager->taskManager->TaskManager.spawn);
|
|
43 ```
|
|
44
|
|
45 ## Task で実行される Code Gear
|
|
46 - 実際 task で実行される Code Gear は 引数に output data もとっている
|
|
47
|
|
48 ```
|
|
49 __code add(struct Integer* input1, struct Integer* input2, struct Integer* output) {
|
|
50 output->value = input1->value + input2->value;
|
|
51 printf("%d + %d = %d\n", input1->value, input2->value, output->value);
|
|
52 goto meta(context, context->next);
|
|
53 }
|
|
54 ```
|
|
55
|
|
56 - ↓のように Code Gear の引数は Input Data Gear のみにして、あとで変換
|
|
57 - そうすると, 引数で input Data の数がわかる
|
|
58
|
|
59 ```
|
|
60 __code add(Integer *intege1, Integer *integer2, next(output, output2,...)) {
|
|
61 union Data* output = integer1->value + integer1->value;
|
|
62 union Data* output2 =....
|
|
63 goto next(output, output2, ...)
|
|
64 }
|
|
65 ```
|
|
66
|
|
67 ## Par goto で切り分ける?
|
|
68 - output に何かしらのフラグを付ける
|
|
69
|
|
70 ```
|
|
71 par goto(input1, input2, +output)
|
|
72 ```
|