view paper/c2.tex @ 108:199561d48b97

add poster
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Sat, 20 Feb 2016 18:32:23 +0900
parents 9e3988854e93
children
line wrap: on
line source

\chapter{Cerium}
Cerium は、本研究室で開発している並列プログラミングフレームワークで Cell 向けに開発されており、C/C++ で実装されている。
Cell は Sony Computer Entertainment 社が販売した PlayStation3 に搭載されているヘテロジニアスマルチコア・プロセッサである。
現在では Linux、 MacOS X、CUDA 上で動作する並列プログラミングフレームワークである。
Cerium は TaskManager、SceneGraph、Rendering Engine の3要素から構成されており、
本研究では汎用計算フレームワークである TaskManager を利用して文字列の並列計算を行なっている。
本章では Cerium TaskManager の構成と Cerium TaskManager を利用したプログラムの実装例について説明する。

\section{Cerium TaskManager}

Cerium Task Manager は、User が並列処理を Task 単位で記述し、関数やサブルーチンを Task として扱い、その Task に対して Input Data、Output Data を設定する。
Input Data、Output Data とは関数でいう引数に相当する。そして Task が複数存在する場合、それらに依存関係を設定することができる。
そして、それに基づいた設定の元で Task Manager にて管理し実行される。

図\ref{fig:TaskManager} は Cerium が Task を作成・実行する場合のクラスの構成となる。User が createtask を行い、input data や Task の依存関係の設定を行うと、TaskManager で Task が生成される。
Task Manager で依存関係が解消されて、実行可能になった Task は ActiveTaskList に移される。
ActiveTaskList に移された Task は依存関係が存在しないのでどのような順序で実行されてもよい。
Task は Scheduler に転送しやすい TaskList に変換してからデバイスに対応する Scheduler に Synchronized Queue である mail を通して転送される。

\newpage

\begin{figure}[htpb]
  \begin{center}
    \includegraphics[scale=0.7]{images/cerium/createTask.pdf}
  \end{center}
  \caption{Task Manager}
  \label{fig:TaskManager}
\end{figure}

Input Data で格納した 2 つの数を乗算し、Output Data に演算結果を格納する multiply という例題のソースコード\ref{src:createTask}を以下に示す。

また、Task の生成時に用いる API 一覧を表\ref{table:TaskCreateAPI}に示す。
\begin{lstlisting}[frame=lrbt,label=src:createTask,caption=Task の生成,numbers=left]
multi_init(TaskManager *manager)
{
    float *A, *B, *C;

    // create Task
    HTaskPtr multiply = manager->create_task(MULTIPLY_TASK);

    // set device
    multiply->set_cpu(SPE_ANY);

    // set inData
    multiply->set_inData(0, (memaddr)A, sizeof(float)*length);
    multiply->set_inData(1, (memaddr)B, sizeof(float)*length);

    // set outData
    multiply->set_outData(0, (memaddr)C, sizeof(float)*length);

    // set parameter
    multiply->set_param(0,(long)length);

    // spawn task
    multiply->spawn();
}
\end{lstlisting}

\begin{tiny}
  \begin{table}[ht]
    \begin{center}
      \label{table:TaskCreateAPI}
      \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}

次に、デバイス側で実行される Task のソースコードを\ref{src:task}に示す。
\begin{lstlisting}[frame=lrbt,label=src:task,caption=Task,numbers=left]
static int
run(SchedTask *s) {
    // get input
    float *i_data1 = (float*)s->get_input(0);
    float *i_data2 = (float*)s->get_input(1);

    // get output
    float *o_data  = (float*)s->get_output(0);

    // get parameter
    long length = (long)s->get_param(0);

    // calculate
    for (int i=0; i<length; i++) {
        o_data[i] = i_data1[i] * i_data2[i];
    }
    return 0;
}
\end{lstlisting}
また表\ref{table:taskAPI}は Task 側で利用する API である。
Task 生成時に設定した Input Data や parameter を取得することができる。

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

\newpage

Task 生成時に設定できる要素を以下に列挙する。

\begin{itemize}
\item Input Data
\item Output Data
\item Parameter
\item CpuType
\item Dependency
\end{itemize}

Input/Output Data、Parameter は関数の引数に相当する。
Cpu Type は Task を動作させるデバイスを設定することができ、Dependency は他の Task との依存関係を設定することができる。