view paper/cerium.tex @ 0:2408ae0327d5

add paper's base
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Sat, 05 Apr 2014 13:30:19 +0900
parents
children 7264fa1d8f69
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 では、 並列処理を Task 単位で記述する。関数やサブルーチンを Task として扱い、
Task には input データ、 output データ及び依存関係を設定する。
Cerium Task Manager によってそれらの Task は管理され、実行される。

図\ref{fig:createTask}はCeriumがTaskを作成/実行する場合のクラスの構成となる。
userがcreatetask()を行い、input dataや依存関係の設定を行うとTaskManagerでTaskが生成される。
Task 毎に依存関係を表す wait\_i と wait\_me というリストがあり、依存関係が解消されて実行可能になった
Task は ActiveTaskList に移される。さらに、Scheduler に転送しやすい TaskList に変換してから各 Scheduler に
転送される。
\subsection{taskの生成}
以下にTaskを生成する例題を示す。
input dataを二つ用意し、input同士を乗算し、outputに格納するmultiplyという例題となる。
\begin{verbatim}
void
multiply_init
(HTaskPtr twice, int *i_data, int *o_data) {
    multiply = 
        manager->create_task(MULTIPLY_TASK);
    // MULTIPLY_TASK is task id(enum)
    multiply->set_inData(0, i_data1,
                      sizeof(int)*length);
    multiply->set_inData(1, i_data2,
                      sizeof(int)*length);
    multiply->set_outData(0, o_data,
                      sizeof(int)*length);
    multiply->set_param(0, (memaddr)length);
    multiply->set_cpu(SPE_ANY);
    multiply->spawn();
}
\end{verbatim}

\begin{tiny}
  \begin{table}[ht]
    \begin{center}
      \caption{Task生成におけるAPI}
      \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をActiveTaskListに登録  \\
        \hline
      \end{tabular}
    \end{center}
  \end{table}
\end{tiny}

Taskの記述は以下のようになる。
\begin{verbatim}
static int
run(SchedTask *s,void *rbuf, void *wbuf)
{
    float i_data1=(float*)s->get_input(rbuf,0);
    float i_data2=(float*)s->get_input(rbuf,1);
    float o_data=(float*)s->get_output(wbuf,0);
    long length=(long)s->get_param(0); 
    for (int i=0;i<length;i++) {
        outdata[i]=indata1[i]*indata2[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}