changeset 34:cba85e3b73e3

commit
author ikkun
date Tue, 16 May 2017 13:56:24 +0900
parents c326110b6079 (current diff) aa067a010a3a (diff)
children 7c5d27175aa4
files .DS_Store presen/slide.html presen/slide.md
diffstat 5 files changed, 1072 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file paper/.DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/sigos.txt	Tue May 16 13:56:24 2017 +0900
@@ -0,0 +1,56 @@
+@article{
+    cerium,
+    author = "宮國 渡 and 河野 真治 and 神里 晃 and 杉山 千秋",
+    title = "Cell 用の Fine-grain Task Manager の実装",
+    journal = "情報処理学会 システムソフトウェアとオペレーティング・システム研究会(OS)",
+    month = "April",
+    year = 2008
+}
+
+@article{
+    alice,
+    author = "照屋 のぞみ and 河野 真治",
+    title = "分散フレームワークAliceのPC画面配信システムへの応用",
+    journal = "第57回プログラミング・シンポジウム",
+    month = "Jan",
+    year = 2016
+}
+
+@article{
+    segment,
+    author = "河野 真治 and 杉本 優",
+    title = "Code Segment と Data Segment によるプログラミング手法",
+    journal = "第54回プログラミング・シンポジウム",
+    month = "Jan",
+    year = 2013
+}
+
+                  
+@manual{opencl,
+author = "{Aaftab Munshi, Khronos OpenCL Working Group}",
+title ="{The OpenCL Specification Version 1.0}",
+year = 2007
+}
+
+@misc{cuda,
+    title = "{CUDA}",
+    howpublished = "{https://developer.nvidia.com/category/zone/cuda-zone/}"
+}
+
+@article{
+    gears,
+    author = "小久保 翔平 and 伊波 立樹 and 河野 真治",
+    title = "Monad に基づくメタ計算を基本とする Gears OS の設計",
+    journal = "情報処理学会システムソフトウェアとオペレーティング・システム研究会(OS)",
+    month = "May",
+    year = 2015
+}
+
+@article{
+    cbc-lola,
+    author = "Kaito TOKKMORI and Shinji KONO",
+    title = "Implementing Continuation based language in LLVM and Clang",
+    journal = "LOLA 2015",
+    month = "July",
+    year = 2015
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presen/sigos.html	Tue May 16 13:56:24 2017 +0900
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+   <meta http-equiv="content-type" content="text/html;charset=utf-8">
+   <title>Gears OSにおける並列処理</title>
+
+<meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 1.9.3 (2011-10-30) [x86_64-darwin10]">
+<meta name="author"    content="東恩納 琢偉" >
+
+<!-- style sheet links -->
+<link rel="stylesheet" href="s6/themes/projection.css"   media="screen,projection">
+<link rel="stylesheet" href="s6/themes/screen.css"       media="screen">
+<link rel="stylesheet" href="s6/themes/print.css"        media="print">
+<link rel="stylesheet" href="s6/themes/blank.css"        media="screen,projection">
+
+<!-- JS -->
+<script src="s6/js/jquery-1.11.3.min.js"></script>
+<script src="s6/js/jquery.slideshow.js"></script>
+<script src="s6/js/jquery.slideshow.counter.js"></script>
+<script src="s6/js/jquery.slideshow.controls.js"></script>
+<script src="s6/js/jquery.slideshow.footer.js"></script>
+<script src="s6/js/jquery.slideshow.autoplay.js"></script>
+
+<!-- prettify -->
+<link rel="stylesheet" href="scripts/prettify.css">
+<script src="scripts/prettify.js"></script>
+
+<script>
+  $(document).ready( function() {
+    Slideshow.init();
+
+    $('code').each(function(_, el) {
+      if (!el.classList.contains('noprettyprint')) {
+        el.classList.add('prettyprint');
+        el.style.display = 'block';
+      }
+    });
+    prettyPrint();
+  } );
+
+  
+</script>
+
+<!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
+<!--[if IE]>
+<script src="s6/js/jquery.microsoft.js"></script>
+<![endif]-->
+
+
+
+</head>
+<body>
+
+<div class="layout">
+  <div id="header"></div>
+  <div id="footer">
+    <div align="right">
+      <img src="s6/images/logo.svg" width="200px">
+    </div>
+  </div>
+</div>
+
+<div class="presentation">
+
+  <div class='slide cover'>
+    <table width="90%" height="90%" border="0" align="center">
+      <tr>
+        <td>
+          <div align="center">
+            <h1><font color="#808db5">Gears OSにおける並列処理</font></h1>
+          </div>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <div align="left">
+            東恩納 琢偉
+            琉球大学理工学研究科
+            <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
+          </div>
+        </td>
+      </tr>
+    </table>
+  </div>
+
+
+
+</div><!-- presentation -->
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presen/sigos.md	Tue May 16 13:56:24 2017 +0900
@@ -0,0 +1,463 @@
+title: Gears OSにおける並列処理
+author: 東恩納 琢偉
+profile: 琉球大学理工学研究科
+lang: Japanese
+code-engine: coderay
+## Gears OS
+- 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて分けることによって
+    - 並列性
+    - 柔軟性
+    - 信頼性
+
+を指標とした Gears OS を設計してきた
+
+- 本研究では Gears OS のプロトタイプとして並列処理機構を Continuation based C(CbC) で実装を行う
+
+## Gears OS の並列性
+- Gears OS はプログラムの単位として Gear を用いる
+- Gear には プログラムの処理を示す Code Gear、 Data を示す Data Gear がある
+- Code/Data Gear を用いて記述することでプログラム全体の並列度を高め、効率的に並列処理することが可能
+
+<div style="text-align: center;">
+    <img src="./images/codeGear_dataGear.svg" alt="message" width="450">
+</div>
+
+## Gears OS の柔軟性
+- Gears OS は Meta Computation を使用することで
+    - データ拡張や機能の追加
+    - GPU 等のさまざまなアーキテクチャでも同じプログラムの動作
+    - バージョンが異なる者同士がネットワーク接続しても通信
+
+等を柔軟に対応する
+
+- Meta Computation は 通常の Computaiton と階層を分けて処理を行う
+
+<div style="text-align: center;">
+    <img src="./images/meta_gear.svg" alt="message" width="800">
+</div>
+
+## Gears OS の信頼性
+- 検証
+    - モデル検査を行う
+    - モデル検査は状態の数が膨大になると検査するのが難しい
+    - そのため、不必要な状態である環境やスタックをなるべく取り除き、処理を行う
+- 証明
+    - Code Gear と Data Gear を理論的に定義
+
+## この発表は
+- Gears OS でのGear
+- Meta Computation
+- Continuation based C(CbC)
+- CbC を用いた Gears OS の記述
+- Gears OS の並列処理のプロトタイプ
+- まとめ
+- 課題
+
+## Code Gear、 Data Gear
+- Gears OS は Code Gear、 Data Gear という Gear で構成される
+- Code Gear はプログラムの処理そのものを表す
+- Data Gear は int や 文字列などの Data そのものを表す
+- Code Gear は必要な Input Data Gear が揃ったら実行し、 Output Data Gear を生成する
+- Code Gear と Input / Output Data Gear の対応から依存関係を解決し、 Code Gear の並列実行を行う
+
+<div style="text-align: center;">
+    <img src="./images/codeGear_dataGear_dependency.svg" alt="message" width="600">
+</div>
+
+
+## Meta Computation
+- Meta Computation は通常の Computation のための Computation
+- 並列処理の依存関係の解決、 GPUなどのアーキテクチャでの実行のために行う処理などを行う
+- Gears OS では Meta Computation を Meta Code Gear, Meta Data Gear で表現
+
+## Meta Gear
+- Meta Computation は Code/Data Gearの接続の間に行われる
+- Meta Computation の処理も Code/Data Gear で実現する
+- この Gear を Meta Code/Data Gearと呼ぶ
+    - Meta Code Gear は Meta Computation のプログラム部分
+    - Meta Data Gear は Meta Code Gear で管理されるデータ部分
+- Gears OS は通常の Code/Data Gear から Meta Code/Data Gear 接続部分は見えないように実装を行う
+
+<div style="text-align: center;">
+    <img src="./images/meta_cg_dg.svg" alt="message" width="850">
+</div>
+
+
+## Continuation based C
+- Gears OS の実装は本研究室で開発している Continuation based C(CbC) を用いる
+- CbC は処理を Code Segment を用いて記述する事を基本とする
+- Code Segment は Code Gear を同等のものため、 Gears OS を記述するのに適している
+
+## Continuation based C
+- Code Segment の定義は ``__code CS名`` で行う
+- Code Segment 間は ``goto CS名`` で移動する。この移動を継続と呼ぶ
+- Code Segment の継続は C の関数呼び出しとは異なり、戻り値を持たないためスタックの変更を行わない
+    - このような環境を持たない継続を軽量継続と呼ぶ
+
+## Continuation based C
+- このコードは code1、code2 の2つの Code Segment を定義している
+- code1 内の ``goto code2`` でcode2 への継続を行っている
+
+``` c
+/* code1 define */
+__code code1(List list) {
+    ....
+    goto code2(list)
+}
+
+/* code2 define */
+__code code2(List list) {
+    ...
+}
+```
+
+## CbC を用いた Gears OS の記述
+- Gears OS での Code Gear も  Code Segment の定義のように記述する
+- 各 Code Gear の引数は 必要な Data Gear を示す
+- このコードでは 2つの Code Gear と 1つの Meta Code Gear を定義しており、 code1 から code2への継続を行っている
+
+``` c
+__code code1(struct Array* array, struct LoopCounter* loopCounter) {
+    ...
+    goto code2(array);
+}
+
+__code meta_code1(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
+}
+
+__code code2(struct Array* array) {
+    ...
+}
+```
+
+## CbC の Gears OS サポート
+- 実際は code1 から code2 への継続の間には Meta Code Gear である meta_code1 が実行される
+- 通常は Meta Level の継続をプログラマーは意識する必要はない
+- そこで、CbC は Code Gear 間の接続に自動的に Meta Code Gear を挟むというサポートを行う
+- CbC のサポートを行うとこのコードのように展開される
+- メタレベルのサポートの際は **context** という Meta Data Gear を使用する
+
+``` c
+__code code1(struct Context* context, struct Array* array, struct LoopCounter* loopCounter) {
+    ...
+    goto meta_code1(context, Code2);
+}
+
+__code code1_stub(struct Context* context) {
+    goto code1(context, &context->data[Node]->node.value->array, &context->data[LoopCounter]->loopCounter);
+}
+
+__code meta_code1(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
+}
+
+__code code2(struct Context* context, struct Array* array) {
+    ...
+}
+```
+
+## Context
+- Context は 
+    - 接続可能な Code/Data Gear のリスト
+    - 独立したメモリ空間
+をもっている
+
+- 各 Code/Data Gear にアクセスする際は Context を経由する
+
+## Context
+- Context は
+    - 実行可能な Code Gear の数を示す **codeNum**
+    - 実行可能な Code Gear のリストを示す **code**
+    - Data Gear の Allocate 用の **heapStart**, **heap**, **heapLimit**
+    - Data Gear の数を示す **dataNum**
+    - Data Gear のリストを示す **data**
+で構成される
+
+``` c
+/* context define */
+struct Context {
+    int codeNum;
+    __code (**code) (struct Context*);
+    void* heapStart;
+    void* heap;
+    long heapLimit;
+    int dataNum;
+    union Data **data;
+};
+```
+
+## Context
+- 実行可能な Code Gear の名前は **enum code** で定義する
+- Context の初期化時に名前と関数ポインタを対応付ける
+- 現在の Gears ではこの enum code 使って接続先の Code Gear を指定する
+
+``` c
+enum Code {
+    Code1,
+    Code2,
+    Code3,
+    Exit,
+};
+```
+
+## Data Gear の表現
+- 使用する Data Gear は C の共用体と構造体を用いた表現をする
+- これを元に Gears OS は 必要な Data Gear を allocate する
+
+``` c
+/* data Gear define */
+union Data {
+    struct Time {
+        enum Code next;
+        double time;
+    } time;
+    struct LoopCounter {
+        int i;
+    } loopCounter;
+    ....
+};
+```
+
+## Code Gear の stub
+- Data Gear にアクセスするにはContext を経由する
+- だが、通常の Code Gear では Meta Data Gear である Context の参照は避ける必要がある
+- Gears OS では通常の Code Gear で必要な Data Gear を Context から取り出す stub を用意する
+- stub は一種の Meta Code Gear であるため、 CbC で自動生成される
+- このコードでは Array と LoopCounter が必要な code1 の stub を示している
+
+``` c
+__code code1(struct Context* context, struct Array* array, struct LoopCounter* loopCounter) {
+    ...
+}
+
+/* stub define */
+__code code1_stub(struct Context* context) {
+    goto code1(context, &context->data[Node]->node.value->array, &context->data[LoopCounter]->loopCounter);
+}
+```
+
+## プロトタイプ の構成
+- 今回は並列処理を行う機構の実装を行う
+- 必要な要素は大きく5つ
+    - Context
+    - TaskQueue
+        - 実行される Task のリストを扱う
+    - Persistent Data Tree
+        - Code Gear によって参照される Data Gear の管理を行う
+    - Worker
+        -  TaskQueue から Task を取得し、実行する
+    - TaskManager
+        - Persistent Data Tree を監視し、 Task の依存関係を解決する
+
+※ TaskManager は今回未実装
+
+## TaskQueue
+- Task Queue は Task のリストを扱う
+- すべての Thread で共有されるため、 Compare And Swap(CAS) を使用した Synchronized Queue として実装する
+- TaskQueue は 2つで Data Gear で表現される
+    - 先頭と末尾の要素を持った Queue 表す Data Gear
+    - Task と次の要素へのポインタを持った、リスト構造を表現する Element という Data Gear
+
+``` c
+// Data Gear define
+union Data {
+    struct Queue {
+        struct Element* first;
+        struct Element* last;
+    } queue;
+
+    struct Element {
+        struct Task* task;
+        struct Elemen* next;
+    } element
+};
+```
+
+## TaskQueueの操作(Enqueue)
+- Task を挿入する場合 Queue の last から最後の要素を取り出し、次の要素に新しく挿入する要素を設定
+- 正しく最後の要素が変更できたことを CAS で 保証し、末尾の変更を行う必要がある
+
+``` c
+__code putQueue3(struct Queue* queue, struct Element* new_element) {
+    struct Element* last = queue->last;
+
+    if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) {
+        last->next = new_element;
+
+        goto exit();
+    } else {
+        goto putQueue3(queue, new_element);
+    }
+}
+
+```
+
+## Persistent Data Tree
+- Persistent Data Tree は Data Gear の管理を行う
+- TaskQueue と同じですべての Thread で共有される
+- Red-Black Tree アルゴリズムを用いて木構造の平衡性を保つ
+- 木構造から読み出される Data Gear は Code Gear の Input Data Gear, 書き出すData Gear は Output Data Gear になる
+
+<div style="text-align: center;">
+    <img src="./images/persistent_date_tree_2.svg" alt="message" width="800">
+</div>
+
+## Persistent Data Tree
+- Persistent Data Tree は
+    - Tree 自体を示す Data Gear
+    - Node を示す Data Gear
+
+を用いて木構造を表現する
+
+``` c
+union Data {
+    struct Tree {
+        struct Node* root;
+    } tree;
+    struct Node {
+        int key; // comparable data segment
+        union Data* value;
+        struct Node* left;
+        struct Node* right;
+        // need to balancing
+        enum Color {
+            Red,
+            Black,
+        } color;
+    } node;
+};
+```
+
+
+## Worker
+- Worker は TaskQueue から Task を取得して実行する
+
+<table align='center'>
+  <tbody>
+    <tr>
+      <td>
+        <div>
+            <img src="./images/worker.svg" alt="message" width="600">
+        </div>
+     </td>
+     <td>
+        <ol>
+            <li> Worker は Task Queue から Task を取り出す(1. Dequeue Task)</li>
+            <li> 取り出した Task には Tree の key が入っているため Tree からその key に対応した Input Data Gear を読み込む(2. Read Data Gear) </li>
+            <li> Task に格納されている Code Gear を実行する </li>
+            <li> Code Gear を実行した結果、生成された Output Data Gear を Tree に書き出す(3.Write Data Gear) </li>
+        </ol>
+     </td>
+    </tr>
+  </tbody>
+</table>
+
+- Task が完了したら次の Task を取得する
+
+## TaskManger
+- TaskManager は Task の依存関係の解決を行う
+- Thread の作成と停止も行う
+
+<div style="text-align: center;">
+    <img src="./images/taskManager.svg" alt="message" width="800">
+</div>
+
+
+## プロトタイプの実行
+- 今回 Gears OS の構成要素である Persistent Data Tree, TaskQueue, Worker の実装を行った
+- これにより、 Gears OS を用いて依存関係のない並列処理の実行が可能になった
+
+## Gears OS で実行する Code Gear 例
+- プロトタイプのタスクの例題として Twice を実装した
+- Twice は与えられた整数配列を2倍にする例題である
+
+``` c
+// Twice Code Gear
+__code twice(struct LoopCounter* loopCounter, int index, int alignment, int* array) {
+    int i = loopCounter->i;
+
+    if (i < alignment) {
+        array[i+index*alignment] = array[i+index*alignment]*2;
+        loopCounter->i++;
+
+        goto twice(loopCounter, index, alignment, array);
+    }
+
+    loopCounter->i = 0;
+
+    goto exit();
+}
+```
+
+## 並列処理の確認
+- Twice を使用し、Gears OS が実際に並列処理されているかどうかの確認を行った
+- 環境
+    - Memory : 16GB
+    - CPU : 6-core Intel Xeon 2.66GHZ x 2
+- 要素数 : 2^17 * 1000
+- 分割数 : 640 タスク
+- 1 Task 当たりの処理量 : 2^11 * 100 elements
+
+<table  border="1" align='center' width='50%'>
+  <tbody>
+    <tr>
+      <td style="text-align: center;">Number of Processors</td>
+      <td style="text-align: center;">Time(ms)</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">1 CPU</td>
+      <td style="text-align: right;">1315</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">2 CPUs</td>
+      <td style="text-align: right;">689</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">4 CPUs</td>
+      <td style="text-align: right;">366</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">8 CPUs</td>
+      <td style="text-align: right;">189</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">12 CPUs</td>
+      <td style="text-align: right;">111</td>
+    </tr>
+  </tbody>
+</table>
+
+- 1cpu と 12cpu では 11.8 倍の向上が見られた
+
+
+## Cerium との比較
+- Cerium は本研究室で開発していた並列プログラミングフレームワーク
+- Cerium では Task を依存関係に沿って実行することで並列実行を可能にする
+    - 本来 Task はデータに依存するもので Task 間の依存関係ではデータの依存関係を保証することが出来ない
+    - Gears OS の Task 中身は Code Gear になっており、必要な Input Data Gear が揃わない限り実行しないため、データの依存関係を保証できる
+- Task には汎用ポインタとしてデータの受け渡しを行う
+    - 型情報がなく、型の検査を行うことが出来ない
+    - Gears OS では 型情報をもつ Data Gear を定義
+
+## 既存の OS への対応
+- Gears OS は従来の OS が行ってきたネットワーク管理、メモリ管理、並行制御などのメタな部分を Meta Code/Data Gear として定義
+- 通常の Code Gear から必要な制御を Meta Code Gear で行うことで従来のOSが行ってきた制御の提供を行う
+
+## まとめ
+- Code Gear、 Data Gear によって構成される Gears OS の基本的な機能として TaskQueue、 Persistent Data Tree、 Worker の実装を行った
+- 依存関係のない Twice を実装し、並列処理が行えることを確認した
+
+## 今後の課題
+- 一般的に並列処理には依存関係が存在する
+    - 複雑な並列処理を実行できるようにするために Task Manager の実装を行い、  依存関係のある並列処理の例題を作成し、評価する
+- GPUなどの他のプロセッサ演算に利用することが出来ない
+    - Data Gear などのデータをGPUにマッピングするための機構が必要
+- Gears OS でのデバック手法
+    - 継続はスタックを積まないため、スタックトレースを使わないデバック手法の考案
+    - 並列処理でのデバック手法も考案する必要がある
+- 型情報の検査
+    - プログラムの正しさを保証するために Data Gear の情報を検査するシステムを Meta Computation として実装する
+- Contextの動的生成
+    - 今は静的に自分で生成している
+    - CbC 用の Runtime をつくり、 Context を動的に生成
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presen/sigos.md~	Tue May 16 13:56:24 2017 +0900
@@ -0,0 +1,463 @@
+title: Gears OSにおける並列処理
+author: 東恩納 琢偉
+profile: 琉球大学理工学研究科
+lang: Japanese
+code-engine: coderay
+## Gears OS
+- 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて
+    - 並列性
+    - 柔軟性
+    - 信頼性
+
+を指標とした Gears OS を設計してきた
+
+- 本研究では Gears OS のプロトタイプとして並列処理機構を Continuation based C(CbC) で実装を行う
+
+## Gears OS の並列性
+- Gears OS はプログラムの単位として Gear を用いる
+- Gear には プログラムの処理を示す Code Gear、 Data を示す Data Gear がある
+- Code/Data Gear を用いて記述することでプログラム全体の並列度を高め、効率的に並列処理することが可能
+
+<div style="text-align: center;">
+    <img src="./images/codeGear_dataGear.svg" alt="message" width="450">
+</div>
+
+## Gears OS の柔軟性
+- Gears OS は Meta Computation を使用することで
+    - データ拡張や機能の追加
+    - GPU 等のさまざまなアーキテクチャでも同じプログラムの動作
+    - バージョンが異なる者同士がネットワーク接続しても通信
+
+等を柔軟に対応する
+
+- Meta Computation は 通常の Computaiton と階層を分けて処理を行う
+
+<div style="text-align: center;">
+    <img src="./images/meta_gear.svg" alt="message" width="800">
+</div>
+
+## Gears OS の信頼性
+- 検証
+    - モデル検査を行う
+    - モデル検査は状態の数が膨大になると検査するのが難しい
+    - そのため、不必要な状態である環境やスタックをなるべく取り除き、処理を行う
+- 証明
+    - Code Gear と Data Gear を理論的に定義
+
+## この発表は
+- Gears OS でのGear
+- Meta Computation
+- Continuation based C(CbC)
+- CbC を用いた Gears OS の記述
+- Gears OS の並列処理のプロトタイプ
+- まとめ
+- 課題
+
+## Code Gear、 Data Gear
+- Gears OS は Code Gear、 Data Gear という Gear で構成される
+- Code Gear はプログラムの処理そのものを表す
+- Data Gear は int や 文字列などの Data そのものを表す
+- Code Gear は必要な Input Data Gear が揃ったら実行し、 Output Data Gear を生成する
+- Code Gear と Input / Output Data Gear の対応から依存関係を解決し、 Code Gear の並列実行を行う
+
+<div style="text-align: center;">
+    <img src="./images/codeGear_dataGear_dependency.svg" alt="message" width="600">
+</div>
+
+
+## Meta Computation
+- Meta Computation は通常の Computation のための Computation
+- 並列処理の依存関係の解決、 GPUなどのアーキテクチャでの実行のために行う処理などを行う
+- Gears OS では Meta Computation を Meta Code Gear, Meta Data Gear で表現
+
+## Meta Gear
+- Meta Computation は Code/Data Gearの接続の間に行われる
+- Meta Computation の処理も Code/Data Gear で実現する
+- この Gear を Meta Code/Data Gearと呼ぶ
+    - Meta Code Gear は Meta Computation のプログラム部分
+    - Meta Data Gear は Meta Code Gear で管理されるデータ部分
+- Gears OS は通常の Code/Data Gear から Meta Code/Data Gear 接続部分は見えないように実装を行う
+
+<div style="text-align: center;">
+    <img src="./images/meta_cg_dg.svg" alt="message" width="850">
+</div>
+
+
+## Continuation based C
+- Gears OS の実装は本研究室で開発している Continuation based C(CbC) を用いる
+- CbC は処理を Code Segment を用いて記述する事を基本とする
+- Code Segment は Code Gear を同等のものため、 Gears OS を記述するのに適している
+
+## Continuation based C
+- Code Segment の定義は ``__code CS名`` で行う
+- Code Segment 間は ``goto CS名`` で移動する。この移動を継続と呼ぶ
+- Code Segment の継続は C の関数呼び出しとは異なり、戻り値を持たないためスタックの変更を行わない
+    - このような環境を持たない継続を軽量継続と呼ぶ
+
+## Continuation based C
+- このコードは code1、code2 の2つの Code Segment を定義している
+- code1 内の ``goto code2`` でcode2 への継続を行っている
+
+``` c
+/* code1 define */
+__code code1(List list) {
+    ....
+    goto code2(list)
+}
+
+/* code2 define */
+__code code2(List list) {
+    ...
+}
+```
+
+## CbC を用いた Gears OS の記述
+- Gears OS での Code Gear も  Code Segment の定義のように記述する
+- 各 Code Gear の引数は 必要な Data Gear を示す
+- このコードでは 2つの Code Gear と 1つの Meta Code Gear を定義しており、 code1 から code2への継続を行っている
+
+``` c
+__code code1(struct Array* array, struct LoopCounter* loopCounter) {
+    ...
+    goto code2(array);
+}
+
+__code meta_code1(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
+}
+
+__code code2(struct Array* array) {
+    ...
+}
+```
+
+## CbC の Gears OS サポート
+- 実際は code1 から code2 への継続の間には Meta Code Gear である meta_code1 が実行される
+- 通常は Meta Level の継続をプログラマーは意識する必要はない
+- そこで、CbC は Code Gear 間の接続に自動的に Meta Code Gear を挟むというサポートを行う
+- CbC のサポートを行うとこのコードのように展開される
+- メタレベルのサポートの際は **context** という Meta Data Gear を使用する
+
+``` c
+__code code1(struct Context* context, struct Array* array, struct LoopCounter* loopCounter) {
+    ...
+    goto meta_code1(context, Code2);
+}
+
+__code code1_stub(struct Context* context) {
+    goto code1(context, &context->data[Node]->node.value->array, &context->data[LoopCounter]->loopCounter);
+}
+
+__code meta_code1(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
+}
+
+__code code2(struct Context* context, struct Array* array) {
+    ...
+}
+```
+
+## Context
+- Context は 
+    - 接続可能な Code/Data Gear のリスト
+    - 独立したメモリ空間
+をもっている
+
+- 各 Code/Data Gear にアクセスする際は Context を経由する
+
+## Context
+- Context は
+    - 実行可能な Code Gear の数を示す **codeNum**
+    - 実行可能な Code Gear のリストを示す **code**
+    - Data Gear の Allocate 用の **heapStart**, **heap**, **heapLimit**
+    - Data Gear の数を示す **dataNum**
+    - Data Gear のリストを示す **data**
+で構成される
+
+``` c
+/* context define */
+struct Context {
+    int codeNum;
+    __code (**code) (struct Context*);
+    void* heapStart;
+    void* heap;
+    long heapLimit;
+    int dataNum;
+    union Data **data;
+};
+```
+
+## Context
+- 実行可能な Code Gear の名前は **enum code** で定義する
+- Context の初期化時に名前と関数ポインタを対応付ける
+- 現在の Gears ではこの enum code 使って接続先の Code Gear を指定する
+
+``` c
+enum Code {
+    Code1,
+    Code2,
+    Code3,
+    Exit,
+};
+```
+
+## Data Gear の表現
+- 使用する Data Gear は C の共用体と構造体を用いた表現をする
+- これを元に Gears OS は 必要な Data Gear を allocate する
+
+``` c
+/* data Gear define */
+union Data {
+    struct Time {
+        enum Code next;
+        double time;
+    } time;
+    struct LoopCounter {
+        int i;
+    } loopCounter;
+    ....
+};
+```
+
+## Code Gear の stub
+- Data Gear にアクセスするにはContext を経由する
+- だが、通常の Code Gear では Meta Data Gear である Context の参照は避ける必要がある
+- Gears OS では通常の Code Gear で必要な Data Gear を Context から取り出す stub を用意する
+- stub は一種の Meta Code Gear であるため、 CbC で自動生成される
+- このコードでは Array と LoopCounter が必要な code1 の stub を示している
+
+``` c
+__code code1(struct Context* context, struct Array* array, struct LoopCounter* loopCounter) {
+    ...
+}
+
+/* stub define */
+__code code1_stub(struct Context* context) {
+    goto code1(context, &context->data[Node]->node.value->array, &context->data[LoopCounter]->loopCounter);
+}
+```
+
+## プロトタイプ の構成
+- 今回は並列処理を行う機構の実装を行う
+- 必要な要素は大きく5つ
+    - Context
+    - TaskQueue
+        - 実行される Task のリストを扱う
+    - Persistent Data Tree
+        - Code Gear によって参照される Data Gear の管理を行う
+    - Worker
+        -  TaskQueue から Task を取得し、実行する
+    - TaskManager
+        - Persistent Data Tree を監視し、 Task の依存関係を解決する
+
+※ TaskManager は今回未実装
+
+## TaskQueue
+- Task Queue は Task のリストを扱う
+- すべての Thread で共有されるため、 Compare And Swap(CAS) を使用した Synchronized Queue として実装する
+- TaskQueue は 2つで Data Gear で表現される
+    - 先頭と末尾の要素を持った Queue 表す Data Gear
+    - Task と次の要素へのポインタを持った、リスト構造を表現する Element という Data Gear
+
+``` c
+// Data Gear define
+union Data {
+    struct Queue {
+        struct Element* first;
+        struct Element* last;
+    } queue;
+
+    struct Element {
+        struct Task* task;
+        struct Elemen* next;
+    } element
+};
+```
+
+## TaskQueueの操作(Enqueue)
+- Task を挿入する場合 Queue の last から最後の要素を取り出し、次の要素に新しく挿入する要素を設定
+- 正しく最後の要素が変更できたことを CAS で 保証し、末尾の変更を行う必要がある
+
+``` c
+__code putQueue3(struct Queue* queue, struct Element* new_element) {
+    struct Element* last = queue->last;
+
+    if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) {
+        last->next = new_element;
+
+        goto exit();
+    } else {
+        goto putQueue3(queue, new_element);
+    }
+}
+
+```
+
+## Persistent Data Tree
+- Persistent Data Tree は Data Gear の管理を行う
+- TaskQueue と同じですべての Thread で共有される
+- Red-Black Tree アルゴリズムを用いて木構造の平衡性を保つ
+- 木構造から読み出される Data Gear は Code Gear の Input Data Gear, 書き出すData Gear は Output Data Gear になる
+
+<div style="text-align: center;">
+    <img src="./images/persistent_date_tree_2.svg" alt="message" width="800">
+</div>
+
+## Persistent Data Tree
+- Persistent Data Tree は
+    - Tree 自体を示す Data Gear
+    - Node を示す Data Gear
+
+を用いて木構造を表現する
+
+``` c
+union Data {
+    struct Tree {
+        struct Node* root;
+    } tree;
+    struct Node {
+        int key; // comparable data segment
+        union Data* value;
+        struct Node* left;
+        struct Node* right;
+        // need to balancing
+        enum Color {
+            Red,
+            Black,
+        } color;
+    } node;
+};
+```
+
+
+## Worker
+- Worker は TaskQueue から Task を取得して実行する
+
+<table align='center'>
+  <tbody>
+    <tr>
+      <td>
+        <div>
+            <img src="./images/worker.svg" alt="message" width="600">
+        </div>
+     </td>
+     <td>
+        <ol>
+            <li> Worker は Task Queue から Task を取り出す(1. Dequeue Task)</li>
+            <li> 取り出した Task には Tree の key が入っているため Tree からその key に対応した Input Data Gear を読み込む(2. Read Data Gear) </li>
+            <li> Task に格納されている Code Gear を実行する </li>
+            <li> Code Gear を実行した結果、生成された Output Data Gear を Tree に書き出す(3.Write Data Gear) </li>
+        </ol>
+     </td>
+    </tr>
+  </tbody>
+</table>
+
+- Task が完了したら次の Task を取得する
+
+## TaskManger
+- TaskManager は Task の依存関係の解決を行う
+- Thread の作成と停止も行う
+
+<div style="text-align: center;">
+    <img src="./images/taskManager.svg" alt="message" width="800">
+</div>
+
+
+## プロトタイプの実行
+- 今回 Gears OS の構成要素である Persistent Data Tree, TaskQueue, Worker の実装を行った
+- これにより、 Gears OS を用いて依存関係のない並列処理の実行が可能になった
+
+## Gears OS で実行する Code Gear 例
+- プロトタイプのタスクの例題として Twice を実装した
+- Twice は与えられた整数配列を2倍にする例題である
+
+``` c
+// Twice Code Gear
+__code twice(struct LoopCounter* loopCounter, int index, int alignment, int* array) {
+    int i = loopCounter->i;
+
+    if (i < alignment) {
+        array[i+index*alignment] = array[i+index*alignment]*2;
+        loopCounter->i++;
+
+        goto twice(loopCounter, index, alignment, array);
+    }
+
+    loopCounter->i = 0;
+
+    goto exit();
+}
+```
+
+## 並列処理の確認
+- Twice を使用し、Gears OS が実際に並列処理されているかどうかの確認を行った
+- 環境
+    - Memory : 16GB
+    - CPU : 6-core Intel Xeon 2.66GHZ x 2
+- 要素数 : 2^17 * 1000
+- 分割数 : 640 タスク
+- 1 Task 当たりの処理量 : 2^11 * 100 elements
+
+<table  border="1" align='center' width='50%'>
+  <tbody>
+    <tr>
+      <td style="text-align: center;">Number of Processors</td>
+      <td style="text-align: center;">Time(ms)</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">1 CPU</td>
+      <td style="text-align: right;">1315</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">2 CPUs</td>
+      <td style="text-align: right;">689</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">4 CPUs</td>
+      <td style="text-align: right;">366</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">8 CPUs</td>
+      <td style="text-align: right;">189</td>
+    </tr>
+    <tr>
+      <td style="text-align: center;">12 CPUs</td>
+      <td style="text-align: right;">111</td>
+    </tr>
+  </tbody>
+</table>
+
+- 1cpu と 12cpu では 11.8 倍の向上が見られた
+
+
+## Cerium との比較
+- Cerium は本研究室で開発していた並列プログラミングフレームワーク
+- Cerium では Task を依存関係に沿って実行することで並列実行を可能にする
+    - 本来 Task はデータに依存するもので Task 間の依存関係ではデータの依存関係を保証することが出来ない
+    - Gears OS の Task 中身は Code Gear になっており、必要な Input Data Gear が揃わない限り実行しないため、データの依存関係を保証できる
+- Task には汎用ポインタとしてデータの受け渡しを行う
+    - 型情報がなく、型の検査を行うことが出来ない
+    - Gears OS では 型情報をもつ Data Gear を定義
+
+## 既存の OS への対応
+- Gears OS は従来の OS が行ってきたネットワーク管理、メモリ管理、並行制御などのメタな部分を Meta Code/Data Gear として定義
+- 通常の Code Gear から必要な制御を Meta Code Gear で行うことで従来のOSが行ってきた制御の提供を行う
+
+## まとめ
+- Code Gear、 Data Gear によって構成される Gears OS の基本的な機能として TaskQueue、 Persistent Data Tree、 Worker の実装を行った
+- 依存関係のない Twice を実装し、並列処理が行えることを確認した
+
+## 今後の課題
+- 一般的に並列処理には依存関係が存在する
+    - 複雑な並列処理を実行できるようにするために Task Manager の実装を行い、  依存関係のある並列処理の例題を作成し、評価する
+- GPUなどの他のプロセッサ演算に利用することが出来ない
+    - Data Gear などのデータをGPUにマッピングするための機構が必要
+- Gears OS でのデバック手法
+    - 継続はスタックを積まないため、スタックトレースを使わないデバック手法の考案
+    - 並列処理でのデバック手法も考案する必要がある
+- 型情報の検査
+    - プログラムの正しさを保証するために Data Gear の情報を検査するシステムを Meta Computation として実装する
+- Contextの動的生成
+    - 今は静的に自分で生成している
+    - CbC 用の Runtime をつくり、 Context を動的に生成