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

## 今週
- bitonic sort を並列化
    - その際に iterator 的なものが欲しくなったのでそのお話

## Iterator
- bitonic sort は基本的には swap を並列に走らせているだけ
    - 単純に, 何かしらの配列を Output するような構造
- 記述が面倒
- Cerium の Itearte が欲しくなった

<div style="text-align: center;">
    <img src="./pictures/bitonicsort_dependency.svg" alt="message" width="500">
</div>

## Cerium の Iterate
- Cerium は Taskを準備する際にiterateに繰り返す数を渡すことで実現
- iterateを設定していると, 実行する際に SchedTaskの multi_dimension が呼ばれる

``` C++
void
SchedTask::multi_dimension(TaskListPtr list, void* read, void* write,TaskObjectRun run) {
    long min = scheduler->min_cpu(); 
    long max = scheduler->max_cpu(); 
    long id = scheduler->id; 
    long lx = list->x; 
    long ly = list->y; 
    long lz = list->z; 

    x=y=z=0;
    
    long cpu=min;
    for (;;cpu++) {
        if (cpu>max) cpu = min;
        if (cpu==id) {
            run(this, read,write);
        }
        if (++x>=lx) {
            x=0;
            if (++y>=ly) {
                y=0;
                if (++z>=lz) {
                    break;		
                }
            }
        }
    }
}
```

## Gears ではどうするか
- par goto にオプションを付ける

``` c
par goto Add(input1, input2, output1, _exit, iterate(x, y, z))
```

``` c
struct Context* task = NEW(struct Context);
initContext(task);
...
task->dim_flag = 1;
task->x = x;
task->y = y;
task->z = z;
```

## Gears の実装
- Active になるまでは1つのTaskとして処理
- Active になると, 指定した数のTaskを生成して Worker に送信する

```
__code dimensionTaskSpawn(struct TaskManagerImpl* taskManager, struct Queue* queue, struct LoopCounter* loopCounter, struct Context* task, __code next(...)) {
    int i = loopCounter->i;
    int dimCount = task->x * task->y * task->z;
    // TODO: implement 3-dimension
    if(i < dimCount) {
        loopCounter->i++;
        struct Context* dimTask = cloneTask(task);
        task->workerId = taskManager->sendWorkerIndex;
        struct Queue* tasks = taskManager->workers[task->workerId]->tasks;
        pthread_mutex_unlock(&taskManager->mutex);
        tasks->put(dimTask, next(...));
    }
    goto next(...);
}
```

## 来週の予定
- まだ DG の待ち合わせを考えてないのでそれを考える