view paper/chapter2.tex @ 27:9def91a908d6

add
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 11 Feb 2014 18:11:36 +0900
parents 9b071b32e3de
children d5b9addca752
line wrap: on
line source

\chapter{Cerium}
\label{chap:concept}

\section{Cerium Task Manager}
Cerium Task Manager では、並列処理を Task 単位で記述する。
関数やサブルーチンをそれぞれ Task として扱い、 Task には Input Data 、 Output Data 及び依存関係を設定することができる。
設定された Task は Cerium Task Manager によって管理され、実行される。
(図\ref{fig:createTask}の説明)図\ref{fig:createTask}

\begin{figure}[htbp]
\begin{center}
\includegraphics[width=0.7\textwidth]{fig/createTask1.pdf}
\end{center}
\caption{Cerium Task Manager}
\label{fig:createTask}
\end{figure}
\subsection{Task の生成}
input data を 2つ準備してそれら同士を乗算し、output data に格納する multiply という例題がある。
その例題の Task 生成部分を以下に示す。

\begin{verbatim}
multi_init(TaskManager *manager)
{
    HTask* multiply = manager->create_task(MULTIPLY_TASK);
    multiply->set_cpu(SPE_ANY);
    multiply->set_inData(0, i_data1, sizeof(float)*length);
    multiply->set_inData(1, i_data2, sizeof(float)*length);
    multiply->set_outData(0, 0_data1, sizeof(float)*length);
    multiply->set_param(0,(long)length);
    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 を TaskList に set \\
        \hline
      \end{tabular}
    \end{center}
  \end{table}
\end{tiny}

Task の記述は以下のようになる。
\begin{verbatim}
static int
run(SchedTask *s,void *rbuf, void *wbuf)
{
    float indata1=(float*)s->get_input(rbuf,0);
    float indata2=(float*)s->get_input(rbuf,1);
    float outdata=(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}