view 2017/2017_07_18/slide.md @ 26:ed48cf95acab

Update
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Thu, 20 Jul 2017 00:03:03 +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 の iterator


## Iterator interface
- Context に Iterator 用の変数を複数用意するのもあれなのでInterface を作った

``` c
typedef struct Iterator<Impl>{
        union Data* iterator;
        struct Context* task;
        __code exec(Impl* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...));
        __code barrier(Impl* iterator, struct Context* task, __code next(...), __code whenWait(...));
        __code whenWait(...);
        __code next(...);
} Iterator;
```

## Iterator implements
- 試しに一次元を処理する物を実装
- Iterator を設定しているTaskが active なtaskになると exec が呼ばれ, Task を copy する
  - copy している理由はまだ手を付けていない index を扱うため
- Iteratorで繰り返し処理されるTaskを待つのはbarrierで行う
    - task が iterate されていても, されていなくても, normal レベルからは同じ task に見える
    - Worker の meta 計算で, 実行後のTaskが iterate な Task なら  barrierを呼ぶ

``` c
struct OneDimIterator {
    int x;
    int count;
    struct LoopCounter *loopCounter;
} OneDimIterator;

Iterator* createOneDimIterator(struct Context* context, int x) {
    struct Iterator* iterator = new Iterator();
    struct OneDimIterator* oneDimIterator = new OneDimIterator();
    iterator->iterator = (union Data*)oneDimIterator;
    iterator->exec = C_execOneDimIterator;
    iterator->barrier = C_barrierOneDimIterator;
    oneDimIterator->x = x;
    oneDimIterator->count = x;
    oneDimIterator->loopCounter = new LoopCounter();
    oneDimIterator->loopCounter->i = 0;
    return iterator;
}

__code execOneDimIterator(struct OneDimIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) {
    if (iterator->loopCounter->i == iterator->count) {
        iterator->loopCounter->i = 0;
        goto next(...);
    }

    // create iterate task
    struct Context* iterate_task = NEW(struct Context);
    *iterate_task = *task;
    iterate_task->iterate = 1;
    iterator->loopCounter->i++;

    // spawn iterate task
    taskManager->taskManager = (union Data*)task->taskManager;
    taskManager->context = iterate_task;
    taskManager->next = C_execOneDimIterator;
    goto meta(context, task->taskManager->spawn);
}

__code barrierOneDimIterator(struct OneDimIterator* iterator, struct Context* task, __code next(...), __code whenWait(...)) {
    if (__sync_fetch_and_sub(&iterator->count, 1) == 1) {
        goto next(...);
    }
    goto whenWait(...);
}
```

## まだ手を付けていない
- index にどうやってアクセスするか
    - 普通に考えたらiterate する task の Code Gear の input になる