Mercurial > hg > Papers > 2018 > parusu-master
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}
--- 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 は複数の数値を引数とし、数値の値がデータの分割数、数値の個数が次元数になる。