view 2017/2017_06_20/slide.md @ 25:678e6992c8ae

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

## 今週
- GPU VDI
- par goto のメタ部分のまとめ

## par goto が複数ある場合の変換
- たとえば, 1つのCS内に複数のpar goto があった場合

``` c
__code code1(struct ...) {
  Integer* integer1 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;
  Integer* integer2 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;
  Integer* integer3 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;
  Integer* integer4 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;
  Integer* integer5 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;

  // 複数の par goto
  par goto add(integer1, integer2, integer3, __exit);
  par goto mult(integer3, integer4, integer5, __exit);
  goto code2(...);
}
```

- 実行する task の 配列を生成して, それを spawn する

``` c
__code code1(struct ...) {
  Integer* integer1 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;
  ...
  Integer* integer5 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer;

  // task の配列を生成
  struct Context** tasks = (struct Context**)ALLOC_ARRAY(context, Context, 3);

  // par goto add(integer1, integer2, integer3, __exit);
  struct Context* task = NEW(struct Context);
  initContext(task);
  task->taskManager = &taskManager->taskManager->TaskManager;
  task->next = C_add;
  task->idgCount = 2;
  task->idg = task->dataNum;
  task->data[task->idg] = (union Data*)integer1;
  task->data[task->idg+1] = (union Data*)integer2;
  task->maxIdg = task->idg + 2;
  task->odg = task->maxIdg;
  task->data[task->odg] = (union Data*)integer3;
  task->maxOdg = task->odg + 1;
  // task を登録
  tasks[0] = task;

  // par goto mult(integer3, integer4, integer5, __exit);
  task = NEW(struct Context);
  initContext(task);
  task->taskManager = &taskManager->taskManager->TaskManager;
  task->next = C_mult;
  task->idgCount = 2;
  task->idg = task->dataNum;
  task->data[task->idg] = (union Data*)integer3;
  task->data[task->idg+1] = (union Data*)integer4;
  task->maxIdg = task->idg + 2;
  task->odg = task->maxIdg;
  task->data[task->odg] = (union Data*)integer5;
  task->maxOdg = task->odg + 1;
  // task を登録
  tasks[1] = task;

  taskManager->contexts = tasks;
  // goto crateTask1();
  taskManager->next1 = C_code2;
  goto meta(context, taskManager->taskManager->TaskManager.spawnTasks);
}
```

## taskの配列のspawn
- taskの配列の要素一つずつをspawn

```
__code spawnTasksTaskManager(struct TaskManager* taskManager, struct TaskManagerImpl* taskManagerImpl, struct Context** contexts, Code next) {
    int i = taskManagerImpl->loopCounter->i;
    struct Context* task = contexts[i];
    if(i < GET_SIZE(contexts)) {
        taskManagerImpl->loopCounter->i++;
        goto taskManager->setWorker(task, taskManager->spawnTasksTaskManager(contexts, next));
    }
    taskManagerImpl->loopCounter->i = 0;
    goto spawnTasksTaskManager1(contexts, next);
}
```

## GPU VDI 感想
- OIST すごい
- 学科システムにも vGPU ほしいなぁ