changeset 28:8dcc5e6eb39d

Update
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Thu, 01 Feb 2018 07:04:52 +0900
parents bc7ea5774f6b
children 39fe904d9a34
files paper/gpu.tex paper/master_paper.pdf paper/parallelism_gears.tex
diffstat 3 files changed, 53 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/paper/gpu.tex	Wed Jan 31 21:25:43 2018 +0900
+++ b/paper/gpu.tex	Thu Feb 01 07:04:52 2018 +0900
@@ -1,1 +1,52 @@
-\chapter{GPGPU}
+% TODO 
+% CUDABuffer はいらないかも
+% CUDA のアーキテクチャの図がいる?
+  % block とか grid とかの関係
+
+\chapter{CUDA への対応}
+
+Gears OS では GPU での実行もサポートする。
+また、 CPU、 GPU の実行環境の切り替えは Meta Code Gear、 つまり stub Code Gear で切り替えを行う。
+
+本章では、 Gears OS での CUDA 実行のサポートについて説明する。
+
+\section{CUDA}
+CUDA\cite{cuda} とは NVIDA 社が提供する GPU コンピューティング向けの総合開発環境である。
+
+CUDA は演算用プロセッサ(GPU) を Device、制御用デバイス側(CPU) を Host として定義する。
+また、Device 上で実行するプログラムのことを kernel と呼ぶ。
+
+また、CUDA には CUDA Runtime API と CUDA Driver API の2種類存在する。
+Driver API は Runtime API に比べて管理すべきリソースが多いが、 Runtime API より柔軟な処理を行うことが出来る。
+Gears OS では Driver API を用いて GPU 実行の実装を行う。
+
+CUDA では処理の最小の単位を thread と定義しており、それをまとめたものを block と呼ぶ。
+block と thread は それぞれ3次元まで展開することが出来る。
+\figref{cudaArchitecture} に thread, block を2次元で展開した例を示す。
+
+\begin{figure}[htbp]
+    \begin{center}
+        \includegraphics[scale=0.6]{./fig/cudaArchitecture.pdf}
+    \end{center}
+    \caption{blockサイズ(3,3)、 threadサイズ(3,3) に展開}
+    \label{fig:cudaArchitecture}
+\end{figure}
+
+kernel を起動すると、各 thread に対して block ID と thread ID が付与される。
+この ID は blockIdx、threadIdx といった組み込み変数で取得できる。
+これらの変数は3次元のベクター型になっており、blockIdx.x とすると x座標の block ID が取得でき、 threadIdx.x とするとx座標の thread Id を取得できる。
+また、block 内の thread 数は blockDim という組み込み変数で取得でき、これも3次元のベクター型になっている。
+CUDA では これらの組み込み変数から thread が対応するデータを割り出し、データ並列の処理を行う。
+
+\section{CUDAWorker}
+CUDAWorker は TaskManager から送信される CUDA用の Task を取得し、実行を行う。
+
+CUDAWorker は CPUWorker と同じく初期化の際にスレッドが生成される。
+生成されたスレッドはCUDAライブラリ初期化や後述する CUDAExectuor の生成を行う。
+
+データ並列用の Task は CUDAWorker に送信する際は Task のコピーを行わず送信する。
+受け取った データ並列用の Task は Code Gear のメタレベルで GPU 側の実行を行う。
+
+\section{stub Code Gear による CUDAExectuor の実行}
+
+\section{CUDAExectuor}
Binary file paper/master_paper.pdf has changed
--- a/paper/parallelism_gears.tex	Wed Jan 31 21:25:43 2018 +0900
+++ b/paper/parallelism_gears.tex	Thu Feb 01 07:04:52 2018 +0900
@@ -226,7 +226,7 @@
 タスク並列は処理をタスクに分割し、各タスク間に依存関係のないものを集め、それを並列化する。
 Gears OS では依存関係を Input/Output Data Gear から解析を行い、依存関係が解決された Code Gear から実行される。
 一方でデータ並列は処理対象のデータが十分な数のサブデータへ分割することが可能で、各サブデータに行う処理が同じ場合に有効な並列処理手法である。
-このデータ並列は GPGPU と相性が良く、ヘテロジニアスな環境でも実行できる Gears OS でもサポートを行った。
+このデータ並列は GPGPU と相性が良く、GPU 環境でも実行できる Gears OS でもサポートを行った。
 
 Gears OS でデータ並列実行を行う場合、\coderef{iteratePargoto} のようにpar goto 文の引数にデータ並列用の構文として iterate を入れて実行する。
 iterate は複数の数値を引数とし、数値の値がデータの分割数、数値の個数が次元数になる。