Mercurial > hg > Papers > 2018 > tobaru-sigos
diff Slide/prosym.html @ 10:d4e58a38aae7
fix
author | tobaru |
---|---|
date | Tue, 22 May 2018 10:13:39 +0900 |
parents | 5790bdc1d515 |
children | 6fdcb5241bda |
line wrap: on
line diff
--- a/Slide/prosym.html Mon May 21 17:18:19 2018 +0900 +++ b/Slide/prosym.html Tue May 22 10:13:39 2018 +0900 @@ -86,7 +86,7 @@ <!-- === begin markdown block === generated by markdown/1.2.0 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin15] - on 2018-05-21 16:36:00 +0900 with Markdown engine kramdown (1.13.2) + on 2018-05-22 10:11:16 +0900 with Markdown engine kramdown (1.13.2) using options {} --> @@ -106,11 +106,16 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="api-">API と実装の分離</h2> +<h2 id="section">スライドの流れ</h2> <ul> - <li>Gears OS は Continuation based C(以下、CbC)によって記述されている。</li> - <li>CbC は Code Gear と Data Gear の単位でプログラムを記述していて、システムやアプリケーションを作る際に、この2つは柔軟に再利用する必要がある。</li> - <li>この時に、機能を接続する API と実装の分離が可能であることが望ましい。</li> + <li> + <font color="red">Interface</font> + </li> + <li>並列API</li> + <li>CbC</li> + <li>Gears OS における並列実行</li> + <li>比較</li> + <li>今後の課題</li> </ul> @@ -131,14 +136,31 @@ <!-- _S9SLIDE_ --> <h2 id="gears-os--interface">Gears OS の Interface</h2> <ul> - <li>この時、Code Gear と Deta Gear は Interface と呼ばれるまとまり(モジュール)で記述される。</li> - <li>Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。</li> + <li>Code Gear と Deta Gear は Interface と呼ばれるまとまり(モジュール)で記述される。 + <ul> + <li>Gears OS のモジュール化</li> + </ul> + </li> + <li>Interface 作成時に Code Gear の集合を指定することにより複数の実装(並列処理)を持つことができる。</li> <li>Interface は Data Gear で記述されて、Meta Deta Gear と呼ばれる。</li> <li>Java などの Class に相当する。</li> - <li>Interface を外から呼び出すための Code Gear 群の型</li> - <li>Interface を呼び出す時に必要となる引数を全て格納する Data Gear</li> - <li>実装に使う Code Gear の番号が含まれている。</li> - <li>Code Gear の番号を変更することによって異なる実装を実現できる</li> + <li>Data Gear に Interface を呼び出す時に必要となる引数を全て格納する</li> +</ul> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 id="section-1">スライドの流れ</h2> +<ul> + <li>Interface</li> + <li> + <font color="red">並列API</font> + </li> + <li>CbC</li> + <li>Gears OS における並列実行</li> + <li>比較</li> + <li>今後の課題</li> </ul> @@ -147,18 +169,24 @@ <!-- _S9SLIDE_ --> <h2 id="api">並列API</h2> <ul> - <li>Geas OS 信頼性を保証するために、モジュールシステムが必要である。</li> + <li>Geas OS 信頼性を保証(テスト)するために、モジュールシステムが必要である。</li> <li>本研究では、モジュールシステムとその応用である並列APIについて考察する。</li> - <li>並列APIは継続を基本とした関数型プログラミングと両立する必要があり、ここでは CbC の goto 文を拡張した par goto を導入する。</li> + <li>並列APIは継続を基本とした関数型プログラミングと両立する必要があり、ここでは CbC の goto 文を拡張した <strong>par goto</strong> を導入する。 + <ul> + <li>Interface でモジュール化</li> + <li>応用として par goto を使って 並列API を実装</li> + </ul> + </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section">スライドの流れ</h2> +<h2 id="section-2">スライドの流れ</h2> <ul> <li>Interface</li> + <li>並列API</li> <li> <font color="red">CbC</font> </li> @@ -173,19 +201,22 @@ <!-- _S9SLIDE_ --> <h2 id="cbc">CbC</h2> <ul> - <li>ノーマルレベルとメタレベルの計算を1つの言語で表現できる言語として、本研究室で設計した CbC を用いる。</li> - <li>ノーマルレベルの計算 + <li>ノーマルレベルとメタレベルの計算をまとめて表現できる言語として、本研究室で設計した CbC を用いる。 <ul> - <li>コンピュータの計算はプログラミング言語で行われる。</li> - <li>その部分をノーマルレベルの計算と呼ぶ。</li> - </ul> - </li> - <li>メタレベルの計算 - <ul> - <li>コードが実行される際の以下の部分が、メタレベルの計算という。 + <li>ノーマルレベルの計算 <ul> - <li>処理系の詳細や使用する資源</li> - <li>コードの仕様や型などの部分</li> + <li>コンピュータの計算はプログラミング言語で行われる。</li> + <li>その部分をノーマルレベルの計算と呼ぶ。</li> + </ul> + </li> + <li>メタレベルの計算 + <ul> + <li>コードが実行される際の以下の部分が、メタレベルの計算という。 + <ul> + <li>処理系の詳細や使用する資源</li> + <li>コードの仕様や型などの部分</li> + </ul> + </li> </ul> </li> </ul> @@ -198,8 +229,17 @@ <!-- _S9SLIDE_ --> <h2 id="cbc-1">CbC</h2> <ul> - <li>CbC を用いることで、ノーマルレベルの計算の信頼性をメタレベルから保証できるようになる。</li> - <li>CbC を用いてCode Gear と Data Gear を導入する。</li> + <li>CbC を用いることで、ノーマルレベルの計算の信頼性をメタレベルから保証できるようになる。 + <ul> + <li>処理の詳細やコードの型を数え上げる事による信頼性の保証</li> + </ul> + </li> + <li>CbC を用いてCode Gear と Data Gear を導入する。 + <ul> + <li>Code Gear は並列処理の単位として利用</li> + <li>Data Gear はデータそのもの</li> + </ul> + </li> </ul> @@ -227,8 +267,10 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section-1">スライドの流れ</h2> +<h2 id="section-3">スライドの流れ</h2> <ul> + <li>Interface</li> + <li>並列API</li> <li>CbC</li> <li> <font color="red">Gears OS における並列実行</font> @@ -280,19 +322,41 @@ <li>1つのスレッド内で使われる Interface の Code Gear と Data Gear は Meta Data Gear に格納される。</li> <li>この Meta Data Gear を Context と呼ぶ。</li> <li>Context を複製して複数の CPU に割り当てることにより並列実行が可能になる。</li> + <li>ノーマルレベルでは見る事ができない。</li> <li>Context は Task でもある。</li> <li>Task は実行する Code Gear と Data Gear を全て持っている。</li> </ul> +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400" /> +</div> </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="par-goto">par goto</h2> +<h2 id="taskmanager">TaskManager</h2> <ul> - <li>Context の複製には par goto を用いる。</li> - <li>他に、入力の同期、タスクスケジューラへの Context の登録が行われる。</li> + <li>Task を実行する Worker の生成</li> + <li>Worker の管理</li> + <li>Task の送信</li> </ul> +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400" /> +</div> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 id="worker">Worker</h2> +<ul> + <li>TaskQueue から Task である Context を取得</li> + <li>Task の Code Gear を実行</li> + <li>Output Data Gear への書き出し</li> +</ul> +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400" /> +</div> </div> @@ -306,19 +370,21 @@ <li>このような実行になるように Gears OS の実装を行う</li> </ul> - +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400" /> </div> -<div class='slide '> -<!-- _S9SLIDE_ --> -<h2 id="exit">__exit</h2> -<ul lang="c"> - <li>複数実行した時に、共有 Data Gear に書き込みを成功したかを確認する(commit)</li> + +<h1 id="par-goto">par goto</h1> +<ul> + <li>Context(Task) の複製には par goto を用いる。</li> + <li>他に、入力の同期、タスクスケジューラへの Context の登録が行われる。</li> + <li>複数実行した時に、共有 Data Gear に書き込みを成功したかを確認(commit)するために __exit を使用する。</li> <li>par goto で生成された Task は __exit に継続することで終了する</li> <li>GearsOS の Task は Output Data Gear を生成した時点で終了する</li> <li>そのため、par goto では直接 __exit に継続せず、Output Data Gear への書き出し処理に継続される。</li> - <li>Code Gear と Data Gear の依存関係をノーマルレベルで記述できるようになる。</li> </ul> -<pre><code>__code code1(Integer *integer1, Integer * integer2, Integer *output) { + +<pre lang="c"><code>__code code1(Integer *integer1, Integer * integer2, Integer *output) { par goto add(integer1, integer2, output, __exit); goto code2(); } @@ -342,20 +408,7 @@ context->task->maxIdg = context->task->idg + 2; context->task->odg = context->task->maxIdg; context->task->maxOdg = context->task->odg + 1; - - // create Data Gear Queue - GET_META(integer1)->wait = createSynchronizedQueue(context); - GET_META(integer2)->wait = createSynchronizedQueue(context); - GET_META(integer3)->wait = createSynchronizedQueue(context); - - // set Input Data Gear - context->task->data[context->task->idg+0] = (union Data*)integer1; - context->task->data[context->task->idg+1] = (union Data*)integer2; - - // set Output Data Gear - context->task->data[context->task->odg+0] = (union Data*)integer3; - - +... // set TaskManager->spawns parameter Gearef(context, TaskManager)->taskList = context->taskList; Gearef(context, TaskManager)->next1 = C_code2; @@ -367,8 +420,10 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section-2">スライドの流れ</h2> +<h2 id="section-4">スライドの流れ</h2> <ul> + <li>Interface</li> + <li>並列API</li> <li>CbC</li> <li>Gears OS における並列実行</li> <li> @@ -404,7 +459,7 @@ <li>CPU : 2 × 18-Core Intel Xeon 2.30GHz</li> </ul> </li> - <li>CPU 環境 + <li>GPU 環境 <ul> <li>GPU : GeForce GTX 1070</li> <li>Cores : 1920</li> @@ -477,13 +532,62 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section-3">評価の考察</h2> +<h2 id="section-5">評価の考察</h2> <ul> - <li>コア数が上がるごとに、処理速度が上がっている。</li> + <li>コア数が上がるごとに、処理速度が上がっている。 + <ul> + <li>台数効果が見られる</li> + </ul> + </li> <li>GPUでの実行は 32CPU に比べて約7.2倍の速度向上が見られた。</li> - <li>通信速度を含めると 16CPU より遅い。</li> + <li>通信速度を含めると 16CPU より遅い。 + <ul> + <li>通信速度によるオーバーヘッド</li> + </ul> + </li> </ul> +<table border="1" align="center" width="50%"> + <tbody> + <tr> + <td style="text-align: center;">Processor</td> + <td style="text-align: center;">Time(ms)</td> + </tr> + <tr> + <td style="text-align: center;">1 CPU</td> + <td style="text-align: right;">1181.215</td> + </tr> + <tr> + <td style="text-align: center;">2 CPUs</td> + <td style="text-align: right;">627.914</td> + </tr> + <tr> + <td style="text-align: center;">4 CPUs</td> + <td style="text-align: right;">324.059</td> + </tr> + <tr> + <td style="text-align: center;">8 CPUs</td> + <td style="text-align: right;">159.932</td> + </tr> + <tr> + <td style="text-align: center;">16 CPUs</td> + <td style="text-align: right;">85.518</td> + </tr> + <tr> + <td style="text-align: center;">32 CPUs</td> + <td style="text-align: right;">43.496</td> + </tr> + <tr> + <td style="text-align: center;">GPU</td> + <td style="text-align: right;">127.018</td> + </tr> + <tr> + <td style="text-align: center;">GPU(kernel only)</td> + <td style="text-align: right;">6.018</td> + </tr> + </tbody> +</table> + </div> <div class='slide '> @@ -502,7 +606,23 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section-4">スライドの流れ</h2> +<h2 id="section-6">スライドの流れ</h2> +<ul> + <li>Interface</li> + <li>並列API</li> + <li>CbC</li> + <li>Gears OS における並列実行</li> + <li>比較</li> + <li> + <font color="red">今後の課題</font> + </li> +</ul> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 id="section-7">スライドの流れ</h2> <ul> <li>CbC</li> <li>Gears OS における並列実行</li> @@ -516,13 +636,57 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section-5">今後の課題</h2> +<h2 id="section-8">今後の課題</h2> <ul> <li>Go 言語との比較から 1CPU での動作が遅いことがわかった。</li> <li>par goto 文を使用することで、Contextを生成し、並列処理を行う。</li> <li>しかし、Context はメモリ空間の確保や使用する全ての Code Gear Data Gear の設定をする必要があり、生成に時間がかかってしまう事が原因。</li> <li>処理が軽い場合は Context を生成しないようなチューニングが必要である。</li> </ul> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 lang="c" id="perl">Perlスクリプトによる変換</h2> +<pre><code>__code code1(struct Context *context, Integer *integer1, Integer *integer2, Integer *output) { + // create context + context->task = NEW(struct Context); + initContext(context->task); + + // set task parameter + context->task->next = C_add; + context->task->idgCount = 2; + context->task->idg = context->task->dataNum; + context->task->maxIdg = context->task->idg + 2; + context->task->odg = context->task->maxIdg; + context->task->maxOdg = context->task->odg + 1; + + // create Data Gear Queue + GET_META(integer1)->wait = createSynchronizedQueue(context); + GET_META(integer2)->wait = createSynchronizedQueue(context); + GET_META(integer3)->wait = createSynchronizedQueue(context); + + // set Input Data Gear + context->task->data[context->task->idg+0] = (union Data*)integer1; + context->task->data[context->task->idg+1] = (union Data*)integer2; + + // set Output Data Gear + context->task->data[context->task->odg+0] = (union Data*)integer3; + + // add taskList Element + struct Element* element; + element = &ALLOCATE(context, Element)->Element; + element->data = (union Data*)context->task; + element->next = context->taskList; + context->taskList = element; + + // set TaskManager->spawns parameter + Gearef(context, TaskManager)->taskList = context->taskList; + Gearef(context, TaskManager)->next1 = C_code2; + goto meta(context, C_code2); +} +</code></pre> <!-- === end markdown block === --> </div>