view prepaper/Parallel.tex @ 11:16c5f065f7e7

change files structure, new directory paper and preparer
author oc
date Tue, 17 Feb 2015 10:53:45 +0900
parents
children
line wrap: on
line source

\section{Parallel Computing Platform}
OpenCL および CUDA では、オペレーティングシステムなどが処理されるメイン CPU のことを host、GPGPU を行うグラフィックボードのことを device と定義している。
この device 上で動作するプログラムのことを特別に kernel と呼ぶ。

今回、実装に用いた OpenCL には Command Queue、CUDA には Stream という device に Operation を渡す仕組みがそれぞれ存在する。
Command Queue は clCreateCommandQueue という OpenCL の API に所属する Context と実行対象となる device を指定することで生成される。
Stream は cuStreamCreate という CUDA の API で生成される。
この関数には Context や device を指定する必要がないが、Context を生成したスレッドと同一のスレッドでないと Stream を生成できないという制約がある。
これらに投入された Operation は投入された順序で device 上で逐次実行される。
複数ある場合、異なる Command Queue および Stream に投入されている Operation は並列に実行される。
複数の Stream をある場合の実行の様子は図:\ref{fig:parallel_exec}のようになる。
HtoD は host から device へのデータ転送、kernel は kernel の実行、DtoH は device から host へのデータ転送を示している。

\begin{figure}[!htpd]
  \begin{center}
    \includegraphics[scale=0.35]{./images/paralle_exec.pdf}
  \end{center}
  \caption{Parallel Execution}
  \label{fig:parallel_exec}
\end{figure}

OpenCL では Task の最小単位を WorkItem、CUDA では Thread と定義している。
また、WorkItem をまとめたものを WorkGroup、Thread をまとめたものを Block と呼ぶ。
OpenCL および CUDA にはデータ並列よる実行を行う API がそれぞれ存在する。
OpenCL および CUDA でデータ並列実行すると、一つの記述から index の異なる複数の kernel を自動生成する。
この index を元に自分が担当するデータの範囲が決定される。
OpenCL では clEnqueueNDRangeKernel という API を用いることでデータ並列よる実行を行うことができる。
clEnqueueNDRangeKernel の引数として WorkItem の数と次元数を指定することで全体の Task 数が決定する。
CUDA では cuLaunchKernel という API を用いる。
引数として各次元の Block 数と各次元の Block 一つ当たりの Thread 数を指定することで全体の Task 数を決定する。
実行される各 kernel では index 取得する必要がある。
OpenCL では index の取得に get\_global\_id という API を用いる。
CUDA では kernel に組み込み変数が準備されており、それらから index を算出することができる(図:\ref{fig:index})。

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.4]{./images/culculate_index.pdf}
  \end{center}
  \caption{Calculate Index}
  \label{fig:index}
\end{figure}

INRIA が提供する StarPU というものがある。
CPU と GPU といったヘテロジニアスな環境下でのタスクベースなプログラミングモデルをサポートしている。
メモリ管理や Task のスケジューリングなど管理するリソースが多く、プログラマに大きな負担がかかる。

GPU Programming の問題点として host 側のリソースだけでなく、device 側のリソースまで管理する必要があるという点が上げられる。
また、利用する Platform よって記述が大きくことなることも GPU Programming の難易度を上げている。
Cerium ではプログラマの負担を減らすため、同一のコードで OpenCL および CUDA で動作し、スケジューリングやリソースの管理等を自動で行うようになっている。