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 で記述できる。