Mercurial > hg > Papers > 2018 > parusu-master
changeset 102:c48b78793176
Fix
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Feb 2018 11:48:44 +0900 |
parents | cf36d04d11e7 |
children | 05d7669c4a29 |
files | slide/slide.html slide/slide.md |
diffstat | 2 files changed, 66 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/slide.html Tue Feb 13 11:04:20 2018 +0900 +++ b/slide/slide.html Tue Feb 13 11:48:44 2018 +0900 @@ -87,7 +87,7 @@ <!-- === begin markdown block === generated by markdown/1.2.0 on Ruby 2.3.0 (2015-12-25) [x86_64-darwin16] - on 2018-02-13 11:03:08 +0900 with Markdown engine kramdown (1.13.2) + on 2018-02-13 11:44:16 +0900 with Markdown engine kramdown (1.13.2) using options {} --> @@ -306,8 +306,6 @@ <li>操作(API)自体のCode Gear の型</li> </ul> </li> - <li><strong>__code next(…)</strong> は一種のクロージャであり、 引数で Code Gear を渡すことが出来る</li> - <li>… は可変長引数のような扱いで、Code Gear が複数の値をInput Data Gear とする可能性がある</li> </ul> <pre lang="c"><code>typedef struct Queue<Impl>{ @@ -329,7 +327,33 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="interface--1">Interface の実装</h2> +<h2 id="interface--1">Interface の定義</h2> +<ul> + <li><strong>__code next(…)</strong> は一種のクロージャであり、引数で Code Gear を渡すことが出来る</li> + <li>クロージャの引数には Input Data Gear を指定する</li> + <li>… は可変長引数のような扱いで、Code Gear が複数の Input Data Gear を待っている可能性がある</li> +</ul> + +<pre lang="c"><code>typedef struct Queue<Impl>{ + // Data Gear parameter + union Data* queue; + union Data* data; + __code next(...); + __code whenEmpty(...); + + // Code Gear + __code clear(Impl* queue, __code next(...)); + __code put(Impl* queue, union Data* data, __code next(...)); + __code take(Impl* queue, __code next(union Data*, ...)); + __code isEmpty(Impl* queue, __code next(...), __code whenEmpty(...)); +} Queue; +</code></pre> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 id="interface--2">Interface の実装</h2> <ul> <li>Interface には複数の実装を行うことが出来る</li> <li>Code Gear の番号を Interface の定義に代入することで実装を行う</li> @@ -553,7 +577,7 @@ <li>Task に設定されている Code Gear を実行する</li> <li>Output Data Gear の書き出し処理を行う際にメタレベルの Queue を参照する</li> - <li>依存関係にある Task を取り出し、idg Count をデクリメントする</li> + <li>依存関係にある Task を取り出し、IDGCount をデクリメントする</li> </ol> </div> @@ -561,7 +585,7 @@ </div> <ul> - <li>カウンタの値が0になった実行可能な Task は TaskManager を通して Worker に送信される</li> + <li>IDGCountの値が0になった実行可能な Task は TaskManager を通して Worker に送信される</li> </ul> @@ -571,8 +595,8 @@ <h2 id="section-4">並列構文</h2> <ul> <li>並列実行する際は新しく Context を生成し、実行する Code Gear、待ち合わせる Input Data Gear の数、Input/Output Data Gear への参照を設定する</li> - <li>この記述を直接書くと Meta Data Gear である Context を直接参照しているため、ノーマルレベルでの記述では好ましくない</li> - <li>Context の設定は煩雑な記述であるが、並列実行されることを除けば通常の CbC の goto 文と同等である</li> + <li>この記述を直接書くと Meta Data Gear である Context を直接参照しているため、ノーマルレベルでの記述としては好ましくない</li> + <li>Context の設定は煩雑な記述だが、並列実行されることを除けば通常の CbC の goto 文と同等</li> <li>そこで Context を直接参照しない並列構文、 <strong>par goto</strong> 構文を新たに考案した</li> </ul> @@ -583,14 +607,11 @@ <h2 id="par-goto-">par goto 構文</h2> <ul> <li>par goto 構文を記述すると新しく Context を生成し、TaskManager を通して Worker に送信される</li> - <li>par goto 構文には引数として Input/Output Data Gear等を渡す - <ul> - <li>スクリプトによって Code Gear の Input/Output の数を解析する</li> - </ul> - </li> + <li>par goto 構文には引数として Input/Output Data Gear等を渡す</li> + <li>スクリプトによって Code Gear の Input/Output の数を解析し、待っている Input Data Gear の数を設定する</li> <li>並列実行される Task は <strong>__exit</strong> に継続することで終了する <ul> - <li>Gears OS は Task はOutput Data Gear を書き出す処理で終了するため<strong>__exit</strong> に直接継続せずに Data Gear を書き出す処理に継続する</li> + <li>Gears OS の Task はOutput Data Gear を書き出す処理で終了するため <strong>__exit</strong> に直接継続せずに Data Gear を書き出す処理に継続する</li> </ul> </li> <li>par goto 構文は通常のプログラミングの関数呼び出しのように扱える</li> @@ -610,9 +631,9 @@ <ul> <li>Gears OS は GPU での実行もサポートしている</li> <li>GPU で性能を出すためには GPU に合わせた並列プログラミングが必要になる</li> - <li>今回、CUDA に合わせた並列処理機構を Interface を用いて実装した</li> <li>CUDA は GPU を Device、 CPU を Host として定義する</li> <li>CUDA は処理の最小の単位を thread とし、それをまとめた block を展開し Device 上で実行されるプログラム(Kernel)を実行する</li> + <li>今回、CUDA に合わせた並列処理機構である CUDAWorker、 CUDAExecutor をInterface を用いて実装し、 CPU、GPU間のデータのマッピングのために CUDABuffer を用意した</li> </ul> @@ -705,7 +726,6 @@ <li>Cores : 1920</li> <li>ClockSpeed : 1683MHz</li> <li>Memory Size : 8GB GDDR5</li> - <li>Memory Bandwidth : 256GB/s</li> </ul> </li> </ul> @@ -905,7 +925,7 @@ <h2 id="section-6">今後の課題</h2> <ul> <li>Gears OS の並列処理の信頼性の保証、チューニングを行う</li> - <li>Gears OS では検証とモデル検査をメタレベルで実現することで信頼性を保証する + <li>Gears OS では証明とモデル検査をメタレベルで実現することで信頼性を保証する <ul> <li>証明は CbC のプログラムを証明支援系の Agda に対応して行う。 並列処理の信頼性を保証するには SynchronizedQueue の証明を行う必要がある</li> <li>モデル検査は CbC で記述された モデル検査器である akasha を使用して行う。 モデル検査の方針としては Code Gear の並列実行を擬似並列で実行し、全ての組合せを列挙する方法で行う</li>
--- a/slide/slide.md Tue Feb 13 11:04:20 2018 +0900 +++ b/slide/slide.md Tue Feb 13 11:48:44 2018 +0900 @@ -123,8 +123,27 @@ - Interface の定義には以下の内容を定義する - 操作(API)の引数群の型 - 操作(API)自体のCode Gear の型 -- **__code next(...)** は一種のクロージャであり、 引数で Code Gear を渡すことが出来る -- ... は可変長引数のような扱いで、Code Gear が複数の値をInput Data Gear とする可能性がある + +``` c +typedef struct Queue<Impl>{ + // Data Gear parameter + union Data* queue; + union Data* data; + __code next(...); + __code whenEmpty(...); + + // Code Gear + __code clear(Impl* queue, __code next(...)); + __code put(Impl* queue, union Data* data, __code next(...)); + __code take(Impl* queue, __code next(union Data*, ...)); + __code isEmpty(Impl* queue, __code next(...), __code whenEmpty(...)); +} Queue; +``` + +## Interface の定義 +- **__code next(...)** は一種のクロージャであり、引数で Code Gear を渡すことが出来る +- クロージャの引数には Input Data Gear を指定する +- ... は可変長引数のような扱いで、Code Gear が複数の Input Data Gear を待っている可能性がある ``` c typedef struct Queue<Impl>{ @@ -293,27 +312,27 @@ <li>Task に設定されている Code Gear を実行する</li> <li>Output Data Gear の書き出し処理を行う際にメタレベルの Queue を参照する</li> - <li>依存関係にある Task を取り出し、idg Count をデクリメントする</li> + <li>依存関係にある Task を取り出し、IDGCount をデクリメントする</li> </ol> </div> <div style="clear: both;"></div> </div> -- カウンタの値が0になった実行可能な Task は TaskManager を通して Worker に送信される +- IDGCountの値が0になった実行可能な Task は TaskManager を通して Worker に送信される ## 並列構文 - 並列実行する際は新しく Context を生成し、実行する Code Gear、待ち合わせる Input Data Gear の数、Input/Output Data Gear への参照を設定する -- この記述を直接書くと Meta Data Gear である Context を直接参照しているため、ノーマルレベルでの記述では好ましくない -- Context の設定は煩雑な記述であるが、並列実行されることを除けば通常の CbC の goto 文と同等である +- この記述を直接書くと Meta Data Gear である Context を直接参照しているため、ノーマルレベルでの記述としては好ましくない +- Context の設定は煩雑な記述だが、並列実行されることを除けば通常の CbC の goto 文と同等 - そこで Context を直接参照しない並列構文、 **par goto** 構文を新たに考案した ## par goto 構文 - par goto 構文を記述すると新しく Context を生成し、TaskManager を通して Worker に送信される - par goto 構文には引数として Input/Output Data Gear等を渡す - - スクリプトによって Code Gear の Input/Output の数を解析する +- スクリプトによって Code Gear の Input/Output の数を解析し、待っている Input Data Gear の数を設定する - 並列実行される Task は **__exit** に継続することで終了する - - Gears OS は Task はOutput Data Gear を書き出す処理で終了するため**__exit** に直接継続せずに Data Gear を書き出す処理に継続する + - Gears OS の Task はOutput Data Gear を書き出す処理で終了するため **__exit** に直接継続せずに Data Gear を書き出す処理に継続する - par goto 構文は通常のプログラミングの関数呼び出しのように扱える ``` c @@ -326,9 +345,9 @@ ## CUDA への対応 - Gears OS は GPU での実行もサポートしている - GPU で性能を出すためには GPU に合わせた並列プログラミングが必要になる -- 今回、CUDA に合わせた並列処理機構を Interface を用いて実装した - CUDA は GPU を Device、 CPU を Host として定義する - CUDA は処理の最小の単位を thread とし、それをまとめた block を展開し Device 上で実行されるプログラム(Kernel)を実行する +- 今回、CUDA に合わせた並列処理機構である CUDAWorker、 CUDAExecutor をInterface を用いて実装し、 CPU、GPU間のデータのマッピングのために CUDABuffer を用意した ## CUDAWorker - CUDA で実行する Task を受け取る Worker @@ -382,7 +401,6 @@ - Cores : 1920 - ClockSpeed : 1683MHz - Memory Size : 8GB GDDR5 - - Memory Bandwidth : 256GB/s ## Twice - Twice は与えられた整数配列を2倍にする例題である @@ -535,7 +553,7 @@ ## 今後の課題 - Gears OS の並列処理の信頼性の保証、チューニングを行う -- Gears OS では検証とモデル検査をメタレベルで実現することで信頼性を保証する +- Gears OS では証明とモデル検査をメタレベルで実現することで信頼性を保証する - 証明は CbC のプログラムを証明支援系の Agda に対応して行う。 並列処理の信頼性を保証するには SynchronizedQueue の証明を行う必要がある - モデル検査は CbC で記述された モデル検査器である akasha を使用して行う。 モデル検査の方針としては Code Gear の並列実行を擬似並列で実行し、全ての組合せを列挙する方法で行う - 現在の CUDA 実装では CPU、GPU 間のデータの通信コストがかかってしまうことが例題からわかった