view paper/cerium.tex @ 2:b15b449619b1

write
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 15 Apr 2014 18:01:08 +0900
parents 7264fa1d8f69
children 05a0e70f5823
line wrap: on
line source

\section{Cerium TaskManager}\label{section:cerium}
% \begin{figure}[ht]
%   \begin{center}
%     \includegraphics[scale=0.45]{./images/createTask.pdf}
%   \end{center}
%   \caption{Task Manager}
%   \label{fig:createTask}
% \end{figure}

Cerium Task Manager は並列プログラミングフレームワークであり、内部では C や C++ で実装されている。
Cerium Task Manager は、User が並列処理を Task 単位で記述し、関数やサブルーチンを Task として扱い、その Task に対して Input Data、Output Data 及び依存関係を設定する。
そして、それに基づいた設定の元で Task Manager にて管理し実行される。
Cerium Task Manager は PlayStation 3/Cell、Mac OS X 及び Linux 上で利用することが可能である。

図\ref{fig:createTask} では、 User が Task を生成して、CPU や GPU の各デバイスに Task が割り振られる様子を表している。
User が設定を行った Task は Task Manager にて生成される。その生成した Task に HTask にて Input Data 、Output Data や依存関係などを設定して Task の集合体である TaskList に Set する。
そして TaskList を各デバイスに割り振って、各 Scheduler に管理をさせたあとにそれぞれの Task を起動する。

% \begin{figure}[htbp]
% \begin{center}
% \includegraphics[width=0.7\textwidth]{fig/ceriumtaskmanager.pdf}
% \end{center}

input Data で格納して 2 つの数を乗算し、output data に格納する multiply という例題がある。
その例題の Task 生成部分を以下に示す。
\\
\begin{verbatim}
multi_init(TaskManager *manager)
{
    float *A, *B, *C;
    HTaskPtr multiply = manager->create_task
                                (MULTIPLY_TASK);
    multiply->set_cpu(SPE_ANY);
    multiply->set_inData
            (0, (memaddr)A, sizeof(float)*length);
    multiply->set_inData
            (1, (memaddr)B, sizeof(float)*length);
    multiply->set_outData
            (0, (memaddr)C, sizeof(float)*length);
    multiply->set_param(0,(long)length);
    multiply->spawn();
}
\end{verbatim}

\begin{tiny}
  \begin{table}[ht]
    \begin{center}
      \label{table:create_taskAPI}
      \small
      \begin{tabular}[t]{c|l}
        \hline
        create\_task& Task を生成する \\
        \hline
        set\_inData & Task への入力データのアドレスを追加 \\
        \hline
        set\_outData & Task への出力データのアドレスを追加 \\
        \hline
        set\_param & Task へ値を一つ渡す。ここでは length \\
        \hline
        set\_cpu & Task を実行するデバイスの設定  \\
        \hline
        spawn & 生成した Task を TaskList に set \\
        \hline
      \end{tabular}
      \caption{Task 生成における API}
    \end{center}
  \end{table}
\end{tiny}

\newpage

Task の記述は以下のようになる。
\\

\begin{verbatim}
static int
run(SchedTask *s,void *rbuf, void *wbuf)
{
    float *A, *B, *C;
    A = (float*)s->get_input(rbuf,0);
    B = (float*)s->get_input(rbuf,1);
    C = (float*)s->get_output(wbuf,0);
    long  length=(long)s->get_param(0);
    for (int i=0;i<length;i++) {
        C[i]=A[i]*B[i];
    }
    return 0;
}
\end{verbatim}

\begin{tiny}
  \begin{table}[ht]
    \begin{center}
      \caption{Task 側で使用する API}
      \label{table:taskAPI}
      \small
      \begin{tabular}[t]{c|l}
        \hline
        get\_input & Scheduler から input data を取得 \\
        \hline
        get\_output & Scheduler から output data を取得 \\
        \hline
        get\_param & set\_param した値を取得 \\
        \hline
      \end{tabular}
    \end{center}
  \end{table}
\end{tiny}