Mercurial > hg > Members > kokubo > 2013-mid-thesis
annotate paper/data_parallel.tex @ 3:423b4d15e248
fix
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 06 Nov 2013 20:31:56 +0900 |
parents | b7c8a956c10b |
children | 8c37fee42142 |
rev | line source |
---|---|
1
f4b3de446113
write introduction and cerium
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1 \section{Cerium における Data 並列}\label{data_parallel} |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
2 Cerium では,iterate に length を引数として渡し,length の値と渡した引数の個数を次元数として Task 数を Scheduler が計算する。 |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
3 それぞれの CPU が担当する index は SchedTask に格納してある。 |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
4 実行時の Task は以下のように記述する。 |
0 | 5 |
6 \begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm] | |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
7 static int // Task |
0 | 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 | |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
16 uisigned long i = s->x; |
0 | 17 outdata[i]=indata1[i]*indata2[i]; |
18 return 0; | |
19 } | |
20 \end{Verbatim} | |
21 | |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
22 \subsection{Data 並列における index 割り当ての実装} |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
23 4 CPU で,一次元で10個の Data に対して Data 並列実行を行った場合, |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
24 各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。 |
0 | 25 |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
26 この例だと各 CPU に対するindexの割り当ては, |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
27 CPU0 は index 0,4,8 |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
28 CPU1 は index 1,5,9, |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
29 CPU2 は index 2,6, |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
30 CPU3 は index 3,7 となっている。 |
0 | 31 |
32 \begin{tiny} | |
33 \begin{table}[h] | |
34 \begin{center} | |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
35 \caption{Data 並列実行時の index の割り当て} |
0 | 36 \label{table:data_parallel_index} |
37 \small | |
38 \begin{tabular}[t]{c||c|c|c|c} | |
39 \hline | |
40 stage&CPU0& CPU1&CPU2&CPU3 \\ | |
41 \hline | |
42 1&0&1&2&3 \\ | |
43 \hline | |
44 2&4&5&6&7 \\ | |
45 \hline | |
46 3&8&9& & \\ | |
47 \hline | |
48 \end{tabular} | |
49 \end{center} | |
50 \end{table} | |
51 \end{tiny} | |
2
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
52 この実装により,Cerium で Data 並列実行が可能になった。 |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
53 並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。 |
b7c8a956c10b
write benchmark and conclusion
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1
diff
changeset
|
54 iterate を使用することで,Task を生成する部分をループで回すことなく,簡単な syntax で記述できる。 |