view slide/slide.html @ 82:cae61efc3f26

Fix
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Sat, 10 Feb 2018 03:01:54 +0900
parents 161db9fd907a
children 44f592c43324
line wrap: on
line source

<!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 2.3.0 (2015-12-25) [x86_64-darwin16]">
<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 class='slide '>
<!-- === begin markdown block ===

      generated by markdown/1.2.0 on Ruby 2.3.0 (2015-12-25) [x86_64-darwin16]
                on 2018-02-10 02:47:53 +0900 with Markdown engine kramdown (1.13.2)
                  using options {}
  -->

<!-- _S9SLIDE_ -->
<h2 id="gears-os">Gears OS</h2>
<ul>
  <li>並列処理のチューニングや信頼性を保証するのは難しい
    <ul>
      <li>スレッド間の共通資源の競合などの非決定的な実行</li>
      <li>従来のテストやデバッグではテストしきれない部分が残ってしまう</li>
    </ul>
  </li>
  <li>Gears OS では計算をノーマルレベルとメタレベルに階層化
    <ul>
      <li>ノーマルレベルの計算に対してメタレベルで信頼性を保証したい</li>
      <li>メタレベルの計算はデータ拡張や実行環境の切り替え等の拡張性のための計算を行う</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="code-gear-data-gear">Code Gear、 Data Gear</h2>
<ul>
  <li>Gears OS は Code Gear、 Data Gear という Gear で構成される</li>
  <li>Code Gear はプログラムの処理そのものを表す</li>
  <li>Data Gear はデータそのものを表す</li>
  <li>Code Gear は必要な Input Data Gear が揃ったら実行し、 Output Data Gear を生成する</li>
  <li>Code Gear と Input / Output Data Gear の対応から依存関係を解決し、 Input Data Gear が揃った Code Gear の並列実行を行う</li>
</ul>

<div style="text-align: center;">
    <img src="./images/codeGear_dataGear_dependency.svg" alt="message" width="600" />
</div>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="continuation-based-c">Continuation based C</h2>
<ul>
  <li>Gears OS の実装は本研究室で開発している Continuation based C(CbC) を用いる</li>
  <li>CbC は処理を Code Gear を用いて記述する事を基本とする</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="continuation-based-c-1">Continuation based C</h2>
<ul>
  <li>Code Gear の定義は <code>__code CS名</code> で行う</li>
  <li>Code Gear 間は <code>goto CS名</code> で移動する。この移動を継続と呼ぶ</li>
  <li>Code Gear の継続は C の関数呼び出しとは異なり、戻り値を持たないためスタックの変更を行わない
    <ul>
      <li>このような環境を持たない継続を軽量継続と呼ぶ</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="continuation-based-c-2">Continuation based C</h2>
<ul>
  <li>このコードは cg0、cg1 の2つの Code Gear を定義している</li>
  <li>cg0 内の <code>goto cg1</code> でgj1 への継続を行っている
    <ul>
      <li>ここで(a+b) が cg1 への入力になる</li>
    </ul>
  </li>
</ul>

<pre lang="c"><code>__code cg0(int a, int b) {
    goto cg1(a+b);

}

__code cg1(int c) {
    goto cg2(c);
}
</code></pre>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section">メタ計算</h2>
<ul>
  <li>メタ計算 は通常の計算を実行するための計算</li>
  <li>信頼性の確保やメモリ管理、スレッド管理、CPU、GPU の資源管理等</li>
  <li>Gears OS のメタ計算は通常の計算とは別の階層のメタレベルで行われる</li>
  <li>メタレベルは Code/Data Gear に対応して Meta Code/Data Gear で行われる</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="meta-gear">Meta Gear</h2>
<ul>
  <li>メタ計算 は Code Gearの接続の間に行われる</li>
  <li>メタ計算 の処理も Code/Data Gear で実現する</li>
  <li>この Gear を Meta Code/Data Gearと呼ぶ
    <ul>
      <li>Meta Code Gear は メタ計算 のプログラム部分</li>
      <li>Meta Data Gear は Meta Code Gear で管理されるデータ部分</li>
    </ul>
  </li>
  <li>Gears OS は通常の Code/Data Gear から Meta Code/Data Gear 部分は見えないように実装を行う</li>
