Mercurial > hg > Papers > 2018 > parusu-master
changeset 29:39fe904d9a34
Fix Interface
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 02 Feb 2018 02:35:00 +0900 |
parents | 8dcc5e6eb39d |
children | 9fa82713bd5c |
files | paper/gpu.tex paper/interface.tex paper/master_paper.pdf paper/parallelism_gears.tex |
diffstat | 4 files changed, 69 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/gpu.tex Thu Feb 01 07:04:52 2018 +0900 +++ b/paper/gpu.tex Fri Feb 02 02:35:00 2018 +0900 @@ -3,8 +3,7 @@ % CUDA のアーキテクチャの図がいる? % block とか grid とかの関係 -\chapter{CUDA への対応} - +\chapter{CUDA への対応} Gears OS では GPU での実行もサポートする。 また、 CPU、 GPU の実行環境の切り替えは Meta Code Gear、 つまり stub Code Gear で切り替えを行う。 @@ -26,7 +25,7 @@ \begin{figure}[htbp] \begin{center} - \includegraphics[scale=0.6]{./fig/cudaArchitecture.pdf} + \includegraphics[scale=0.5]{./fig/cudaArchitecture.pdf} \end{center} \caption{blockサイズ(3,3)、 threadサイズ(3,3) に展開} \label{fig:cudaArchitecture} @@ -45,8 +44,37 @@ 生成されたスレッドはCUDAライブラリ初期化や後述する CUDAExectuor の生成を行う。 データ並列用の Task は CUDAWorker に送信する際は Task のコピーを行わず送信する。 -受け取った データ並列用の Task は Code Gear のメタレベルで GPU 側の実行を行う。 - -\section{stub Code Gear による CUDAExectuor の実行} +受け取ったデータ並列用の Task は Code Gear のメタレベルで kernel の実行を行う。 \section{CUDAExectuor} +CUDAExectuor は Host から Device へのデータの送信、 kernel の実行、 Device から Host への データの書き出しを行う。 + +Gears OS では データは Data Gear で表現される。 +つまり、Host、Device 間でデータのやり取りを行うということは Data Gear を GPU のデータ領域に沿った形に適用する必要がある。 +Host から Device へデータを送信する際、 CUDA では cuMemAlloc 関数を使用して Device 側のデータ領域を確保する。 +cuMemAlloc 関数には確保するデータ領域のサイズを指定する必要がある。 +全ての Data Gear には Meta Data Gear として Data Gear のサイズを持っており、基本的にはこのサイズでデータ領域を取ればよいのだが、Data Gear によっては内部に更にポインタで Data Gear を持っている場合がある。 +このような Data Gear は Data Gear の実際のサイズではなく、ポインタのサイズで計算されてしまうため、そのままでは Device 用のデータ領域を確保することができない。 + +この問題を解決するために、CUDABuffer という CUDA データ送信用の Data Gear を用意した. +CUDABuffer には Data Gear の内部にポインタを持たない Data Gear まで展開した Input/Output Data Gear を格納される。 +Data Gear を CUDABuffer に格納する処理は CUDAExectuor では行わず、実行される Task の stub Code Gear で行われる。 +CUDABuffer に格納されている Data Gear のサイズを参照し、 cuMemAlloc 関数で Device のデータ領域を確保する。 + +Host、Device、CUDABuffer 間の関係を\figref{cudaDataArchitecture} に示す。 +Host から Device にデータをコピーするには cuMemcpyHtoD 関数を使用して行う。 +この際に Host で指定するデータは CUDABuffer に格納されている Data Gear となる。 +kernel の実行後、結果を Device から Host にコピーする際は cuMemcpyDtoH 関数で行われる。 + +\begin{figure}[htbp] + \begin{center} + \includegraphics[scale=0.6]{./fig/cudaDataArchitecture.pdf} + \end{center} + \caption{Host、 Device 間のデータの関係} + \label{fig:cudaDataArchitecture} +\end{figure} + +kernel の実行はcuLaunchKernel 関数で行われる。 +実際にcuLaunchKernel 関数を使用している部分を \coderef{cuLaunchKernel} に示す。 + +\section{stub Code Gear による kernel の実行}
--- a/paper/interface.tex Thu Feb 01 07:04:52 2018 +0900 +++ b/paper/interface.tex Fri Feb 02 02:35:00 2018 +0900 @@ -33,32 +33,43 @@ \section{Interface の定義} Interface は使用される Data Gear の定義と、それに対する操作を行う Code Gear の集合を表現する Meta Data Gear である。 -Interface は 定義されている Code Gear の引数になる Data Gear 群、各 Code Gear の引数パターンの集合を記述する。 Interface には複数の実装を持つことができ、実装によって実行する Code Gear を切り替えることが可能になる。 この Code Gear は C++ の virtual 関数、Java の abstract メソッドに対応する。 -Queue の Interface を \coderef{queueInterface} に示す。 -\coderef{queueInterface} の3-4行目は 引数の Data Gear 群を定義している。 -ここで定義された Data Gear 名は、定義された Code Gear の引数に対応する。 -\coderef{queueInterface} では10行目で Queue に要素を挿入する Code Gear を定義しており、引数として挿入する Queue の実装と挿入する要素を受け取る。 -この引数それぞれが \coderef{queueInterface} の3-4行目で定義した queue と data に対応する。 +\coderef{queueInterface} に Queue の Interface を示す。 +Interface には以下の内容を定義する。 +\begin{itemize} + \item 引数の Data Gear 群 + + \coderef{queueInterface} 3-4行目は 引数の Data Gear 群を定義している。 + ここで定義された Data Gear 名は、定義された Code Gear の引数に対応する。 -\coderef{queueInterface} の5-6行目は Interface の Code Gear の実行後に継続される Code Gear を定義している。 -この値は Interface の Code Gear を呼び出す際に外から代入される。 -Code Gear によってこの継続は複数設定される場合がある。 -\coderef{queueInterface} では12行目で Queue が空かどうかを調べる Code Gear が定義されており、中身がある場合と空の場合で別の継続を渡す必要がある。 -``\_\_code next(...)'' の引数である ``...'' は複数の Output Data Gearを書き出すことを示している。 -つまり、実行後に継続される Code Gear の Input Data Gear に対応する。 -この ``...'' は通常のプログラミング言語では可変長引数のような扱いである。 + この Interface では10行目で Queue に要素を挿入する Code Gear を定義しており、引数として挿入する Queue の実装と挿入する要素を受け取る。 + この引数それぞれが3-4行目で定義した queue と data に対応する。 + + \item Interface が所属する Code Gear の実行後に継続される Code Gear + + Interface の Code Gear は基本的には実行後の継続先は不定となっており、継続元から渡される。 + 継続元から渡される値 は \coderef{queueInterface} 5-6行目に定義している変数に格納される。 + ``\_\_code next(...)'' の引数である ``...'' は複数の Input Data Gear を持つという意味である。 + この ``...'' は他のプログラミング言語では可変長引数のような扱いである。 + また、実行する Code Gear によってこの継続は複数設定される場合がある。 + + 例えば、この Interface では12行目で Queue が空かどうかを調べる Code Gear を定義しており、中身がある場合と空の場合で別の継続を渡す必要がある。 -\coderef{queueInterface} の9-12行目は実装される Data Gear の操作(API)を行う Code Gear を \_\_code として定義する。 \_\_code の実体は Code Gear への番号が格納される変数であり、実装した Code Gear に対応する番号を代入する。 -この Code Gear の引数には Data Gear と Code Gear 実行後に継続される Code Gear 等を渡す。 -引数の型と変数名は Interface で定義されている Data Gear 群に対応するように記述する。 -引数の Data Gear はその Code Gear のInput Data Gear になり、引数の Code Gear の中の引数が Output Data Gear になる。 -Code Gear の第一引数には Interface を実装した Data Gear を渡す。 -これは、Code Gear の操作の対象となる Data Gear を設定しており、 後述する継続構文では引数として記述しない。 -\coderef{queueInterface} では11行目で Queue から要素の取り出しを行う Code Gear を定義しており、引数として 取り出すQueue の実装と、Code Gear 実行後に継続される Code Gear を受け取る。 -引数の Code Gear である``\_\_code next(union Data*, ...)``の ``(union Data*, ...)'' は Queue の要素取り出しを行う Code Gear の Output Data Gear であり、実行後に継続される Code Gear の Input Data Gear になる。 + \item 操作(API) である Code Gear と Code Gear に渡す引数情報 + + 操作(API) に対応する Code Gear は \coderef{queueInterface} 9-12行目 のように \_\_code として定義する。 + この \_\_code の実体は Code Gear への番号が格納される変数であり、実装した Code Gear に対応する番号を代入する。 + Code Gear の引数には Data Gear と Code Gear 実行後に継続される Code Gear 等を記述する。 + 引数の Data Gear はその Code Gear のInput Data Gear になり、引数の Code Gear の中の引数が Output Data Gear になる。 + Code Gear の第一引数には Interface を実装した Data Gear を渡す。 + これは、Code Gear の操作の対象となる Data Gear を設定しており、後述する継続構文では引数として記述を行わない。 + + この Interface では11行目で Queue から要素の取り出しを行う Code Gear を定義しており、引数として取り出す Queue の実装と、Code Gear 実行後に継続される Code Gear を受け取る。 + 引数の Code Gear である``\_\_code next(union Data*, ...)``の ``(union Data*, ...)'' は Queue の要素取り出しを行う Code Gear の Output Data Gear であり、実行後に継続される Code Gear の Input Data Gear になる。 +\end{itemize} + \lstinputlisting[caption=QueueのInterface, label=code:queueInterface]{./src/queueInterface.h} @@ -74,9 +85,9 @@ \coderef{singleLinkedQueue} は Queue Interface(\coderef{queueInterface}) を用いた SingleLinkedQueue の実装である。 Interface で実装した Data Gear の生成は関数呼び出しで行われる。 -\coderef{singleLinkedQueue} では 3-14行目のcreateSingleLinkedQueue 関数 で Data Gear の生成を行っている。 +createSingleLinkedQueue 関数(\coderef{singleLinkedQueue} 3-14行目)は実装した Data Gear の生成を行っている。 この関数は生成する Data Gear の初期化(\coderef{singleLinkedQueue} 7-8行目)と、実装した Code Gear を Interface で定義した Code Gear の代入(\coderef{singleLinkedQueue} 9-12行目)を行う。 -実際に実装する Data Gear(\coderef{singleLinkedQueue} の場合 SingleLinkedQueue) は Interface の型に包まれて生成される(\coderef{singleLinkedQueue} 6行目)。 +実際に実装する Data Gear は Interface の型に包まれて生成される(\coderef{singleLinkedQueue} 6行目)。 このように生成することで実装した Data Gear は実装以外の場所からは Interface の型として扱う事ができる。 \lstinputlisting[caption=SingleLinkedQueue の実装, label=code:singleLinkedQueue]{./src/singleLinkedQueue.cbc}
--- a/paper/parallelism_gears.tex Thu Feb 01 07:04:52 2018 +0900 +++ b/paper/parallelism_gears.tex Fri Feb 02 02:35:00 2018 +0900 @@ -239,7 +239,7 @@ 依存関係が解決され、実行可能な Task になった際に、 Iterator Interface の exec を呼ぶ。 exec では par goto で渡された次元、数値分 Task を コピーし、インデックスを割り当てる処理を行う。 この index は コピーされた Task の Input Data Gear として扱われ、Code Gear 内では通常の Data Gear として利用される。 -\coderef{iterateTaskExec} は1次元で 数値$4$ を渡した場合の Task 実行を示している。 +\figref{iterateTaskExec} は1次元で 数値$4$ を渡した場合の Task 実行を示している。 コピーされた Task は通常の Task と同じように TaskManager を通して Worker に送信される。 \lstinputlisting[caption=Iterator Interface の定義, label=code:iteratorInterface]{./src/iteratorInterface.h}