Mercurial > hg > Papers > 2018 > parusu-master
changeset 97:8596c1e30858
Update cudaDataArchitecture.graffle
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Feb 2018 04:48:06 +0900 |
parents | 14bd1b466bcc |
children | c54c5fe77216 |
files | paper/fig/cudaDataArchitecture.graffle paper/fig/cudaDataArchitecture.pdf paper/fig/cudaDataArchitecture.xbb paper/master_paper.pdf slide/images/cudaDataArchitecture.graffle slide/images/synchronizedQueue.graffle slide/slide.html slide/slide.md |
diffstat | 8 files changed, 63 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/fig/cudaDataArchitecture.xbb Tue Feb 13 03:36:25 2018 +0900 +++ b/paper/fig/cudaDataArchitecture.xbb Tue Feb 13 04:48:06 2018 +0900 @@ -4,5 +4,5 @@ %%HiResBoundingBox: 0.000000 0.000000 448.000000 598.000000 %%PDFVersion: 1.3 %%Pages: 1 -%%CreationDate: Fri Feb 2 00:45:11 2018 +%%CreationDate: Tue Feb 13 04:47:33 2018
--- a/slide/slide.html Tue Feb 13 03:36:25 2018 +0900 +++ b/slide/slide.html Tue Feb 13 04:48:06 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 03:34:14 +0900 with Markdown engine kramdown (1.13.2) + on 2018-02-13 04:42:29 +0900 with Markdown engine kramdown (1.13.2) using options {} --> @@ -674,16 +674,10 @@ <!-- _S9SLIDE_ --> <h2 id="cudabuffer">CUDABuffer</h2> <ul> - <li>Host、Device 間でデータのやり取りをする際、 Gears OS での Data Gear をDevice 用にマッピングする必要がある - <ul> - <li>Device にデータ領域を確保するにはサイズの指定が必要</li> - <li>Data Gear には Meta Data Gear でデータのサイズを持っている</li> - <li>Data Gear の要素の中に Data Gear へのポインタがあるとポインタ分でサイズ計算してしまうため、 GPU では参照できなくなってしまう</li> - </ul> - </li> + <li>Host、Device 間でデータのやり取りをする際、 Gears OS での Data Gear をDevice 用にマッピングする必要がある</li> <li>CUDA Buffer ではそのマッピングを行う <ul> - <li>このマッピングは Task の stub Code Gear で行われる</li> + <li>このマッピングは Task に設定されている stub Code Gear で行われる</li> </ul> </li> </ul> @@ -699,10 +693,14 @@ <h2 id="cuda--1">CUDA での呼び出し</h2> <ul> <li>Gears OS では Task で実行される Code Gear の stub Code Gear で CUDA による実行を切り替える</li> - <li>stub Code Gear で CUDABuffer でのマッピング、 実行する kernel の読み込みを行う</li> + <li>stub Code Gear で CUDABuffer でのマッピング、実行する kernel の読み込みを行う</li> <li>stub Code Gear は CUDA で実行する際は CUDAExecutor の Code Gear に継続する</li> </ul> +<div style="text-align: center;"> + <img src="./images/gotoCUDAExecutor.svg" alt="message" width="600" /> +</div> + </div> <div class='slide '> @@ -909,7 +907,7 @@ <!-- _S9SLIDE_ --> <h2 id="section-5">まとめ</h2> <ul> - <li>Gears OS の並列処理機構の実装を行った</li> + <li>Gears OS の並列処理機構を Interface を用いて実装を行った</li> <li>Interface を導入することで、見通しの良し Gears OS のプログラミングが可能となった</li> <li>par goto 構文を導入することで、ノーマルレベルで並列処理の記述が可能になった</li> <li>2つの例題である程度の台数効果が出ることを確認した</li> @@ -922,28 +920,12 @@ <h2 id="section-6">今後の課題</h2> <ul> <li>Gears OS の並列処理の信頼性の保証、チューニングを行う</li> -</ul> - - -</div> -<div class='slide '> -<!-- _S9SLIDE_ --> -<h2 id="section-7">今後の課題</h2> -<ul> <li>Gears OS では検証とモデル検査をメタレベルで実現することで信頼性を保証する <ul> <li>証明は CbC のプログラムを証明支援系の Agda に対応して行う。 並列処理の信頼性を保証するには SynchronizedQueue の証明を行う必要がある</li> <li>モデル検査は CbC で記述された モデル検査器である akasha を使用して行う。 モデル検査の方針としては Code Gear の並列実行を擬似並列で実行し、全ての組合せを列挙する方法で行う</li> </ul> </li> -</ul> - - -</div> -<div class='slide '> -<!-- _S9SLIDE_ --> -<h2 id="section-8">今後の課題</h2> -<ul> <li>現在の CUDA 実装では CPU、GPU 間のデータの通信コストがかかってしまうことが例題からわかった <ul> <li>Meta Data Gear に Data Gear が CPU、 GPU のどこで所持されているのかを持たせ、 GPU の Data Gear が CPU で必要になったときに始めてデータの通信を行う</li> @@ -955,9 +937,9 @@ </div> <div class='slide '> <!-- _S9SLIDE_ --> -<h2 id="section-9">今後の課題</h2> +<h2 id="section-7">今後の課題</h2> <ul> - <li>OpenMP、 Go で Twice を実装し、 Gears OS の性能比較を行った</li> + <li>OpenMP、 Go 言語で Twice を実装し、 Gears OS の性能比較を行った</li> <li>その結果、 Gears OS が 1CPU での動作が遅いということがわかった。 <ul> <li>par goto 文を使用する度に Context を生成するため、 ある程度の時間がかかってしまう</li> @@ -967,7 +949,33 @@ </ul> <div style="text-align: center;"> - <img src="./images/compareExamples.svg" alt="message" width="600" /> + <img src="./images/compareExamples.svg" alt="message" width="500" /> +</div> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 id="section-8">データ並列</h2> +<ul> + <li>data並列はあるデータ構造がサブデータへ分割することが可能で、各サブデータに行う処理が同じ場合に有効な並列処理手法</li> + <li>Gears OS ではdata 並列は par goto 構文に<strong>iterate(分割数)</strong>を追加することで可能になる</li> + <li>データ並列の Task は CPU で実行する際は Task にインデックスを付与して分割数分コピーして実行する</li> + <li>CUDA の場合は Kernel を実行する際にパラメーターとして分割数を渡す</li> +</ul> + + +</div> +<div class='slide '> +<!-- _S9SLIDE_ --> +<h2 id="task-">Task 間の同期処理</h2> +<ul> + <li>Context 間での同期処理を行うために Semaphore を実装</li> + <li>Semaphore はContext 停止用の待ち Queue を持つ</li> +</ul> + +<div style="text-align: center;"> + <img src="./images/semaphoreSequence.svg" alt="message" width="700" /> </div> <!--
--- a/slide/slide.md Tue Feb 13 03:36:25 2018 +0900 +++ b/slide/slide.md Tue Feb 13 04:48:06 2018 +0900 @@ -363,11 +363,8 @@ ## CUDABuffer - Host、Device 間でデータのやり取りをする際、 Gears OS での Data Gear をDevice 用にマッピングする必要がある - - Device にデータ領域を確保するにはサイズの指定が必要 - - Data Gear には Meta Data Gear でデータのサイズを持っている - - Data Gear の要素の中に Data Gear へのポインタがあるとポインタ分でサイズ計算してしまうため、 GPU では参照できなくなってしまう - CUDA Buffer ではそのマッピングを行う - - このマッピングは Task の stub Code Gear で行われる + - このマッピングは Task に設定されている stub Code Gear で行われる <div style="text-align: center;"> <img src="./images/cudaDataArchitecture.svg" alt="message" width="400"> @@ -375,9 +372,13 @@ ## CUDA での呼び出し - Gears OS では Task で実行される Code Gear の stub Code Gear で CUDA による実行を切り替える -- stub Code Gear で CUDABuffer でのマッピング、 実行する kernel の読み込みを行う +- stub Code Gear で CUDABuffer でのマッピング、実行する kernel の読み込みを行う - stub Code Gear は CUDA で実行する際は CUDAExecutor の Code Gear に継続する +<div style="text-align: center;"> + <img src="./images/gotoCUDAExecutor.svg" alt="message" width="600"> +</div> + ## Gears OS の評価 - 並列処理のタスクの例題として Twice と BitonicSort を実装し、 以下の環境で測定を行った - CPU 環境 @@ -534,31 +535,42 @@ ``` ## まとめ -- Gears OS の並列処理機構の実装を行った +- Gears OS の並列処理機構を Interface を用いて実装を行った - Interface を導入することで、見通しの良し Gears OS のプログラミングが可能となった - par goto 構文を導入することで、ノーマルレベルで並列処理の記述が可能になった - 2つの例題である程度の台数効果が出ることを確認した ## 今後の課題 - Gears OS の並列処理の信頼性の保証、チューニングを行う - -## 今後の課題 - Gears OS では検証とモデル検査をメタレベルで実現することで信頼性を保証する - 証明は CbC のプログラムを証明支援系の Agda に対応して行う。 並列処理の信頼性を保証するには SynchronizedQueue の証明を行う必要がある - モデル検査は CbC で記述された モデル検査器である akasha を使用して行う。 モデル検査の方針としては Code Gear の並列実行を擬似並列で実行し、全ての組合せを列挙する方法で行う - -## 今後の課題 - 現在の CUDA 実装では CPU、GPU 間のデータの通信コストがかかってしまうことが例題からわかった - Meta Data Gear に Data Gear が CPU、 GPU のどこで所持されているのかを持たせ、 GPU の Data Gear が CPU で必要になったときに始めてデータの通信を行う ## 今後の課題 -- OpenMP、 Go で Twice を実装し、 Gears OS の性能比較を行った +- OpenMP、 Go 言語で Twice を実装し、 Gears OS の性能比較を行った - その結果、 Gears OS が 1CPU での動作が遅いということがわかった。 - par goto 文を使用する度に Context を生成するため、 ある程度の時間がかかってしまう - モデル検査で par goto の Code Gear のフローを解析し、処理がかる場合は Context を生成せずに関数呼出しを行う等の最適化が必要 <div style="text-align: center;"> - <img src="./images/compareExamples.svg" alt="message" width="600"> + <img src="./images/compareExamples.svg" alt="message" width="500"> +</div> + + +## データ並列 +- data並列はあるデータ構造がサブデータへ分割することが可能で、各サブデータに行う処理が同じ場合に有効な並列処理手法 +- Gears OS ではdata 並列は par goto 構文に**iterate(分割数)**を追加することで可能になる +- データ並列の Task は CPU で実行する際は Task にインデックスを付与して分割数分コピーして実行する +- CUDA の場合は Kernel を実行する際にパラメーターとして分割数を渡す + +## Task 間の同期処理 +- Context 間での同期処理を行うために Semaphore を実装 +- Semaphore はContext 停止用の待ち Queue を持つ + +<div style="text-align: center;"> + <img src="./images/semaphoreSequence.svg" alt="message" width="700"> </div> <!--