comparison 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
comparison
equal deleted inserted replaced
3:423b4d15e248 4:8c37fee42142
1 \section{Cerium における Data 並列}\label{data_parallel} 1 \section{Data 並列}\label{data_parallel}
2 Cerium では,iterate に length を引数として渡し,length の値と渡した引数の個数を次元数として Task 数を Scheduler が計算する。 2 多次元の Data 構造がある場合には高い並列度を保つには,それを分割して並列に実行する機能が必要である。
3 それぞれの CPU が担当する index は SchedTask に格納してある。 3 これを OpenCL では Data 並列と呼んでいる。
4 実行時の Task は以下のように記述する。 4 次元数に対応する index があり,OpenCL では一つの記述から異なる index を持つ処理が並列に実行される。
5 Cerium で OpenCl の Data 並列を利用するために,OpenCL の API に合わせた iterate という API を用意した。
6 iterate には length を引数として渡し,Scheduler で length の値と渡した引数の個数を次元数として Task 数を計算し,並列に実行する。
5 7
6 \begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm] 8 例として,CPU 数 4,一次元で10個の Data に対して Data 並列実行を行った場合,
7 static int // Task
8 run(SchedTask *s,void *rbuf, void *wbuf)
9 {
10 float *indata1,*indata2,*outdata;
11
12 indata1 = (float*)s->get_input(rbuf, 0);
13 indata2 = (float*)s->get_input(rbuf, 1);
14 outdata = (float*)s->get_output(wbuf, 0);
15
16 uisigned long i = s->x;
17 outdata[i]=indata1[i]*indata2[i];
18 return 0;
19 }
20 \end{Verbatim}
21
22 \subsection{Data 並列における index 割り当ての実装}
23 4 CPU で,一次元で10個の Data に対して Data 並列実行を行った場合,
24 各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。 9 各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。
25 10
26 この例だと各 CPU に対するindexの割り当ては, 11 この例だと各 CPU に対するindexの割り当ては,
27 CPU0 は index 0,4,8 12 CPU0 は index 0,4,8
28 CPU1 は index 1,5,9, 13 CPU1 は index 1,5,9,
47 \hline 32 \hline
48 \end{tabular} 33 \end{tabular}
49 \end{center} 34 \end{center}
50 \end{table} 35 \end{table}
51 \end{tiny} 36 \end{tiny}
52 この実装により,Cerium で Data 並列実行が可能になった。 37
38 \subsection{Data 並列における index 割り当ての実装}
39 Scheduler で,Data 並列実行を行う Task を検出し,各 CPU で Task を実行する。
40 各 CPU が担当する index は SchedTask に格納してある。
41 実行時の Task は以下のように記述する。
42
43 \begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm]
44 static int // Task
45 run(SchedTask *s,void *rbuf, void *wbuf)
46 {
47 float *indata1,*indata2,*outdata;
48
49 indata1 = (float*)s->get_input(rbuf, 0);
50 indata2 = (float*)s->get_input(rbuf, 1);
51 outdata = (float*)s->get_output(wbuf, 0);
52
53 uisigned long i = s->x;
54 outdata[i]=indata1[i]*indata2[i];
55 return 0;
56 }
57 \end{Verbatim}
53 並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。 58 並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。
54 iterate を使用することで,Task を生成する部分をループで回すことなく,簡単な syntax で記述できる。 59 iterate を実装したことで,Task を生成する部分をループで回す必要はなく,OpenCL と同様に一つの記述で異なる index を持つ Task を CPU 上で実行することができるようになった。