annotate paper/data_parallel.tex @ 4:8c37fee42142

fix
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Wed, 06 Nov 2013 21:09:42 +0900
parents 423b4d15e248
children 744885be1943
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
1 \section{Data 並列}\label{data_parallel}
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
2 多次元の Data 構造がある場合には高い並列度を保つには,それを分割して並列に実行する機能が必要である。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
3 これを OpenCL では Data 並列と呼んでいる。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
4 次元数に対応する index があり,OpenCL では一つの記述から異なる index を持つ処理が並列に実行される。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
5 Cerium で OpenCl の Data 並列を利用するために,OpenCL の API に合わせた iterate という API を用意した。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
6 iterate には length を引数として渡し,Scheduler で length の値と渡した引数の個数を次元数として Task 数を計算し,並列に実行する。
0
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
4
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
8 例として,CPU 数 4,一次元で10個の Data に対して Data 並列実行を行った場合,
2
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
9 各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。
0
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
2
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
11 この例だと各 CPU に対するindexの割り当ては,
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
12 CPU0 は index 0,4,8
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
13 CPU1 は index 1,5,9,
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
14 CPU2 は index 2,6,
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
15 CPU3 は index 3,7 となっている。
0
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \begin{tiny}
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 \begin{table}[h]
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 \begin{center}
2
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
20 \caption{Data 並列実行時の index の割り当て}
0
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 \label{table:data_parallel_index}
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 \small
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 \begin{tabular}[t]{c||c|c|c|c}
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 \hline
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 stage&CPU0& CPU1&CPU2&CPU3 \\
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 \hline
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 1&0&1&2&3 \\
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 \hline
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 2&4&5&6&7 \\
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 \hline
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 3&8&9& & \\
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 \hline
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 \end{tabular}
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 \end{center}
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \end{table}
9e88a388ec83 first commit
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \end{tiny}
4
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
37
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
38 \subsection{Data 並列における index 割り当ての実装}
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
39 Scheduler で,Data 並列実行を行う Task を検出し,各 CPU で Task を実行する。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
40 各 CPU が担当する index は SchedTask に格納してある。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
41 実行時の Task は以下のように記述する。
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
42
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
43 \begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm]
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
44 static int // Task
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
45 run(SchedTask *s,void *rbuf, void *wbuf)
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
46 {
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
47 float *indata1,*indata2,*outdata;
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
48
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
49 indata1 = (float*)s->get_input(rbuf, 0);
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
50 indata2 = (float*)s->get_input(rbuf, 1);
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
51 outdata = (float*)s->get_output(wbuf, 0);
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
52
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
53 uisigned long i = s->x;
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
54 outdata[i]=indata1[i]*indata2[i];
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
55 return 0;
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
56 }
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
57 \end{Verbatim}
2
b7c8a956c10b write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
58 並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。
4
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
59 iterate を実装したことで,Task を生成する部分をループで回す必要はなく,OpenCL と同様に一つの記述で異なる index を持つ Task を CPU 上で実行することができるようになった。