view paper/data_parallel.tex @ 3:423b4d15e248

fix
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Wed, 06 Nov 2013 20:31:56 +0900
parents b7c8a956c10b
children 8c37fee42142
line wrap: on
line source

\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;

    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 が担当する 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}
この実装により,Cerium で Data 並列実行が可能になった。
並列プログラミングだと,並列化する Task が全部同一であるという事は少なくない。
iterate を使用することで,Task を生成する部分をループで回すことなく,簡単な syntax で記述できる。