view 2017/2017_09_19/slide.md @ 27:d005b4f353d3

Update slide
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 26 Sep 2017 19:06:19 +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 の並列処理機構の実装を行う。また、並列処理の検証をメタ計算として記述することで、 並列処理の信頼性を保証する。

## 今週
- Gears での GPU の実行(結構無理やり)
  - bitonicSort

## GPUWorker
- cudaInit() はもともと, createGPUWorker() で行っている
- しかし, 実際 CUDA の API を呼び出すのは, createGPUWorker を呼んだスレッドではなく, createGPUWorker で作られた Thread
- そうすると code=201(CUDA_ERROR_INVALID_CONTEXT) がでる
  - cuda の API は cuInit() を呼んだ thread でしか呼び出せない
- thread を入れ替える技の痕跡があるが, thread 作った先の startCUDAWorker で cudaInit することに

``` c
static void startCUDAWorker(Worker* worker) {
    struct CUDAWorker* cudaWorker = &worker->worker->CUDAWorker;
    cudaInit(cudaWorker, 0);
    cudaWorker->context = NEW(struct Context);
    initContext(cudaWorker->context);
    Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker;
    goto meta(cudaWorker->context, worker->taskReceive);
}
```

## MultiDimIterator
- CUDA に対応させるために, 前作った 1次元の iterator を 3次元に対応

``` c
Iterator* createMultiDimIterator(struct Context* context, int x, int y, int z) {
    struct Iterator* iterator = new Iterator();
    struct MultiDimIterator* multiDimIterator = new MultiDimIterator();
    iterator->iterator = (union Data*)multiDimIterator;
    iterator->exec = C_execMultiDimIterator;
    iterator->barrier = C_barrierMultiDimIterator;
    multiDimIterator->x = x;
    multiDimIterator->y = y;
    multiDimIterator->z = z;
    multiDimIterator->count = x * y * z;
    multiDimIterator->counterX = 0;
    multiDimIterator->counterY = 0;
    multiDimIterator->counterZ = 0;
    return iterator;
}
```

## TaskManager
- 取り敢えず Iterator は全て CUDAWorker(作られていれば) に sendするように変更

## CUDAExec()
- Task(Context) から Input&output DataGear をGPU に送信するために変換 & Task の実行をしている部分
- まだここは実行するタスクの内容で書き換えているのでCeriumのように一般化してデータを送信する必要あり
- block の数は単純に iterator の値を適応(この辺は Cerium と一緒), 次にBenchmarkを載せるが, 遅い

## 一応Benchmark的なもの