view 2017/2017_06_06/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
line wrap: on
line source

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 によって依存関係が決定し、それにそって並列実行を行う.
- 信頼性の確保はモデルチェック、検証等を使用して行う。この信頼性のための計算は通常の計算とは別の階層のメタ計算として記述する。
- また、 メタ計算は信頼性の他に CPU, GPU などの実行環境の切り替え, データ拡張等の柔軟性を提供する。
- 本研究では、 Gears OS の並列処理機構の実装を行う。また、並列処理の実行を検証をメタ計算として記述することで、 並列処理の精度を保証する。

## 今週
- バイト先の合宿で北部にいました
- par goto のメタ部分のまとめ

## 並列に実行される CodeGear の変換
- stub の生成は context を参照するように変換(ここは先週の CodeGear interface の引数でとってもよさそう)
- ここで inputと output の関係がわかるはず

``` c
__code add(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...)) {
    output->value = input1->value + input2->value;
    printf("%d + %d = %d\n", input1->value, input2->value, output->value);
    goto next(output, ...);
}
```



``` c
__code add(struct Context *context,struct Integer* input1, struct Integer* input2, enum Code next,struct Integer **O_output) {
    struct Integer* output = *O_output;
    output->value = input1->value + input2->value;
    printf("%d + %d = %d\n", input1->value, input2->value, output->value);
    *O_output = output;
    goto meta(context, next);
}

__code add_stub(struct Context* context) {
    Integer** O_output = (struct Integer **)&context->data[context->odg];
    goto add(context,
            &context->data[context->idg]->Integer,
            &context->data[context->idg + 1]->Integer,
            context->next,
            O_output);
}
```

## par goto 呼び出し部分の変換

``` c
__code code1(TaskManager* taskManager, Integer *integer1, Integer *integer2, Integer *integer3) {
    par goto add(integer1, integer2, integer3, __exit);
}
```



``` c
__code code1(TaskManager* taskManager, Integer *integer1, Integer *integer2, Integer *integer3) {
    struct Context* task = NEW(struct Context);
    initContext(task);
    task->taskManager = &taskManager->taskManager->TaskManager;
    task->next = C_add;
    task->idgCount = 2;
    task->idg = task->dataNum;
    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->context = task;
    taskManager->next = C_createTask3;
    goto meta(context, taskManager->taskManager->TaskManager.setWaitTask);
}
```