view paper/data_parallel.tex @ 4:8c37fee42142

fix
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Wed, 06 Nov 2013 21:09:42 +0900
parents 423b4d15e248
children 744885be1943
line wrap: on
line source

\section{Data 並列}\label{data_parallel}
多次元の Data 構造がある場合には高い並列度を保つには,それを分割して並列に実行する機能が必要である。
これを OpenCL では Data 並列と呼んでいる。
次元数に対応する index があり,OpenCL では一つの記述から異なる index を持つ処理が並列に実行される。
Cerium で OpenCl の Data 並列を利用するために,OpenCL の API に合わせた iterate という API を用意した。
iterate には length を引数として渡し,Scheduler で length の値と渡した引数の個数を次元数として Task 数を計算し,並列に実行する。

例として,CPU 数 4,一次元で10個の Data に対して Data 並列実行を行った場合,
各 CPU が担当する index は表:\ref{table:data_parallel_index}のようになる。

この例だと各 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 の割り当て}
      \label{table:data_parallel_index}
      \small
      \begin{tabular}[t]{c||c|c|c|c}
        \hline
        stage&CPU0& CPU1&CPU2&CPU3 \\
        \hline
        1&0&1&2&3 \\
        \hline
        2&4&5&6&7 \\
        \hline
        3&8&9& & \\
        \hline
      \end{tabular}
    \end{center}
  \end{table}
\end{tiny}

\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 を生成する部分をループで回す必要はなく,OpenCL と同様に一つの記述で異なる index を持つ Task を CPU 上で実行することができるようになった。