view cerium.tex @ 3:0fa000320b6a

add images
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Fri, 05 Feb 2016 04:17:47 +0900
parents
children 12d1c2f53258
line wrap: on
line source

\chapter{並列プログラミングフレームワーク Cerium}
Cerium は PlayStation 3(PS3) に搭載された Cell Broadband Engine(Cell) 向けの Fine-Grain TaskManager として当研究室で設計・開発されたフレームワークである。
本章では Cerium の実装について説明する。

\section{Cerium の概要}
Cerium は、TaskManager, SceneGraph, Rendering Engine の3つの要素から構成される。
Cell 用のゲームフレームワークとして開発されたが、現在では Multi-Core CPU, GPU も計算資源として利用可能な汎用計算フレームワークとなっている。

\section{TaskManager}
TaskManager は、Task と呼ばれる分割されたプログラムを管理する。
サブルーチンまたは関数が Task の単位となる。
TaskManager が提供する API を表:\ref{table:TaskManager_api}に示す。

\begin{table}[htpb]
  \begin{center}
    \small
    \begin{tabular}[htpb]{|c|l|} \hline
      create\_task & Task の生成 \\ \hline
      allocate     & 環境のアライメントに考慮した allocator \\ \hline
      set\_inData  & Task への入力データのアドレスを追加 \\ \hline
      set\_outData & Task からのデータ出力先アドレスを追加 \\ \hline
      set\_param   & Task のパラメータ(32 bits) \\ \hline
      wait\_for    & Task の依存関係を設定 \\ \hline
      set\_cpu     & Task を実行する Device の設定 \\ \hline
      spawn        & Task を Queue に登録 \\ \hline
      iterate      & データ並列で実行する Task として Queue に登録 \\ \hline
    \end{tabular}
    \caption{TaskManager API}
    \label{table:TaskManager_api}
  \end{center}
\end{table}

TaskManager は ActiveTaskList と WaitTaskList の2種類の Queue を持つ。
依存関係を解決する必要がある Task は WaitTaskList に入れられる。
TaskManger によって依存関係が解決されると ActiveTaskList に移され、実行可能な状態となる。
実行可能な状態となった Task は set\_cpu で指定された Device に対応した Scheduler に転送し実行される。
図:\ref{fig:createTask}は Cerium が Task を生成/実行する場合のクラスの構成である。
\begin{figure}[!ht]
  \begin{center}
    \includegraphics[scale=0.6]{./images/createTask.pdf}
  \end{center}
  \caption{TaskManager}
  \label{fig:createTask}
\end{figure}

\section{Cerium における Task}
Task は TaskManager の API を利用して生成する。
生成された Task には以下の要素を設定することができる。

\begin{itemize}
\item input data \\
  set\_inData を用いて設定する Task が実行する処理に必要なデータの入力元となるアドレス。
  関数を呼び出す際の引数に相当する。
  汎用ポインタ(void* 型) なので Task 側で適切なキャストを行う必要がある。
\item output data \\
  set\_outData を用いて設定する Task が処理したデータの出力先となるアドレス。
  関数の戻り値に相当する。
\item parameter \\
  set\_param を用いて設定するデータの処理に必要な実数値(index 等)。
\item cpu type \\
  set\_cpu を用いて設定する Task が実行される Device の組み合わせ。
  Cell, Multi-Core CPU, GPU またはこれらの組み合わせを指定することができる。
\item dependency \\
  wait\_for を用いて設定する他の Task との依存関係。
  依存関係が解決された Task は実行可能な状態となる。
\end{itemize}

\section{Task のパイプライン実行}
\begin{figure}[htpd]
  \begin{minipage}[t]{0.5\hsize}
    \begin{center}
      \includegraphics[scale=0.4]{./images/cell_arch.pdf}
    \end{center}
    \caption{Cell Architecture}
    \label{fig:cellarch}
  \end{minipage}
  \begin{minipage}[t]{0.5\hsize}
    \begin{center}
      \includegraphics[scale=0.4]{./images/gpu_arch.pdf}
    \end{center}
    \caption{GPU Architecture}
    \label{fig:gpuarch}
  \end{minipage}
\end{figure}
Cell(図:\ref{fig:cellarch}) や GPU(図:\ref{fig:gpuarch}) のように異なるメモリ空間を持つ Device を計算資源として利用するにはデータの転送が必要になる。
このデータ転送がボトルネックとなり、並列度が低下してしまう。
転送処理をオーバーラップし、並列度を維持するために Cerium では Task のパイプライン実行をサポートしている。

TaskManager である程度の Task をまとめた TaskList を生成し、実行する Device に対応した Scheduler に転送する。
受け取った TaskList に沿ってパイプラインを組み Task を実行していく。
TaskList でまとめられている Task は依存関係が解決されているので自由にパイプラインを組むことが可能である。
実行完了は TaskList 毎ではなく、Task 毎に通知される。
図:\ref{fig:scheduler}は TaskList を受け取り、Task をパイプラインで処理していく様子である。
\begin{figure}[ht]
  \begin{center}
    \includegraphics[scale=0.6]{./images/scheduler.pdf}
  \end{center}
  \caption{Scheduler}
  \label{fig:scheduler}
\end{figure}