Mercurial > hg > Papers > 2018 > tobaru-sigos
view 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 source
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Gears OS のモジュール化と並列 API</title> <meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin15]"> <meta name="author" content="Mitsuki Miyagi, Yu Tobaru, Shinji Kono" > <!-- 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'); } }); 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 のモジュール化と並列 API</font></h1> </div> </td> </tr> <tr> <td> <div align="left"> Mitsuki Miyagi, Yu Tobaru, Shinji Kono 琉球大学 <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.4.1 (2017-03-22) [x86_64-darwin15] on 2018-05-22 10:11:16 +0900 with Markdown engine kramdown (1.13.2) using options {} --> <!-- _S9SLIDE_ --> <h2 id="gears-os">Gears OS</h2> <ul> <li>現代のOS では拡張性と信頼性を両立させることが要求されている。 <ul> <li>時代と共にハードウェア、サービスが進歩していき、その度に OS を検証できる必要があるため、拡張性が必要。</li> <li>OS は非決定的な実行を持ち、従来の OS ではテストしきれない部分が残ってしまうため、信頼性が欠けてしまうので信頼性のある OS が必要。</li> </ul> </li> <li>本研究室では、拡張性と信頼性を実現することを目標に Gears OS の開発を行なっている。</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section">スライドの流れ</h2> <ul> <li> <font color="red">Interface</font> </li> <li>並列API</li> <li>CbC</li> <li>Gears OS における並列実行</li> <li>比較</li> <li>今後の課題</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os-interface">Gears OS での形式化とInterfaceの導入</h2> <ul> <li>形式化とは仕様、実装、実行を Logic で記述する事である。</li> <li>Gears OS では、継続を使った関数型プログラムとして実装を記述する</li> <li>Logic としては、依存型関数言語である Agda を使う(外間の発表)</li> <li>証明とモデル検査を使って、信頼性を確保する</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os--interface">Gears OS の Interface</h2> <ul> <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>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> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="api">並列API</h2> <ul> <li>Geas OS 信頼性を保証(テスト)するために、モジュールシステムが必要である。</li> <li>本研究では、モジュールシステムとその応用である並列APIについて考察する。</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-2">スライドの流れ</h2> <ul> <li>Interface</li> <li>並列API</li> <li> <font color="red">CbC</font> </li> <li>Gears OS における並列実行</li> <li>比較</li> <li>今後の課題</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="cbc">CbC</h2> <ul> <li>ノーマルレベルとメタレベルの計算をまとめて表現できる言語として、本研究室で設計した CbC を用いる。 <ul> <li>ノーマルレベルの計算 <ul> <li>コンピュータの計算はプログラミング言語で行われる。</li> <li>その部分をノーマルレベルの計算と呼ぶ。</li> </ul> </li> <li>メタレベルの計算 <ul> <li>コードが実行される際の以下の部分が、メタレベルの計算という。 <ul> <li>処理系の詳細や使用する資源</li> <li>コードの仕様や型などの部分</li> </ul> </li> </ul> </li> </ul> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="cbc-1">CbC</h2> <ul> <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> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="cbc-">CbC の構文</h2> <ul lang="c"> <li>CbC の Code Gear は __code という型を持つ関数として記述する。</li> <li>継続で次の Code Gear に遷移するので、戻り値は持たない。</li> <li>遷移は goto 文による継続で処理を行い、引数として入出力を行う。</li> </ul> <pre><code>__code cg0(int a, int b) { goto cg1(a+b); } __code cg1(int c) { goto cg2(c); } </code></pre> <ul> <li>CbC の記述だけでは並列実行にならない</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section-3">スライドの流れ</h2> <ul> <li>Interface</li> <li>並列API</li> <li>CbC</li> <li> <font color="red">Gears OS における並列実行</font> </li> <li>比較</li> <li>今後の課題</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-">Gears における並列実行</h2> <ul> <li>Gears OS ではメタ計算を柔軟に記述するためのプログラミングの単位として Code Gear と Data Gear を用いる。</li> <li>それぞれにメタレベルの単位が存在し、Meta Data Gear と Meta Code Gear と呼ぶ。</li> <li>メタレベルの計算は Perl スクリプトによって生成され、Code Gear で記述される。</li> </ul> <div style="text-align: center;"> <img src="./image/meta_cg_dg.svg" alt="Meta Data Gear と Meta Code Gear" width="600" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os-">Gears OS の構造</h2> <ul> <li>Gears OS は以下の要素で構成されている <ul> <li>Context</li> <li>TaskQueue</li> <li>TaskManager</li> <li>Worker</li> </ul> </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="context">Context</h2> <ul> <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="taskmanager">TaskManager</h2> <ul> <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> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="code-gear--code-gear-">1つの Code Gear の実行は他の Code Gear に割り込まれない</h2> <ul> <li>共有された Data Gear があった時に、それに対する変更はただ1つの Code Gear だけが許される</li> <li>読み込みは複数であってもいい</li> <li>Agda 側で、並列実行を Code Gear の順次実行としてシミュレーションするため</li> <li>このような実行になるように Gears OS の実装を行う</li> </ul> <div style="text-align: center;"> <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400" /> </div> <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> </ul> <pre lang="c"><code>__code code1(Integer *integer1, Integer * integer2, Integer *output) { par goto add(integer1, integer2, output, __exit); goto code2(); } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="perl--meta-data-gear-">Perl スクリプトによる Meta Data Gear の生成</h2> <pre lang="c"><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; ... // set TaskManager->spawns parameter Gearef(context, TaskManager)->taskList = context->taskList; Gearef(context, TaskManager)->next1 = C_code2; goto parGotoMeta(context, C_code2); } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section-4">スライドの流れ</h2> <ul> <li>Interface</li> <li>並列API</li> <li>CbC</li> <li>Gears OS における並列実行</li> <li> <font color="red">比較</font> </li> <li>今後の課題</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os--1">Gears OS の評価(目的)</h2> <ul> <li>並列構文とそれを実現する Meta Compitation が十分に揃っているかを確認したい</li> <li>並列処理の台数効果を確認する</li> <li>既存の並列言語と比較して不要なオーバーヘッドがあるか調べたい</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os--2">Gears OS の評価(環境)</h2> <ul> <li>CPU、GPU環境で Gears OS の測定を行う。</li> <li>使用した環境は次のようになる。 <ul> <li>CPU 環境 <ul> <li>Model : Dell PowerEdgeR630</li> <li>Memory : 768GB</li> <li>CPU : 2 × 18-Core Intel Xeon 2.30GHz</li> </ul> </li> <li>GPU 環境 <ul> <li>GPU : GeForce GTX 1070</li> <li>Cores : 1920</li> <li>ClockSpeed : 1683MHZ</li> <li>Memory Size : 8GB GDDR5</li> </ul> </li> </ul> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="twice">Twice</h2> <ul> <li>評価には与えられた整数配列の全ての要素を2倍にする例題である Twice を使う。</li> <li>Twice では 通信時間を考慮しなければ、CPU より コア数の多い GPU が有利となる。</li> <li>要素数2^27のデータに対する Twice の実行結果を示す。 <ul> <li>CPU では2^27のデータを64個のデータに分割した。</li> <li>kernel only は 通信速度を除いた速度である。</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 '> <!-- _S9SLIDE_ --> <h2 id="section-5">評価の考察</h2> <ul> <li>コア数が上がるごとに、処理速度が上がっている。 <ul> <li>台数効果が見られる</li> </ul> </li> <li>GPUでの実行は 32CPU に比べて約7.2倍の速度向上が見られた。</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 '> <!-- _S9SLIDE_ --> <h2 id="go-">Go 言語との比較</h2> <ul> <li>Go 言語でも Twice を用いた検証を行い、Gears OS との速度比較を行なった。</li> <li>1CPU と 32CPU では約4.33倍の速度向上が見られた。</li> <li>CPU数による速度向上は、Gears OS の方が上だが、処理速度では Go言語の方が速い結果となった。</li> </ul> <div style="text-align: center;"> <img src="./image/vsgo.svg" alt="Goとの比較" width="500" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <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> <li>比較</li> <li> <font color="red">今後の課題</font> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <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> </div><!-- presentation --> </body> </html>