Mercurial > hg > Papers > 2016 > parusu-sigos
view presen/sigos.html @ 21:f035e77dcca3 default tip
Update
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 01 Jun 2016 00:19:05 +0900 |
parents | cd38e09f980b |
children |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Code Gear、 Data Gear に基づく OS のプロトタイプ</title> <meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 2.3.1 (2016-04-26) [x86_64-darwin15]"> <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">Code Gear、 Data Gear に基づく 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.1 (2016-04-26) [x86_64-darwin15] on 2016-05-31 11:06:27 +0900 with Markdown engine kramdown (1.11.1) using options {} --> <!-- _S9SLIDE_ --> <h2 id="gears-os">Gears OS</h2> <ul> <li>当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて <ul> <li>並列性</li> <li>柔軟性</li> <li>信頼性</li> </ul> </li> </ul> <p>を指標とした Gears OS を設計してきた</p> <ul> <li>本研究では Gears OS のプロトタイプとして並列処理機構を Continuation based C(CbC) で実装を行う</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os-">Gears OS の並列性</h2> <ul> <li>Gears OS はプログラムの単位として Gear を用いる</li> <li>Gear には プログラムの処理を示す Code Gear、 Data を示す Data Gear がある</li> <li>Code/Data Gear を用いて記述することでプログラム全体の並列度を高め、効率的に並列処理することが可能</li> </ul> <div style="text-align: center;"> <img src="./images/codeGear_dataGear.svg" alt="message" width="450" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os--1">Gears OS の柔軟性</h2> <ul> <li>Gears OS は Meta Computation を使用することで <ul> <li>データ拡張や機能の追加</li> <li>GPU 等のさまざまなアーキテクチャでも同じプログラムの動作</li> <li>バージョンが異なる者同士がネットワーク接続しても通信</li> </ul> </li> </ul> <p>等を柔軟に対応する</p> <ul> <li>Meta Computation は 通常の Computaiton と階層を分けて処理を行う</li> </ul> <div style="text-align: center;"> <img src="./images/meta_gear.svg" alt="message" width="800" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os--2">Gears OS の信頼性</h2> <ul> <li>検証 <ul> <li>モデル検査を行う</li> <li>モデル検査は状態の数が膨大になると検査するのが難しい</li> <li>そのため、不必要な状態である環境やスタックをなるべく取り除き、処理を行う</li> </ul> </li> <li>証明 <ul> <li>Code Gear と Data Gear を理論的に定義</li> </ul> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section">この発表は</h2> <ul> <li>Gears OS でのGear</li> <li>Meta Computation</li> <li>Continuation based C(CbC)</li> <li>CbC を用いた Gears OS の記述</li> <li>Gears OS の並列処理のプロトタイプ</li> <li>まとめ</li> <li>課題</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 は int や 文字列などの Data そのものを表す</li> <li>Code Gear は必要な Input Data Gear が揃ったら実行し、 Output Data Gear を生成する</li> <li>Code Gear と Input / Output 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="meta-computation">Meta Computation</h2> <ul> <li>Meta Computation は通常の Computation のための Computation</li> <li>並列処理の依存関係の解決、 GPUなどのアーキテクチャでの実行のために行う処理などを行う</li> <li>Gears OS では Meta Computation を Meta Code Gear, Meta Data Gear で表現</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="meta-gear">Meta Gear</h2> <ul> <li>Meta Computation は Code/Data Gearの接続の間に行われる</li> <li>Meta Computation の処理も Code/Data Gear で実現する</li> <li>この Gear を Meta Code/Data Gearと呼ぶ <ul> <li>Meta Code Gear は Meta Computation のプログラム部分</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="continuation-based-c">Continuation based C</h2> <ul> <li>Gears OS の実装は本研究室で開発している Continuation based C(CbC) を用いる</li> <li>CbC は処理を Code Segment を用いて記述する事を基本とする</li> <li>Code Segment は Code Gear を同等のものため、 Gears OS を記述するのに適している</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="continuation-based-c-1">Continuation based C</h2> <ul> <li>Code Segment の定義は <code>__code CS名</code> で行う</li> <li>Code Segment 間は <code>goto CS名</code> で移動する。この移動を継続と呼ぶ</li> <li>Code Segment の継続は C の関数呼び出しとは異なり、戻り値を持たないためスタックの変更を行わない <ul> <li>このような環境を持たない継続を軽量継続と呼ぶ</li> </ul> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="continuation-based-c-2">Continuation based C</h2> <ul> <li>このコードは code1、code2 の2つの Code Segment を定義している</li> <li>code1 内の <code>goto code2</code> でcode2 への継続を行っている</li> </ul> <pre lang="c"><code>/* code1 define */ __code code1(List list) { .... goto code2(list) } /* code2 define */ __code code2(List list) { ... } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="cbc--gears-os-">CbC を用いた Gears OS の記述</h2> <ul> <li>Gears OS での Code Gear も Code Segment の定義のように記述する</li> <li>各 Code Gear の引数は 必要な Data Gear を示す</li> <li>このコードでは 2つの Code Gear と 1つの Meta Code Gear を定義しており、 code1 から code2への継続を行っている</li> </ul> <pre lang="c"><code>__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) { ... } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="cbc--gears-os--1">CbC の Gears OS サポート</h2> <ul> <li>実際は code1 から code2 への継続の間には Meta Code Gear である meta_code1 が実行される</li> <li>通常は Meta Level の継続をプログラマーは意識する必要はない</li> <li>そこで、CbC は Code Gear 間の接続に自動的に Meta Code Gear を挟むというサポートを行う</li> <li>CbC のサポートを行うとこのコードのように展開される</li> <li>メタレベルのサポートの際は <strong>context</strong> という Meta Data Gear を使用する</li> </ul> <pre lang="c"><code>__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) { ... } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="context">Context</h2> <ul> <li>Context は <ul> <li>接続可能な Code/Data Gear のリスト</li> <li>独立したメモリ空間 をもっている</li> </ul> </li> <li>各 Code/Data Gear にアクセスする際は Context を経由する</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="context-1">Context</h2> <ul> <li>Context は <ul> <li>実行可能な Code Gear の数を示す <strong>codeNum</strong></li> <li>実行可能な Code Gear のリストを示す <strong>code</strong></li> <li>Data Gear の Allocate 用の <strong>heapStart</strong>, <strong>heap</strong>, <strong>heapLimit</strong></li> <li>Data Gear の数を示す <strong>dataNum</strong></li> <li>Data Gear のリストを示す <strong>data</strong> で構成される</li> </ul> </li> </ul> <pre lang="c"><code>/* context define */ struct Context { int codeNum; __code (**code) (struct Context*); void* heapStart; void* heap; long heapLimit; int dataNum; union Data **data; }; </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="context-2">Context</h2> <ul> <li>実行可能な Code Gear の名前は <strong>enum code</strong> で定義する</li> <li>Context の初期化時に名前と関数ポインタを対応付ける</li> <li>現在の Gears ではこの enum code 使って接続先の Code Gear を指定する</li> </ul> <pre lang="c"><code>enum Code { Code1, Code2, Code3, Exit, }; </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="data-gear-">Data Gear の表現</h2> <ul> <li>使用する Data Gear は C の共用体と構造体を用いた表現をする</li> <li>これを元に Gears OS は 必要な Data Gear を allocate する</li> </ul> <pre lang="c"><code>/* data Gear define */ union Data { struct Time { enum Code next; double time; } time; struct LoopCounter { int i; } loopCounter; .... }; </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="code-gear--stub">Code Gear の stub</h2> <ul> <li>Data Gear にアクセスするにはContext を経由する</li> <li>だが、通常の Code Gear では Meta Data Gear である Context の参照は避ける必要がある</li> <li>Gears OS では通常の Code Gear で必要な Data Gear を Context から取り出す stub を用意する</li> <li>stub は一種の Meta Code Gear であるため、 CbC で自動生成される</li> <li>このコードでは Array と LoopCounter が必要な code1 の stub を示している</li> </ul> <pre lang="c"><code>__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); } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section-1">プロトタイプ の構成</h2> <ul> <li>今回は並列処理を行う機構の実装を行う</li> <li>必要な要素は大きく5つ <ul> <li>Context</li> <li>TaskQueue <ul> <li>実行される Task のリストを扱う</li> </ul> </li> <li>Persistent Data Tree <ul> <li>Code Gear によって参照される Data Gear の管理を行う</li> </ul> </li> <li>Worker <ul> <li>TaskQueue から 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="taskqueue">TaskQueue</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> <pre lang="c"><code>// Data Gear define union Data { struct Queue { struct Element* first; struct Element* last; } queue; struct Element { struct Task* task; struct Elemen* next; } element }; </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="taskqueueenqueue">TaskQueueの操作(Enqueue)</h2> <ul> <li>Task を挿入する場合 Queue の last から最後の要素を取り出し、次の要素に新しく挿入する要素を設定</li> <li>正しく最後の要素が変更できたことを CAS で 保証し、末尾の変更を行う必要がある</li> </ul> <pre lang="c"><code>__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); } } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="persistent-data-tree">Persistent Data Tree</h2> <ul> <li>Persistent Data Tree は Data Gear の管理を行う</li> <li>TaskQueue と同じですべての Thread で共有される</li> <li>Red-Black Tree アルゴリズムを用いて木構造の平衡性を保つ</li> <li>木構造から読み出される Data Gear は Code Gear の Input Data Gear, 書き出すData Gear は Output Data Gear になる</li> </ul> <div style="text-align: center;"> <img src="./images/persistent_date_tree_2.svg" alt="message" width="800" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="persistent-data-tree-1">Persistent Data Tree</h2> <ul> <li>Persistent Data Tree は <ul> <li>Tree 自体を示す Data Gear</li> <li>Node を示す Data Gear</li> </ul> </li> </ul> <p>を用いて木構造を表現する</p> <pre lang="c"><code>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; }; </code></pre> </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="taskmanger">TaskManger</h2> <ul> <li>TaskManager は Task の依存関係の解決を行う</li> <li>Thread の作成と停止も行う</li> </ul> <div style="text-align: center;"> <img src="./images/taskManager.svg" alt="message" width="800" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section-2">プロトタイプの実行</h2> <ul> <li>今回 Gears OS の構成要素である Persistent Data Tree, TaskQueue, Worker の実装を行った</li> <li>これにより、 Gears OS を用いて依存関係のない並列処理の実行が可能になった</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="gears-os--code-gear-">Gears OS で実行する Code Gear 例</h2> <ul> <li>プロトタイプのタスクの例題として Twice を実装した</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->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(); } </code></pre> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section-3">並列処理の確認</h2> <ul> <li>Twice を使用し、Gears OS が実際に並列処理されているかどうかの確認を行った</li> <li>環境 <ul> <li>Memory : 16GB</li> <li>CPU : 6-core Intel Xeon 2.66GHZ x 2</li> </ul> </li> <li>要素数 : 2^17 * 1000</li> <li>分割数 : 640 タスク</li> <li>1 Task 当たりの処理量 : 2^11 * 100 elements</li> </ul> <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="cerium-">Cerium との比較</h2> <ul> <li>Cerium は本研究室で開発していた並列プログラミングフレームワーク</li> <li>Cerium では Task を依存関係に沿って実行することで並列実行を可能にする <ul> <li>本来 Task はデータに依存するもので Task 間の依存関係ではデータの依存関係を保証することが出来ない</li> <li>Gears OS の Task 中身は Code Gear になっており、必要な Input Data Gear が揃わない限り実行しないため、データの依存関係を保証できる</li> </ul> </li> <li>Task には汎用ポインタとしてデータの受け渡しを行う <ul> <li>型情報がなく、型の検査を行うことが出来ない</li> <li>Gears OS では 型情報をもつ Data Gear を定義</li> </ul> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="os-">既存の OS への対応</h2> <ul> <li>Gears OS は従来の OS が行ってきたネットワーク管理、メモリ管理、並行制御などのメタな部分を Meta Code/Data Gear として定義</li> <li>通常の Code Gear から必要な制御を Meta Code Gear で行うことで従来のOSが行ってきた制御の提供を行う</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="section-4">まとめ</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-5">今後の課題</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 の情報を検査するシステムを Meta Computation として実装する</li> </ul> </li> <li>Contextの動的生成 <ul> <li>今は静的に自分で生成している</li> <li>CbC 用の Runtime をつくり、 Context を動的に生成</li> </ul> </li> </ul> <!-- === end markdown block === --> </div> </div><!-- presentation --> </body> </html>