view 2017/2017_11_21/slide.md @ 29:791013bd4429

Update
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 09 Jan 2018 15:22:00 +0900
parents
children
line wrap: on
line source

title: Gears OS による並列処理
author: Tatsuki IHA
profile:
lang: Japanese
code-engine: coderay

## 河野研究室について
- 並列, 分散フレームワーク
    - Cerium
    - Alice
- OS
    - Gears OS
- コンパイラ
    - Continueation based C
    - LLVM
    - GCC
- TreeVNC
- 分散データベース
    - ゲーム
- 検証、証明
- カレー
    - 配属後にカレーパーティー(B3が作る)

## 河野研究室について(注意点)
- コードは書く
- ハリーズのカレーは激辛

## 研究目的
- 当研究室では  処理の単位を 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 の並列処理機構の実装を行う。また、並列処理の検証をメタ計算として記述することで、 並列処理の信頼性を保証する。

## 今週
- CAS のコードのインターフェース化
- perl script の修正

## Atomic Interface
- oldData, new Data は引数
- method は checkAndSet を持っている

``` c
typedef struct Atomic<Type, Impl>{
    union Data* atomic;
    union Data* oldData;
    union Data* newData;
    __code checkAndSet(Impl* atomic, Type* oldData, Type* newData, __code next(...), __code fail(...));
    __code next(...);
    __code fail(...);
} Atomic;
```

## AtomicReference
- Atomic Interface の実装として AtomicReference を作った
- data は現在の状態

``` c
struct AtomicReference {
    union Data* data;
} AtomicReference;
```

``` c
Atomic* createAtomicReference(struct Context* context, union Data* data) {
    struct Atomic* atomic = new Atomic();
    struct AtomicReference* atomicReference = new AtomicReference();
    atomicReference->data = data;
    atomic->atomic = AtomicReference;
    atomic->checkAndSet = C_checkAndSetAtomicReference;
    return atomic;
}

__code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) {
    if (__sync_bool_compare_and_swap(&atomic->data, oldData, newData)) {
        goto next(...);
    }
    goto fail(...);
}
```

## Synchronized Queue の修正
- まだ途中
- ↓  になれば嬉しい? 

``` c
 __code clearSynchronizedQueue(struct SynchronizedQueue* queue, __code next(...)) {
    struct Element* top = queue->top;
    if (__sync_bool_compare_and_swap(&queue->top, top, NULL)) {
        goto next(...);
    } else {
        goto meta(context, C_clearSynchronizedQueue);
    }
}



__code clearSynchronizedQueue(struct SynchronizedQueue* queue, __code next(...)) {
    struct Atomic* atomic = queue->top;
    union Data* oldData = queue->top->data;
    goto atomic->checkAndSet(oldData, NULL, next, clearSynchronizedQueue);
}
```

## perl script 修正
- interface での goto がちょっとおかしかったので修正

## perl script 修正
- 今までの変換
- 引数の queue に queue->queue を入れてておかしい

``` c
__code queueTest2(struct Queue* queue) {
    Node* node = new Node();
    node->color = Black;
    goto queue->put(node, queueTest3);
}



__code queueTest2(struct Queue* queue) {
    Node* node = new Node();
    node->color = Black;
    Gearef(context, Queue)->queue = queue->queue;
    Gearef(context, Queue)->data = (union Data*)node;
    Gearef(context, Queue)->next = C_queueTest3;
    goto meta(context, queue->queue->Queue.put);
}
```

## perl script 修正
- ちゃんと元の queue を受け取るように修正

``` c
__code queueTest2(struct Queue* queue) {
    Node* node = new Node();
    node->color = Black;
    goto queue->put(node, queueTest3);
}



__code queueTest2(struct Queue* queue) {
    Node* node = new Node();
    node->color = Black;
    Gearef(context, Queue)->queue = queue;
    Gearef(context, Queue)->data = (union Data*)node;
    Gearef(context, Queue)->next = C_queueTest3;
    goto meta(context, queue->put);
}
```