Mercurial > hg > Members > kokubo > 2013-mid-thesis
diff paper/data_parallel.tex @ 2:b7c8a956c10b
write benchmark and conclusion
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 06 Nov 2013 01:16:42 +0900 |
parents | f4b3de446113 |
children | 423b4d15e248 |
line wrap: on
line diff
--- a/paper/data_parallel.tex Tue Nov 05 23:59:45 2013 +0900 +++ b/paper/data_parallel.tex Wed Nov 06 01:16:42 2013 +0900 @@ -1,12 +1,10 @@ \section{Cerium における Data 並列}\label{data_parallel} -データ並列で実行する場合はspawn APIではなく、iterate APIでTaskを生成すればよい。 -Scheduler内で引数分のTaskを生成し、それぞれに自分が担当するindexをパラメタとして設定していく。 -iterateにはlengthを引数として渡し、lengthの値と渡したlengthの個数で次元数や -ワークアイテムのサイズをSchedulerが計算する。 -CPU実行時のkernelは以下のように記述する。 +Cerium では,iterate に length を引数として渡し,length の値と渡した引数の個数を次元数として Task 数を Scheduler が計算する。 +それぞれの CPU が担当する index は SchedTask に格納してある。 +実行時の Task は以下のように記述する。 \begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm] -static int // kernel +static int // Task run(SchedTask *s,void *rbuf, void *wbuf) { float *indata1,*indata2,*outdata; @@ -15,30 +13,26 @@ indata2 = (float*)s->get_input(rbuf, 1); outdata = (float*)s->get_output(wbuf, 0); - long i = (long)s->get_param(0); + uisigned long i = s->x; outdata[i]=indata1[i]*indata2[i]; return 0; } \end{Verbatim} -\subsection{データ並列におけるindex割り当ての実装} -Taskを生成するとき、dimensionとワークアイテムのサイズをもとに各Taskが担当するindexを計算し、set\_paramする。 -kernelはget\_paramでそのindexを取得してデータ並列で実行する。 -get\_param APIがOpenCLのget\_global\_id APIに相当する。 +\subsection{Data 並列における index 割り当ての実装} +4 CPU で,一次元で10個の Data に対して Data 並列実行を行った場合, +各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。 -例として、cpu数4、一次元で10個のdataにたいしてデータ並列実行を行った場合、 -各CPUが担当するindexは表:\ref{table:data_parallel_index}のようになる。 - -この例だと各CPUに対するindexの割り当ては、 -CPU0はindex0、4、8、 -CPU1はindex1、5、9、 -CPU2はindex2、6、 -CPU3はindex3、7となっている。 +この例だと各 CPU に対するindexの割り当ては, +CPU0 は index 0,4,8 +CPU1 は index 1,5,9, +CPU2 は index 2,6, +CPU3 は index 3,7 となっている。 \begin{tiny} \begin{table}[h] \begin{center} - \caption{data並列実行時のindexの割り当て} + \caption{Data 並列実行時の index の割り当て} \label{table:data_parallel_index} \small \begin{tabular}[t]{c||c|c|c|c} @@ -56,11 +50,6 @@ \end{table} \end{tiny} -この実装により、Ceriumでデータ並列の実行が可能になった。 -並列プログラミングだと、並列化するTaskが全部同一であるという事は少なくない。 -その際、Taskを生成する部分をループで回すことなく、簡単なsyntaxで記述できる。 - -データ並列で実行する場合は、inputとoutputを各Taskで共有するため、少ないコピーですむ。 -CPUならメモリ領域がTaskとmanagerで同じなので、dataのコピーで大きいオーバーヘッドにはならない。 -しかしCellとGPUはメモリ領域が異なるため、dataコピーのオーバーヘッドが大きく、 -データ並列による高速化が見込める。 +この実装により,Cerium で Data 並列実行が可能になった。 +並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。 +iterate を使用することで,Task を生成する部分をループで回すことなく,簡単な syntax で記述できる。