# HG changeset patch # User Shohei KOKUBO # Date 1383739782 -32400 # Node ID 8c37fee421421b92a52396cc25aa993a9bc1b2f1 # Parent 423b4d15e248a47020bc77c53b23b545086f6dc1 fix diff -r 423b4d15e248 -r 8c37fee42142 paper/data_parallel.tex --- 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 上で実行することができるようになった。