changeset 4:8c37fee42142

fix
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Wed, 06 Nov 2013 21:09:42 +0900
parents 423b4d15e248
children 208ca954df56
files paper/data_parallel.tex
diffstat 1 files changed, 29 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/paper/data_parallel.tex	Wed Nov 06 20:31:56 2013 +0900
+++ b/paper/data_parallel.tex	Wed Nov 06 21:09:42 2013 +0900
@@ -1,26 +1,11 @@
-\section{Cerium における Data 並列}\label{data_parallel}
-Cerium では,iterate に length を引数として渡し,length の値と渡した引数の個数を次元数として Task 数を Scheduler が計算する。
-それぞれの CPU が担当する index は SchedTask に格納してある。
-実行時の Task は以下のように記述する。
-
-\begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm]
-static int // Task
-run(SchedTask *s,void *rbuf, void *wbuf)
-{
-    float *indata1,*indata2,*outdata;
+\section{Data 並列}\label{data_parallel}
+多次元の Data 構造がある場合には高い並列度を保つには,それを分割して並列に実行する機能が必要である。
+これを OpenCL では Data 並列と呼んでいる。
+次元数に対応する index があり,OpenCL では一つの記述から異なる index を持つ処理が並列に実行される。
+Cerium で OpenCl の Data 並列を利用するために,OpenCL の API に合わせた iterate という API を用意した。
+iterate には length を引数として渡し,Scheduler で length の値と渡した引数の個数を次元数として Task 数を計算し,並列に実行する。
 
-    indata1 = (float*)s->get_input(rbuf, 0);
-    indata2 = (float*)s->get_input(rbuf, 1);
-    outdata = (float*)s->get_output(wbuf, 0);
-
-    uisigned long i = s->x;
-    outdata[i]=indata1[i]*indata2[i];
-    return 0;
-}
-\end{Verbatim}
-
-\subsection{Data 並列における index 割り当ての実装}
-4 CPU で,一次元で10個の Data に対して Data 並列実行を行った場合,
+例として,CPU 数 4,一次元で10個の Data に対して Data 並列実行を行った場合,
 各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。
 
 この例だと各 CPU に対するindexの割り当ては,
@@ -49,6 +34,26 @@
     \end{center}
   \end{table}
 \end{tiny}
-この実装により,Cerium で Data 並列実行が可能になった。
+
+\subsection{Data 並列における index 割り当ての実装}
+Scheduler で,Data 並列実行を行う Task を検出し,各 CPU で Task を実行する。
+各 CPU が担当する index は SchedTask に格納してある。
+実行時の Task は以下のように記述する。
+
+\begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm]
+static int // Task
+run(SchedTask *s,void *rbuf, void *wbuf)
+{
+    float *indata1,*indata2,*outdata;
+
+    indata1 = (float*)s->get_input(rbuf, 0);
+    indata2 = (float*)s->get_input(rbuf, 1);
+    outdata = (float*)s->get_output(wbuf, 0);
+
+    uisigned long i = s->x;
+    outdata[i]=indata1[i]*indata2[i];
+    return 0;
+}
+\end{Verbatim}
 並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。
-iterate を使用することで,Task を生成する部分をループで回すことなく,簡単な syntax で記述できる。
+iterate を実装したことで,Task を生成する部分をループで回す必要はなく,OpenCL と同様に一つの記述で異なる index を持つ Task を CPU 上で実行することができるようになった。