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}
Binary file paper/master_paper.pdf has changed
--- 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}