Mercurial > hg > Papers > 2018 > parusu-master
changeset 94:e71d4ea8a616
Fix slide
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Feb 2018 02:23:28 +0900 |
parents | efddc417d83b |
children | 3fddb8ee71ea |
files | slide/slide.html slide/slide.md |
diffstat | 2 files changed, 118 insertions(+), 173 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/slide.html Tue Feb 13 00:49:10 2018 +0900 +++ b/slide/slide.html Tue Feb 13 02:23:28 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-12 15:39:39 +0900 with Markdown engine kramdown (1.13.2) + on 2018-02-13 02:23:21 +0900 with Markdown engine kramdown (1.13.2) using options {} --> @@ -143,7 +143,7 @@ </ul> <div style="text-align: center;"> - <img src="./images/codeGear_dataGear_dependency.svg" alt="message" width="600" /> + <img src="./images/codegear-datagear-dependency.svg" alt="message" width="600" /> </div> @@ -165,7 +165,6 @@ <h2 id="meta-gear">Meta Gear</h2> <ul> <li>メタ計算 は Code Gear の接続間に行われる</li> - <li>メタ計算 の処理も Code/Data Gear で実現する</li> <li>この Gear を Meta Code/Data Gearと呼ぶ <ul> <li>Meta Code Gear は メタ計算 のプログラム部分</li> @@ -218,24 +217,6 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="context">Context</h2> -<ul> - <li>Context は接続可能な Code/Data Gear の集合を表現する Meta Data Gear</li> - <li>従来のOS のスレッドやプロセスに対応し、以下の要素を定義している - <ul> - <li>独立したメモリ空間</li> - <li>Code/Data Gear へのポインタ</li> - <li>並列実行用の Task 情報</li> - <li>Data Gear の型情報</li> - </ul> - </li> - <li>Gears OS ではメタ計算でこの Context を経由して Data Gear にアクセスする</li> -</ul> - - -</div> -<div class='slide '> -<!-- _S9SLIDE_ --> <h2 id="data-gear-">Data Gear の表現</h2> <ul> <li>Data Gear は構造体を用いて定義する</li> @@ -262,6 +243,32 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> +<h2 id="context">Context</h2> +<ul> + <li>Context は従来のOS のスレッドやプロセスに対応し、以下の要素をもっている Meta Data Gear + <ul> + <li>Data Gear を確保するためのメモリ空間</li> + <li>Code Gear の名前と関数ポインタとの対応表 + <ul> + <li>Code Gear は番号(enum)で指定する</li> + </ul> + </li> + <li>Code Gear が参照する Data Gear へのポインタ + <ul> + <li>Code Gear と同じく Data Gear も番号で指定する</li> + </ul> + </li> + <li>並列実行用の Task 情報</li> + <li>Data Gear の型情報</li> + </ul> + </li> + <li>Gears OS ではメタ計算で Context を経由して Code/Data Gear にアクセスする</li> +</ul> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> <h2 id="stub-code-gear">stub Code Gear</h2> <ul> <li>Data Gear にアクセスするにはContext を経由する</li> @@ -269,21 +276,9 @@ <li>Gears OS ではメタレベルで通常の Code Gear で必要な Data Gear を Context から取り出す処理を行う stub Code Gear を用意している</li> </ul> -<pre lang="c"><code>// normal level Code Gear -__code cg0(struct Context* context, struct Integer integer, struct Queue queue) { - ... -} - -// meta level stub Code Gear -__code cg0_stub(struct Context* context) { - // get data index number - Integer integer = &context->data[context->dataNum]->Integer - // get enum data - Queue* queue = &context->data[Queue]->Queue; - // continuation Code Gear - goto cg0(context, integer, queue); -} -</code></pre> +<div style="text-align: center;"> + <img src="./images/contextContinuation.svg" alt="message" width="600" /> +</div> </div> @@ -291,13 +286,7 @@ <!-- _S9SLIDE_ --> <h2 id="context--stub-code-gear-">Context での stub Code Gear の記述の問題点</h2> <ul> - <li>stub Code Gear は Context から Code Gear と Data Gear の全ての組合せを展開して記述する必要がある</li> - <li>しかし、 Gears OS を実装するに連れて、 stub Code Gear の記述が煩雑になる場所がでてきた - <ul> - <li>Data Gear は番号で指定するため、 Code Gear が どの Data Gear の番号に対応しているかを記述する必要がある</li> - <li>stub Code Gear を自動生成するために、同じ番号の Data Gear を使いまわす問題</li> - </ul> - </li> + <li>Gears OS を実装するに連れて、stub Code Gear の記述が煩雑になる場所がでてきた</li> <li>そのため Gears OS のモジュール化する仕組みとして <strong>Interface</strong> を導入した</li> </ul> @@ -321,9 +310,8 @@ <ul> <li>Interface の定義には以下の内容を定義する <ul> - <li>引数のData Gear 群</li> - <li>操作(API) 実行後に継続される Code Gear</li> - <li>操作(API) である Code Gear と Code Gear に渡す引数情報</li> + <li>操作(API)の引数群の型</li> + <li>操作(API)自体のCode Gear の型</li> </ul> </li> </ul> @@ -350,7 +338,7 @@ <h2 id="interface--1">Interface の実装</h2> <ul> <li>Interface には複数の実装を行うことが出来る</li> - <li>実装した Code Gear を Interface で定義した Code Gear に代入することで実装を行う</li> + <li>実装した Code Gear の番号を Interface の定義に代入することで実装を行う</li> <li>代入する Code Gear を入れ替えることで別の実装を表現する</li> <li>実装した Data Gear の生成は関数呼び出しで行われ、外から見るとInterface の型で扱われる</li> </ul> @@ -405,7 +393,7 @@ <li>ここでの <strong>interface</strong> は Interfaceの型で包んだData Gear、 <strong>method</strong> は実装した Code Gear に対応する</li> </ul> -<pre><code>__code code1() { +<pre><code>__code code1() { Queue* queue = createSingleLinkedQueue(context); Node* node = new Node(); node->color = Red; @@ -474,10 +462,9 @@ <!-- _S9SLIDE_ --> <h2 id="section-2">並列処理の構成</h2> <ul> - <li>今回はInterface を利用した並列処理機構の実装を行う</li> - <li>構成要素として以下が挙げられる + <li>今回は並列処理機構である <ul> - <li>Task(Context)</li> + <li>Task</li> <li>TaskManager <ul> <li>Worker の生成、依存関係を解決したTask を Worker に送信する</li> @@ -485,7 +472,9 @@ </li> <li>Worker <ul> - <li>SynchronizedQueue から Task を取得し、実行する</li> + <li>SynchronizedQueue から Task を一つずつ取得し、実行する</li> + <li>Worker は CPU、 GPU の対応した数分生成する</li> + <li>Worker 毎に POSIX Therad などのスレッドを生成し、 Code Gear を実行する</li> </ul> </li> <li>SynchronizedQueue @@ -495,15 +484,16 @@ </li> </ul> </li> + <li>をInterface で実装した</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="taskcontext">Task(Context)</h2> +<h2 id="task">Task</h2> <ul> - <li>Gears OS では並列実行する Task を Context で表現する</li> + <li>Gears OS では Context が並列実行の Task に相当する</li> <li>Context は Task用の情報として以下の情報をもっている <ul> <li>実行する Code Gear</li> @@ -511,27 +501,16 @@ <li>待っている Input Data Gear の数</li> </ul> </li> - <li>実際に実行される Code Gear の引数情報は Interface の Code Gear 実装と同等に記述できる - <ul> - <li>Code Gear の stub Code Gear は自動生成される</li> - </ul> - </li> </ul> -<pre lang="c"><code>__code add(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...)) { - output->value = input1->value + input2->value; - goto next(output, ...); -} -</code></pre> - </div> <div class='slide '> <!-- _S9SLIDE_ --> <h2 id="taskmanger">TaskManger</h2> <ul> + <li>Worker を作成、終了処理を行う</li> <li>依存関係を解決した Task を各 Worker の Queue に送信する</li> - <li>Worker を作成、終了処理も行う</li> </ul> <div> @@ -540,11 +519,13 @@ </div> <div style="float: left; font-size=100%;"> <ol> - <li>Task を Input Data Gear として</li> - TaskManager の spawn を呼び出す - <li>Input Data Gear が揃っているかを確認する</li> - <li>揃っている場合、 Worker の Queue に</li> - Task を送信する + <li value="0">Task を Input Data Gear として</li> + TaskManager の spawn を呼び出す + <li value="1">Task内の idgCountをチェックする</li> + idgCount は待っているInput Data Gear のカウンタである + そのため、カウンタが0の場合 Input Data Gear が揃っていることになる + <li value="2">揃っている場合、 Worker の Queue に</li> + Task を送信する </ol> </div> <div style="clear: both;"></div> @@ -556,8 +537,8 @@ <!-- _S9SLIDE_ --> <h2 id="worker">Worker</h2> <ul> - <li>初期化の際にスレッドと Worker 用の Context を生成する</li> - <li>生成されたスレッドではTaskManager から送信された Task を取得して実行する</li> + <li>初期化時に Worker 用の Context を生成する</li> + <li>TaskManager から送信された Task を一つずつ取得して実行する</li> </ul> <div> @@ -569,7 +550,7 @@ <li>Worker は Queue から Task を取得する</li> <li>Worker の Context から</li> Task の Context へ入れ替える - <li>Task の Code Gear を実行</li> + <li>Task に設定されている Code Gear を実行</li> <li>Task の Output Data Gear の書き出し</li> <li>Task Context から</li> Worker の Context へ入れ替える @@ -586,27 +567,19 @@ <h2 id="synchronized-queue">Synchronized Queue</h2> <ul> <li>Worker で使用される Queue</li> - <li>Task を送信するスレッドと Task を取得するスレッドで操作される</li> - <li>そのためマルチスレッドでのデータの一貫性を保証する必要がある</li> - <li>Gears OS では CAS(Check and Set、 Compare and Swap) を使用した Synchronized Queue として実装する + <li>Task を送信するTaskManagerと Task を取得するWorker毎で操作される</li> + <li>そのためマルチスレッドでのデータの同期処理を行える SynchronizedQueue を実装する</li> + <li>Gears OS では CAS(Check and Set、 Compare and Swap) を使用した実装を行った <ul> - <li>CAS は値を更新する際に更新前の値と実際に保存されているメモリ番地の値を比較する</li> + <li>CAS は値を更新する際に更新前の値と実際に保存されているメモリ番地の値を比較し、変化がなければ値を更新する</li> + <li>メモリ番地の値が変わっているなら、もう一度 CAS を行う</li> </ul> </li> - <li>この Queue は Queue Interface を実装し、 List を利用した実装を行った</li> </ul> -<pre><code>struct SynchronizedQueue { - struct Element* top; - struct Element* last; - struct Atomic* atomic; -}; -// Singly Linked List element -struct Element { - union Data* top; - struct Element* next; -}; -</code></pre> +<div style="text-align: center;"> + <img src="./images/synchronizedQueue.svg" alt="message" width="600" /> +</div> </div> @@ -615,7 +588,7 @@ <h2 id="section-3">依存関係の解決</h2> <ul> <li>依存関係の解決は Data Gear がメタレベルで持っている Queue を使用する</li> - <li>この Queue には Data Gear に依存関係がある Code Gear が格納されている</li> + <li>この Queue には Data Gear に依存関係がある Context が格納されている</li> </ul> <div> @@ -624,7 +597,7 @@ </div> <div style="float: left; font-size=100%;"> <ol> - <li>Task の Code Gear を実行する</li> + <li>Task に設定されている Code Gear を実行する</li> <li>Output Data Gear の書き出し処理を行う</li> この際にメタレベルの Queue を参照する <li>依存関係にある Task を取り出し、 待っている</li> @@ -668,11 +641,10 @@ <h2 id="cuda-">CUDA への対応</h2> <ul> <li>Gears OS は GPU での実行もサポートする</li> - <li>GPU で性能を出すためには GPU に合わせた並列プログラミングが必要になる</li> - <li>今回は CUDA への実行のサポートをおこなった</li> <li>CUDA は GPU を Device、 CPU を Host として定義する</li> <li>CUDA は処理の最小の単位を thread とし、それをまとめた block を展開し Device 上で実行されるプログラム(Kernel)を実行する</li> - <li>今回 CUDAWorker、CUDAExecutor、 CUDABuffer を使用して CUDA に合わせた並列処理機構を提供する</li> + <li>GPU で性能を出すためには GPU に合わせた並列プログラミングが必要になる</li> + <li>今回、CUDA に合わせた並列処理機構を Interface を用いて実装した</li> </ul> @@ -721,7 +693,7 @@ <ul> <li>Device にデータ領域を確保するにはサイズの指定が必要</li> <li>Data Gear には Meta Data Gear でデータのサイズを持っている</li> - <li>しかし、 Data Gear の要素の中に Data Gear へのポインタがあるとポインタ分でサイズ計算してしまうため、 GPU では参照できなくなってしまう</li> + <li>Data Gear の要素の中に Data Gear へのポインタがあるとポインタ分でサイズ計算してしまうため、 GPU では参照できなくなってしまう</li> </ul> </li> <li>CUDA Buffer ではそのマッピングを行う @@ -846,10 +818,6 @@ <li>決まった2点間の要素の入れ替えをステージ毎に並列に実行し、 Output Data Gear として書き出し、次のステージの Code Gear の Input Data Gear とする</li> </ul> -<div style="text-align: center;"> - <img src="./images/bitonicNetwork.svg" alt="message" width="500" /> -</div> - </div> <div class='slide '> @@ -926,22 +894,6 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="openmp--1">OpenMP との比較</h2> -<ul> - <li>OpenMP で Twice を実装し、速度比較を行った</li> - <li>OpenMP は 1CPU と 32CPU で約10.8倍の速度向上が見られた</li> - <li>一方 Gears OS では約27.1倍と台数効果は高くなっている</li> - <li>しかし、 Gears OS は 1CPU の実行速度が OpenMP に比べて大幅に遅くなっている</li> -</ul> - -<div style="text-align: center;"> - <img src="./images/vsopenmp.svg" alt="message" width="500" /> -</div> - - -</div> -<div class='slide '> -<!-- _S9SLIDE_ --> <h2 id="go-">Go 言語との比較</h2> <ul> <li>Go 言語は並列実行を <strong>go funciton(argv)</strong> の構文で行う。 この実行を goroutine と呼ぶ</li> @@ -970,6 +922,22 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> +<h2 id="openmp--1">OpenMP との比較</h2> +<ul> + <li>OpenMP で Twice を実装し、速度比較を行った</li> + <li>OpenMP は 1CPU と 32CPU で約10.8倍の速度向上が見られた</li> + <li>一方 Gears OS では約27.1倍と台数効果は高くなっている</li> + <li>しかし、 Gears OS は 1CPU の実行速度が OpenMP に比べて大幅に遅くなっている</li> +</ul> + +<div style="text-align: center;"> + <img src="./images/vsopenmp.svg" alt="message" width="500" /> +</div> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> <h2 id="go--1">Go 言語との比較</h2> <ul> <li>Go 言語でも OpenMP と同様に Twice を実装し、速度比較を行った</li>
--- a/slide/slide.md Tue Feb 13 00:49:10 2018 +0900 +++ b/slide/slide.md Tue Feb 13 02:23:28 2018 +0900 @@ -29,7 +29,7 @@ - Code Gear と Input / Output Data Gear の対応から依存関係を解決し、Input Data Gear が揃った Code Gear の並列実行を行う <div style="text-align: center;"> - <img src="./images/codeGear_dataGear_dependency.svg" alt="message" width="600"> + <img src="./images/codegear-datagear-dependency.svg" alt="message" width="600"> </div> ## メタ計算 @@ -70,16 +70,6 @@ } ``` -## Context -- Context は接続可能な Code/Data Gear の集合を表現する Meta Data Gear -- 従来のOS のスレッドやプロセスに対応し、以下の要素を定義している - - 独立したメモリ空間 - - Code/Data Gear へのポインタ - - Code/Data Gear は番号で指定する - - 並列実行用の Task 情報 - - Data Gear の型情報 -- Gears OS ではメタ計算で Context を経由して Code/Data Gear にアクセスする - ## Data Gear の表現 - Data Gear は構造体を用いて定義する - メタ計算では任意の Data Gear を一律に扱うため、全ての Data Gear は共用体の中で定義される @@ -101,34 +91,29 @@ }; ``` +## Context +- Context は従来のOS のスレッドやプロセスに対応し、以下の要素をもっている Meta Data Gear + - Data Gear を確保するためのメモリ空間 + - Code Gear の名前と関数ポインタとの対応表 + - Code Gear は番号(enum)で指定する + - Code Gear が参照する Data Gear へのポインタ + - Code Gear と同じく Data Gear も番号で指定する + - 並列実行用の Task 情報 + - Data Gear の型情報 +- Gears OS ではメタ計算で Context を経由して Code/Data Gear にアクセスする + ## stub Code Gear - Data Gear にアクセスするにはContext を経由する - だが、通常の Code Gear では Meta Data Gear である Context の参照は避ける必要がある - Gears OS ではメタレベルで通常の Code Gear で必要な Data Gear を Context から取り出す処理を行う stub Code Gear を用意している -``` c -// normal level Code Gear -__code cg0(struct Context* context, struct Integer integer, struct Queue queue) { - ... -} +<div style="text-align: center;"> + <img src="./images/contextContinuation.svg" alt="message" width="600"> +</div> -// meta level stub Code Gear -__code cg0_stub(struct Context* context) { - // get data index number - Integer integer = &context->data[context->dataNum]->Integer - // get enum data - Queue* queue = &context->data[Queue]->Queue; - // continuation Code Gear - goto cg0(context, integer, queue); -} -``` -<- このページを書き換える -> ## Context での stub Code Gear の記述の問題点 -- stub Code Gear は Context から Code Gear と Data Gear の全ての組合せを展開して記述する必要がある -- しかし、 Gears OS を実装するに連れて、 stub Code Gear の記述が煩雑になる場所がでてきた - - Data Gear は番号で指定するため、 Code Gear が どの Data Gear の番号に対応しているかを記述する必要がある - - stub Code Gear を自動生成するために、同じ番号の Data Gear を使いまわす問題 +- Gears OS を実装するに連れて、stub Code Gear の記述が煩雑になる場所がでてきた - そのため Gears OS のモジュール化する仕組みとして **Interface** を導入した ## Interface @@ -139,9 +124,8 @@ ## Interface の定義 - Interface の定義には以下の内容を定義する - - 引数のData Gear 群 - - 操作(API) 実行後に継続される Code Gear - - 操作(API) である Code Gear と Code Gear に渡す引数情報 + - 操作(API)の引数群の型 + - 操作(API)自体のCode Gear の型 ``` c typedef struct Queue<Impl>{ @@ -161,7 +145,7 @@ ## Interface の実装 - Interface には複数の実装を行うことが出来る -- 実装した Code Gear を Interface で定義した Code Gear に代入することで実装を行う +- 実装した Code Gear の番号を Interface の定義に代入することで実装を行う - 代入する Code Gear を入れ替えることで別の実装を表現する - 実装した Data Gear の生成は関数呼び出しで行われ、外から見るとInterface の型で扱われる @@ -203,7 +187,7 @@ - ここでの **interface** は Interfaceの型で包んだData Gear、 **method** は実装した Code Gear に対応する ``` -__code code1() { +__code code1() { Queue* queue = createSingleLinkedQueue(context); Node* node = new Node(); node->color = Red; @@ -254,8 +238,7 @@ ``` ## 並列処理の構成 -- 今回は並列処理機構の実装を Interface を利用して行う -- 構成要素として以下が挙げられる +- 今回は並列処理機構である - Task - TaskManager - Worker の生成、依存関係を解決したTask を Worker に送信する @@ -265,6 +248,7 @@ - Worker 毎に POSIX Therad などのスレッドを生成し、 Code Gear を実行する - SynchronizedQueue - マルチスレッド 環境でもデータの一貫性を保証する Queue +- をInterface で実装した ## Task - Gears OS では Context が並列実行の Task に相当する @@ -285,7 +269,9 @@ <ol> <li value="0">Task を Input Data Gear として</li> TaskManager の spawn を呼び出す - <li value="1">Input Data Gear が揃っているかを確認する</li> + <li value="1">Task内の idgCountをチェックする</li> + idgCount は待っているInput Data Gear のカウンタである + そのため、カウンタが0の場合 Input Data Gear が揃っていることになる <li value="2">揃っている場合、 Worker の Queue に</li> Task を送信する </ol> @@ -295,7 +281,7 @@ ## Worker - 初期化時に Worker 用の Context を生成する -- TaskManager から送信された Task を取得して実行する +- TaskManager から送信された Task を一つずつ取得して実行する <div> <div style="float: left;"> @@ -319,23 +305,14 @@ ## Synchronized Queue - Worker で使用される Queue - Task を送信するTaskManagerと Task を取得するWorker毎で操作される -- そのためマルチスレッドでのデータの同期処理を行う -- Gears OS では CAS(Check and Set、 Compare and Swap) を使用した Synchronized Queue として実装する - - CAS は値を更新する際に更新前の値と実際に保存されているメモリ番地の値を比較する -- この Queue は Queue Interface を実装し、 List を利用した実装を行った +- そのためマルチスレッドでのデータの同期処理を行える SynchronizedQueue を実装する +- Gears OS では CAS(Check and Set、 Compare and Swap) を使用した実装を行った + - CAS は値を更新する際に更新前の値と実際に保存されているメモリ番地の値を比較し、変化がなければ値を更新する + - メモリ番地の値が変わっているなら、もう一度 CAS を行う -``` -struct SynchronizedQueue { - struct Element* top; - struct Element* last; - struct Atomic* atomic; -}; -// Singly Linked List element -struct Element { - union Data* top; - struct Element* next; -}; -``` +<div style="text-align: center;"> + <img src="./images/synchronizedQueue.svg" alt="message" width="600"> +</div> ## 依存関係の解決 - 依存関係の解決は Data Gear がメタレベルで持っている Queue を使用する @@ -407,7 +384,7 @@ - Host、Device 間でデータのやり取りをする際、 Gears OS での Data Gear をDevice 用にマッピングする必要がある - Device にデータ領域を確保するにはサイズの指定が必要 - Data Gear には Meta Data Gear でデータのサイズを持っている - - しかし、 Data Gear の要素の中に Data Gear へのポインタがあるとポインタ分でサイズ計算してしまうため、 GPU では参照できなくなってしまう + - Data Gear の要素の中に Data Gear へのポインタがあるとポインタ分でサイズ計算してしまうため、 GPU では参照できなくなってしまう - CUDA Buffer ではそのマッピングを行う - このマッピングは Task の stub Code Gear で行われる