Mercurial > hg > Papers > 2018 > tobaru-sigos
changeset 10:d4e58a38aae7
fix
author | tobaru |
---|---|
date | Tue, 22 May 2018 10:13:39 +0900 |
parents | 5790bdc1d515 |
children | 6fdcb5241bda |
files | Slide/prosym.html Slide/prosym.md Slide/prosym.pdf.html |
diffstat | 3 files changed, 634 insertions(+), 161 deletions(-) [+] |
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>
--- a/Slide/prosym.md Mon May 21 17:18:19 2018 +0900 +++ b/Slide/prosym.md Tue May 22 10:13:39 2018 +0900 @@ -30,10 +30,10 @@ % 拡張性と信頼性を実現する時に Interfaceと par goto 構文がなぜ必要なのかに繋げる話が必要 % APIと実装の分離が望ましい理由は? -## API と実装の分離 -- Gears OS は Continuation based C(以下、CbC)によって記述されている。 -- CbC は Code Gear と Data Gear の単位でプログラムを記述していて、システムやアプリケーションを作る際に、この2つは柔軟に再利用する必要がある。 -- この時に、機能を接続する API と実装の分離が可能であることが望ましい。 +% ## API と実装の分離 +% - Gears OS は Continuation based C(以下、CbC)によって記述されている。 +% - CbC は Code Gear と Data Gear の単位でプログラムを記述していて、システムやアプリケーションを作る際に、この2つは柔軟に再利用する必要がある。 +% - この時に、機能を接続する API と実装の分離が可能であることが望ましい。 % 上と繋がってない % なんでモジュールシステムが必要? @@ -48,6 +48,16 @@ % Interfaceはほとんどかかない % TaskScheduler の図も入れる Gears の構成のやつ + +## スライドの流れ +- <font color="red">Interface</font> +- 並列API +- CbC +- Gears OS における並列実行 +- 比較 +- 今後の課題 + + ## Gears OS での形式化とInterfaceの導入 - 形式化とは仕様、実装、実行を Logic で記述する事である。 - Gears OS では、継続を使った関数型プログラムとして実装を記述する @@ -56,25 +66,39 @@ ## Gears OS の Interface - Code Gear と Deta Gear は Interface と呼ばれるまとまり(モジュール)で記述される。 -- Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。 + - Gears OS のモジュール化 +- Interface 作成時に Code Gear の集合を指定することにより複数の実装(並列処理)を持つことができる。 - Interface は Data Gear で記述されて、Meta Deta Gear と呼ばれる。 - Java などの Class に相当する。 -% - Interface を外から呼び出すための Code Gear 群の型 -- Interface を呼び出す時に必要となる引数を全て格納する Data Gear +- Data Gear に Interface を呼び出す時に必要となる引数を全て格納する % - 実装に使う Code Gear の番号が含まれている。 % - Code Gear の番号を変更することによって異なる実装を実現できる +% - Interface を外から呼び出すための Code Gear 群の型 + % Interface は実行時に実装を入れ替える事ができる % 呼び出すものはStack 上に積めない % Contextも集合 +## スライドの流れ +- Interface +- <font color="red">並列API</font> +- CbC +- Gears OS における並列実行 +- 比較 +- 今後の課題 + + ## 並列API -- Geas OS 信頼性を保証するために、モジュールシステムが必要である。 +- Geas OS 信頼性を保証(テスト)するために、モジュールシステムが必要である。 - 本研究では、モジュールシステムとその応用である並列APIについて考察する。 -- 並列APIは継続を基本とした関数型プログラミングと両立する必要があり、ここでは CbC の goto 文を拡張した par goto を導入する。 +- 並列APIは継続を基本とした関数型プログラミングと両立する必要があり、ここでは CbC の goto 文を拡張した **par goto** を導入する。 + - Interface でモジュール化 + - 応用として par goto を使って 並列API を実装 ## スライドの流れ - Interface +- 並列API - <font color="red">CbC</font> - Gears OS における並列実行 - 比較 @@ -85,14 +109,14 @@ ## CbC -- ノーマルレベルとメタレベルの計算を1つの言語で表現できる言語として、本研究室で設計した CbC を用いる。 -- ノーマルレベルの計算 - - コンピュータの計算はプログラミング言語で行われる。 - - その部分をノーマルレベルの計算と呼ぶ。 -- メタレベルの計算 - - コードが実行される際の以下の部分が、メタレベルの計算という。 - - 処理系の詳細や使用する資源 - - コードの仕様や型などの部分 +- ノーマルレベルとメタレベルの計算をまとめて表現できる言語として、本研究室で設計した CbC を用いる。 + - ノーマルレベルの計算 + - コンピュータの計算はプログラミング言語で行われる。 + - その部分をノーマルレベルの計算と呼ぶ。 + - メタレベルの計算 + - コードが実行される際の以下の部分が、メタレベルの計算という。 + - 処理系の詳細や使用する資源 + - コードの仕様や型などの部分 % ノーマルレベルとメタレベルの違い % 以外 = メモリ @@ -107,7 +131,10 @@ ## CbC - CbC を用いることで、ノーマルレベルの計算の信頼性をメタレベルから保証できるようになる。 + - 処理の詳細やコードの型を数え上げる事による信頼性の保証 - CbC を用いてCode Gear と Data Gear を導入する。 + - Code Gear は並列処理の単位として利用 + - Data Gear はデータそのもの % - 検証には 定理証明支援系である Agda を用いる。 @@ -145,14 +172,14 @@ % par goto を使えば並列実行されたGears の形式化ができる - ## スライドの流れ +- Interface +- 並列API - CbC - <font color="red">Gears OS における並列実行</font> - 比較 - 今後の課題 - ## Gears における並列実行 - Gears OS ではメタ計算を柔軟に記述するためのプログラミングの単位として Code Gear と Data Gear を用いる。 - それぞれにメタレベルの単位が存在し、Meta Data Gear と Meta Code Gear と呼ぶ。 @@ -183,12 +210,34 @@ - 1つのスレッド内で使われる Interface の Code Gear と Data Gear は Meta Data Gear に格納される。 - この Meta Data Gear を Context と呼ぶ。 - Context を複製して複数の CPU に割り当てることにより並列実行が可能になる。 +- ノーマルレベルでは見る事ができない。 - Context は Task でもある。 - Task は実行する Code Gear と Data Gear を全て持っている。 +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400"> +</div> -## par goto -- Context の複製には par goto を用いる。 -- 他に、入力の同期、タスクスケジューラへの Context の登録が行われる。 + + +## TaskManager +- Task を実行する Worker の生成 +- Worker の管理 +- Task の送信 +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400"> +</div> + + + +## Worker +- TaskQueue から Task である Context を取得 +- Task の Code Gear を実行 +- Output Data Gear への書き出し +<div style="text-align: center;"> + <img src="./image/gears_structure.png" alt="Gears OS の構造" width="400"> +</div> + + % exit が説明不足 % code gear の実行は他のシープに邪魔されない。 @@ -209,12 +258,15 @@ -## __exit -- 複数実行した時に、共有 Data Gear に書き込みを成功したかを確認する(commit) + +# par goto +- Context(Task) の複製には par goto を用いる。 +- 他に、入力の同期、タスクスケジューラへの Context の登録が行われる。 +- 複数実行した時に、共有 Data Gear に書き込みを成功したかを確認(commit)するために __exit を使用する。 - par goto で生成された Task は __exit に継続することで終了する - GearsOS の Task は Output Data Gear を生成した時点で終了する - そのため、par goto では直接 __exit に継続せず、Output Data Gear への書き出し処理に継続される。 -- Code Gear と Data Gear の依存関係をノーマルレベルで記述できるようになる。 +% - Code Gear と Data Gear の依存関係をノーマルレベルで記述できるようになる。 ```c __code code1(Integer *integer1, Integer * integer2, Integer *output) { par goto add(integer1, integer2, output, __exit); @@ -241,26 +293,21 @@ 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; goto parGotoMeta(context, C_code2); } ``` +% // 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; @@ -270,7 +317,7 @@ % 失敗した時はmeta compitation で処理する - +% *** % ## Interface @@ -280,11 +327,14 @@ % ## 並列構文 ## スライドの流れ +- Interface +- 並列API - CbC - Gears OS における並列実行 - <font color="red">比較</font> - 今後の課題 + ## Gears OS の評価(目的) - 並列構文とそれを実現する Meta Compitation が十分に揃っているかを確認したい - 並列処理の台数効果を確認する @@ -297,7 +347,7 @@ - Model : Dell PowerEdgeR630 - Memory : 768GB - CPU : 2 × 18-Core Intel Xeon 2.30GHz - - CPU 環境 + - GPU 環境 - GPU : GeForce GTX 1070 - Cores : 1920 - ClockSpeed : 1683MHZ @@ -353,8 +403,51 @@ ## 評価の考察 - コア数が上がるごとに、処理速度が上がっている。 + - 台数効果が見られる - GPUでの実行は 32CPU に比べて約7.2倍の速度向上が見られた。 - 通信速度を含めると 16CPU より遅い。 + - 通信速度によるオーバーヘッド + +<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> % なんでGo言語? ## Go 言語との比較 @@ -367,6 +460,15 @@ ## スライドの流れ +- Interface +- 並列API +- CbC +- Gears OS における並列実行 +- 比較 +- <font color="red">今後の課題</font> + + +## スライドの流れ - CbC - Gears OS における並列実行 - 比較 @@ -377,3 +479,46 @@ - par goto 文を使用することで、Contextを生成し、並列処理を行う。 - しかし、Context はメモリ空間の確保や使用する全ての Code Gear Data Gear の設定をする必要があり、生成に時間がかかってしまう事が原因。 - 処理が軽い場合は Context を生成しないようなチューニングが必要である。 + + + +## Perlスクリプトによる変換 +```c +__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); +} +```
--- a/Slide/prosym.pdf.html Mon May 21 17:18:19 2018 +0900 +++ b/Slide/prosym.pdf.html Tue May 22 10:13:39 2018 +0900 @@ -70,7 +70,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 {} --> @@ -90,11 +90,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> @@ -115,14 +120,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> @@ -131,18 +153,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> @@ -157,19 +185,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> @@ -182,8 +213,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> @@ -211,8 +251,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> @@ -264,19 +306,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> @@ -290,19 +354,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(); } @@ -326,20 +392,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; @@ -351,8 +404,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> @@ -388,7 +443,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> @@ -461,13 +516,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 '> @@ -486,7 +590,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> @@ -500,13 +620,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>