view 2017/2017_11_28/slide.md @ 31:b7908b2f86c0 default tip

Update slide 2018_01_30
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 30 Jan 2018 18:43:00 +0900
parents 791013bd4429
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 の並列処理機構の実装を行う。また、並列処理の検証をメタ計算として記述することで、 並列処理の信頼性を保証する。

## 今週
- SynchronizedQueue を cas inteface を使うように変更
- 「線形時相論理を用いた Continuation based C プログラムの検証」論文よみ
- DPP のコード読み(memory, state_db)
- dalmoreの件

## SynchronizedQueue の書き換え
- CAS は atomic->checkAndSet を使うように変更
- perl script を書き換えて,元々引数でしか goto interface->method が出来ない所を, local 変数にも出来るように対応しました

``` cbc
__code putSynchronizedQueue(struct SynchronizedQueue* queue, union Data* data, __code next(...)) {
    Element* element = new Element();
    element->data = data;
    element->next = NULL;
    Element* last = queue->last;
    Element* nextElement = last->next;
    if (last != queue->last) {
        goto meta(context, C_putSynchronizedQueue);
    }
    if (nextElement == NULL) {
        struct Atomic* atomic = queue->atomic;
        goto atomic->checkAndSet(&last->next, nextElement, element, next(...), putSynchronizedQueue);
    } else {
        struct Atomic* atomic = queue->atomic;
        goto atomic->checkAndSet(&queue->last, last, nextElement, putSynchronizedQueue, putSynchronizedQueue);
    }
}

__code takeSynchronizedQueue(struct SynchronizedQueue* queue, __code next(union Data* data, ...)) {
    struct Element* top = queue->top;
    struct Element* last = queue->last;
    struct Element* nextElement = top->next;
    if (top != queue->top) {
        goto meta(context, C_takeSynchronizedQueue);
    }
    if (top == last) {
        if (nextElement != NULL) {
            struct Atomic* atomic = queue->atomic;
            goto atomic->checkAndSet(&queue->last, last, nextElement, takeSynchronizedQueue, takeSynchronizedQueue);
        }
    } else {
        struct Atomic* atomic = queue->atomic;
        goto atomic->checkAndSet(&queue->top, top, nextElement, takeSynchronizedQueue1, takeSynchronizedQueue);
    }
    goto meta(context, C_takeSynchronizedQueue);
}
```