</ul>

<div style="text-align: center;">
    <img src="./images/meta_cg_dg.svg" alt="message" width="850" />
</div>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="context">Context</h2>
<ul>
  <li>Context は接続可能な Code/Data Gear の集合を表現する Meta Data Gear</li>
  <li>従来のOS のスレッドやプロセスに対応
    <ul>
      <li>独立したメモリ空間を持つ</li>
      <li>Code Gear、 Data Gear へのポインタ</li>
      <li>並列実行用の Task 情報</li>
    </ul>
  </li>
  <li>を持つ</li>
  <li>Gears OS ではメタ計算でこの Context を経由して Data Gear にアクセスする</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="data-gear-">Data Gear の表現</h2>
<ul>
  <li>Data Gear は構造体を用いて定義する</li>
  <li>メタ計算では任意の Data Gear を一律に扱うため、全ての Data Gear は共用体の中で定義される</li>
  <li>Data Gear のメモリに確保する際のサイズ情報はこの型から決定する</li>
</ul>

<pre lang="c"><code>/* data Gear define */
union Data {
    struct Timer {
        union Data* timer;
        enum Code start;
        enum Code end;
        enum Code next;
    } Timer;
    struct TimerImpl {
        double time;
    } TimerImpl;
    ....
};
</code></pre>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="code-gear--stub-code-gear">Code Gear の stub Code Gear</h2>
<ul>
  <li>Data Gear にアクセスするにはContext を経由する</li>
  <li>だが、通常の Code Gear では Meta Data Gear である Context の参照は避ける必要がある</li>
  <li>Gears OS では通常の Code Gear で必要な Data Gear を Context から取り出す stub Code Gear を用意する</li>
</ul>

<pre lang="c"><code>
</code></pre>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="context--stub-code-gear-">Context での stub Code Gear の記述の問題点</h2>
<ul>
  <li>Context プログラム全体で使用する Code Gear と Data Gear の集合</li>
  <li>全ての Code と Data の組合せをContext から 全て展開し、その組合せを stub Code Gear に書く必要がある</li>
  <li>Gears OS を実装するに連れて、 stub Code Gear の記述が煩雑になる場所がでてきた</li>
  <li>そのため Gears OS のモジュール化する仕組みとして <strong>Interface</strong> を導入した</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="interface">Interface</h2>
<ul>
  <li>Interface はある Data Gear と それに対する操作(API) を行う Code Gear の集合を表現する Meta Data Gear</li>
  <li>stub Code Gear は実装した Code Gear で決まった形になるため、自動生成が可能である</li>
  <li>Interface を導入することで、 Stack や Queue などのデータ構造を使用と実装に分けて記述することが出来る</li>
  <li>Interface は Java のインターフェース、 Haskell の型クラスに対応する</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="interface-">Interface の定義</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="interface--1">Interface の実装</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="interface--code-gear-">Interface を利用した Code Gear の呼び出し</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section-1">並列処理の構成</h2>
<ul>
  <li>今回は並列処理を行う機構の実装を行う</li>
  <li>構成要素
    <ul>
      <li>Task(Context)</li>
      <li>Worker
        <ul>
          <li>Queue から Task を取得し、実行する</li>
        </ul>
      </li>
      <li>TaskManager
        <ul>
          <li>Persistent Data Tree を監視し、 Task の依存関係を解決する</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<p>※ TaskManager は今回未実装</p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="taskcontext">Task(Context)</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="taskmanger">TaskManger</h2>
<ul>
  <li>初期化時に決まった数の Worker を作成</li>
  <li>依存関係を解決した Task を各 Worker の Queue に送信する</li>
</ul>

<div style="text-align: center;">
    <img src="./images/taskManager.svg" alt="message" width="800" />
