Mercurial > hg > Members > kokubo > 2013-mid-thesis
annotate paper/data_parallel.tex @ 6:744885be1943 default tip
fix
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 06 Nov 2013 22:23:07 +0900 |
parents | 8c37fee42142 |
children |
rev | line source |
---|---|
4 | 1 \section{Data 並列}\label{data_parallel} |
2 多次元の Data 構造がある場合には高い並列度を保つには,それを分割して並列に実行する機能が必要である。 | |
3 これを OpenCL では Data 並列と呼んでいる。 | |
4 次元数に対応する index があり,OpenCL では一つの記述から異なる index を持つ処理が並列に実行される。 | |
5 Cerium で OpenCl の Data 並列を利用するために,OpenCL の API に合わせた iterate という API を用意した。 | |
6 iterate には length を引数として渡し,Scheduler で length の値と渡した引数の個数を次元数として Task 数を計算し,並列に実行する。 | |
0 | 7 |
4 | 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 | 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 | 16 |
17 \begin{tiny} | |
18 \begin{table}[h] | |
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 | 21 \label{table:data_parallel_index} |
22 \small | |
23 \begin{tabular}[t]{c||c|c|c|c} | |
24 \hline | |
25 stage&CPU0& CPU1&CPU2&CPU3 \\ | |
26 \hline | |
27 1&0&1&2&3 \\ | |
28 \hline | |
29 2&4&5&6&7 \\ | |
30 \hline | |
31 3&8&9& & \\ | |
32 \hline | |
33 \end{tabular} | |
34 \end{center} | |
35 \end{table} | |
36 \end{tiny} | |
4 | 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} | |
6 | 58 並列プログラミングでは,並列化する Task が全部同一であるという事は少なくない。 |
4 | 59 iterate を実装したことで,Task を生成する部分をループで回す必要はなく,OpenCL と同様に一つの記述で異なる index を持つ Task を CPU 上で実行することができるようになった。 |