annotate paper/opencl.tex @ 8:cfc4347f4098 default tip

fin
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Sat, 27 Apr 2013 12:01:30 +0900
parents 41d37434e62c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \section{OpenCL}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 OpenCLとは、マルチコアCPUとGPUのようなヘテロジニアスな環境を利用した並列計算を支援するフレームワークである。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 このフレームワークを用いてCeriumをGPGPUに対応させる。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 OpenCLには主に2つの仕様がある。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \begin{itemize}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 \item OpenCL C言語
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \item OpenCL ランタイムAPI
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 \end{itemize}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 OpenCL Cは演算用プロセッサ(本研究ではGPU)上で動作する、C言語を拡張したプログラミング言語である。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 一方でOpenCLランタイムAPIはOpenCL Cで記述したプログラムをGPU上で実行させるため、
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 制御用のプロセッサ(本研究ではCPU)が利用するAPIである。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 OpenCLではGPU側をkernel、制御デバイス側をhostとして定義する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \subsection{Command Queue}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 OpenCLでは、デバイスの操作にCommand Queueを使用する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 Command QueueはKernelに命令を送るための仕組みである。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 Command QueueはclCreateCommandQueueというOpenCL APIで作成され、
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 Command Queueが所属するコンテキストや実行対象となるデバイスを指定する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 Kernelの実行、input dataへの書き込み、output data の読み込みといった
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 メモリ操作はこのCommand Queueを通して行われる。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 \subsection{メモリアクセス}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 host側は主にdataをinput/outputするメモリ資源の確保を行う。
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
28 GPUのメモリ空間(図\ref{fig:gpuarch})やCellのメモリ空間(図\ref{fig:cellarch})
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
29 はマルチコアCPU(図\ref{fig:cpuarch})と違い、共有メモリでないためhostとkernel(task)間でdataの共有ができない。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
30 アクセスするにはメモリ空間間でコピーしなければならない。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
31
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
32 GPGPUではhost側で memory bufferを作成してメモリのコピーを行う。
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 これらの処理やTaskはCommand Queueにenqueueすることで実行される。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 \begin{figure}[htb]
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \begin{center}
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
36 \includegraphics[scale=0.3]{./images/gpu_arch.pdf}
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 \end{center}
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
38 \caption{Gpu Archtecture}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
39 \label{fig:gpuarch}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
40 \end{figure}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
41
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
42 \begin{figure}[ht]
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
43 \begin{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
44 \includegraphics[scale=0.5]{./images/cell_arch.pdf}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
45 \end{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
46 \caption{Cell Archtecture}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
47 \label{fig:cellarch}
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 \end{figure}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
50 \begin{figure}[ht]
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
51 \begin{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
52 \includegraphics[scale=0.5]{./images/cpu_arch.pdf}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
53 \end{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
54 \caption{Cpu Archtecture}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
55 \label{fig:cpuarch}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
56 \end{figure}
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 \subsection{データ並列}
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
59 多次元のデータ構造がある場合に高い並列度を保つには、それを分割して並列に実行する機能が必要である。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
60 これをOpen CLではデータ並列と読んでいる。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
61 OpenCLは次元数に対応するindexがあり、openclは一つの記述から異なるindexを持つ複数のkernelを自動生成する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
62 その添字をglobal\_idとよぶ
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 この時入力されたデータはワークアイテムという処理単位に分割される。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
65 OpenCLはワークアイテムに対してそれぞれを識別するID(global\_id)を割り当てる。
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 kernelはget\_global\_id APIによってIDを取得し、取得したIDに対応するデータに対して処理を行い、
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 データ並列を実現する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 このIDによって取得してきたワークアイテムをグローバルワークアイテムという。
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
69 また、ワークアイテムは3次元までのデータを渡すことができる。
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 データ並列によるkernel実行の場合はclEnqueueNDRangeKernel APIを使用するが、
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
72 この関数の引数としてワークアイテムのサイズと次元数を指定することでデータ並列で実行できる。
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 \subsection{ワークグループ}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 前節でワークアイテムという処理単位について述べたが、
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
76 さらに複数個のグローバルワークアイテムをwork\_groupという単位にまとめることができる。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
77 work\_group内では同期やローカルメモリの共有が可能となる。
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 グローバルワークアイテム(ワークアイテム全体)の個数と、
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 ローカルワークアイテム(グループ一つ辺りのアイテム)の個数を指定することでワークアイテムを分割する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 なお、このときグローバルワークアイテム数はローカルアイテム数の整数倍でなければ
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 clEnqueueNDRangeKernel API呼び出しは失敗する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 ローカルアイテム数は0を指定することで、コンパイル時に最適化させることができる。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 したがってローカルアイテムのサイズは0を指定するのが一般的である。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
6
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
87 \begin{figure}[htb]
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
88 \begin{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
89 \includegraphics[scale=0.60]{./images/workitem.pdf}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
90 \end{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
91 \caption{WorkItem ID}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
92 \label{fig:workitem_id}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
93 \end{figure}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
94
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95 なお、work\_groupを設定した場合はglobal\_idの他にwork\_group\_id、local\_idが
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 それぞれのkernelに割り当てられる(図:\ref{fig:workitem_id})。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 kernel側からそれぞれIDに対応したAPIを使用して、各IDを取得する。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 取得したIDから自分が担当するindexを計算して導く。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 表:\ref{table:kernel_id_api}はkernel側で使用できる、IDを取得するためのAPIとなる。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 \begin{tiny}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 \begin{table}[h]
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 \begin{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 \caption{kernelで使用するID取得のAPI}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 \label{table:kernel_id_api}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 \small
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 \begin{tabular}[t]{c|l}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 \hline
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
109 get\_group\_id & work\_group\_idを取得 \\
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 \hline
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
111 get\_local\_id & local\_idを取得 \\
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 \hline
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
113 get\_global\_id & global\_idを取得 \\
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 \hline
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 \end{tabular}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 \end{center}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 \end{table}
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 \end{tiny}
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
119 なお、local\_id、global\_idを取得するAPIは引数に0、1、2の値をsetすることができる。
1
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 idはx,y,z座標があり、それぞれが0,1,2に対応している。
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 例えばget\_global\_id(1)と呼び出した場合はy座標の、
2
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
122 get\_global\_id(1)と呼び出した場合はz座標のglobal\_idを取得する。