</div>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="worker">Worker</h2>
<ul>
  <li>Worker は TaskQueue から Task を取得して実行する</li>
</ul>

<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>
<ul>
  <li>Task が完了したら次の Task を取得する</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="synchronized-queue">Synchronized Queue</h2>
<ul>
  <li>Task Queue は Task のリストを扱う</li>
  <li>Thread で共有されるため、 Compare And Swap(CAS) を使用した Synchronized Queue として実装する</li>
  <li>TaskQueue は 2つで Data Gear で表現される
    <ul>
      <li>先頭と末尾の要素を持った Queue 表す Data Gear</li>
      <li>Task と次の要素へのポインタを持った、リスト構造を表現する Element という Data Gear</li>
    </ul>
  </li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section-2">依存関係の解決</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section-3">データ並列</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="cuda-">CUDA への対応</h2>
<p>## CUDA Worker
## CUDA Executor</p>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="gears-os-">Gears OS の評価</h2>
<ul>
  <li>今回 Gears OS の構成要素である Persistent Data Tree, TaskQueue, Worker の実装を行った</li>
  <li>これにより、 Gears OS を用いて依存関係のない並列処理の実行が可能になった</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section-4">実験環境</h2>
<ul>
  <li>CPU 環境
    <ul>
      <li>Memory : 16GB</li>
      <li>CPU : 6-core Intel Xeon 2.66GHZ x 2</li>
    </ul>
  </li>
  <li>GPU 環境</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="twice">Twice</h2>
<ul>
  <li>タスクの例題として Twice と BitonicSort を実装した</li>
  <li>Twice は与えられた整数配列を2倍にする例題である</li>
</ul>

<pre lang="c"><code>// Twice Code Gear
__code twice(struct LoopCounter* loopCounter, int index, int alignment, int* array) {
    int i = loopCounter-&gt;i;

    if (i &lt; alignment) {
        array[i+index*alignment] = array[i+index*alignment]*2;
        loopCounter-&gt;i++;

        goto twice(loopCounter, index, alignment, array);
    }

    loopCounter-&gt;i = 0;

    goto exit();
}
</code></pre>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="twice-">Twice の結果</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="bitonicsort">BitonicSort</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="bitonicsort-">BitonicSort の結果</h2>

<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>

<ul>
  <li>1cpu と 12cpu では 11.8 倍の向上が見られた</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="openmp-">OpenMP との比較</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="go-">Go との比較</h2>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section-5">まとめ</h2>
<ul>
  <li>Code Gear、 Data Gear によって構成される Gears OS の基本的な機能として TaskQueue、 Persistent Data Tree、 Worker の実装を行った</li>
  <li>依存関係のない Twice を実装し、並列処理が行えることを確認した</li>
</ul>


</div>
<div class='slide '>
<!-- _S9SLIDE_ -->
<h2 id="section-6">今後の課題</h2>
<ul>
  <li>一般的に並列処理には依存関係が存在する
    <ul>
      <li>複雑な並列処理を実行できるようにするために Task Manager の実装を行い、  依存関係のある並列処理の例題を作成し、評価する</li>
    </ul>
  </li>
  <li>GPUなどの他のプロセッサ演算に利用することが出来ない
    <ul>
      <li>Data Gear などのデータをGPUにマッピングするための機構が必要</li>
    </ul>
  </li>
  <li>Gears OS でのデバック手法
    <ul>
      <li>継続はスタックを積まないため、スタックトレースを使わないデバック手法の考案</li>
      <li>並列処理でのデバック手法も考案する必要がある</li>
    </ul>
  </li>
  <li>型情報の検査
    <ul>
      <li>プログラムの正しさを保証するために Data Gear の情報を検査するシステムを メタ計算 として実装する</li>
    </ul>
  </li>
  <li>Contextの動的生成
    <ul>
      <li>今は静的に自分で生成している</li>
      <li>CbC 用の Runtime をつくり、 Context を動的に生成</li>
    </ul>
  </li>
</ul>
<!-- === end markdown block === -->
</div>


</div><!-- presentation -->
</body>
</html>