view 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
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 の並列処理機構の実装を行う。また、並列処理の実行を検証をメタ計算として記述することで、 並列処理の精度を保証する。

## 今週
- Task の interface

## Taskの interface
- par goto に変換するために, task を interface に押し込みたい


``` c
__code code1(struct Integer integer1, struct Integer integer2, struct Integer integer3) {
  par goto add(integer1, integer2, integer3, _exit());
  goto next_code();
}


## task の例題: 2つ input, 1つ output
__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, ...);
}
```

## CodeGear の interface
- とりあえず meta level のコード(変換後されるはずのコード)を自前で書いてみることに
- CodeGear のinterfaceの定義
- code に実行する Code Gear 入れる?

``` c
typedef struct CodeGear<Impl>{
        union Data* codeGear;
        enum Code code;
        __code code(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...));
        __code setInfo(struct Context* codeGear, union Data** dataGears, __code next(...));
        union Data* dataGears[10];
        __code next(...);
} CodeGear;
```

- task の context が CodeGear interface の実装になる?

``` c
CodeGear* createAddCodeGear(struct Context* context) {
    struct CodeGear* codeGear = new CodeGear();
    struct context* addContext = NEW(struct Context);
    codeGear->codeGear = (union Data*)addContext;
    initContext(addContext);
    codeGear->code = C_add;
    codeGear->setInfo = C_setAddCodeGearInfo;
    return codeGear;
}
```

## CodeGear の setInfo
- context の設定(もともとべた書きされてた部分)
- ここで, dependency の設定と spawn までの一連の流れをやってる

``` c
__code setAddCodeGearInfo(struct Context* codeGear, union Data** dataGears, __code next(...)) {
    codeGear->next = C_add;
    codeGear->idgCount = 2;
    codeGear->idg = codeGear->datanum;
    codeGear->data[codeGear->idg] = dataGears[0];
    codeGear->data[codeGear->idg+1] = dataGears[1];
    codeGear->maxIdg = codeGear->idg + 2;
    codeGear->odg = codeGear->maxIdg;
    codeGear->data[codeGear->odg] = dataGears[2];
    task->maxOdg = task->odg + 1;
    goto meta(context, C_setWaitTask)
}
```

- 呼び出しは interfaceを呼び出す用に引数を指定

``` c
__code createTask3(LoopCounter* loopCounter, TaskManager* taskManager, Integer *integer1, Integer *integer2, Integer *integer3) {
    int i = loopCounter->i;
    integer1->value = i;
    integer2->value = i+1;
    
    // ここから下もpar goto から自動生成
    codeGear->codeGear= createAddCodeGear(context);
    codeGear->codeGear[0] = (union Data*)integer1;
    codeGear->codeGear[1] = (union Data*)integer2;
    codeGear->codeGear[2] = (union Data*)integer3;
    codeGear->next = C_createTask1;
    goto meta(context, codeGear->codeGear->CodeGear.setInfo);
}
```


## ちょっと考え中

``` c
typedef struct CodeGear<Impl>{
        union Data* codeGear;
        enum Code code;
        __code code(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...));
        __code setInfo(struct Context* codeGear, union Data** dataGears, __code next(...));
        union Data* dataGears[10];
        __code next(...);
} CodeGear;
```