view paper/cerium.tex @ 8:d00b5efd3f90

totyu-
author tkaito
date Fri, 21 Jan 2011 01:44:54 +0900
parents e2a1c9895c12
children 19d1ef61a0d5
line wrap: on
line source

\chapter{Cerium} \label{chapter:cerium}

\section{Cell 用の Fine-Grain Task Manager}

Cerium \cite{gongo} は Cell 用の Fine-Gerain Task Manager として同研究室の宮國が実装した。
本章ではその実装について説明し、改良された点を紹介する。

\section{Cerium の概要}

Cerium は、我々が提案したゲーム開発のフレームワークで、TaskManager (\ref{sec:cerium_taskmanager}), 
SceneGraph (\ref{sec:cerium_scenegraph}) と Rendering Engine (\ref{sec:cerium_renderingengine}) の
3つの要素から構成されており、PS3, Mac OS X, Linux 上でゲームフレームワークとして動作する。ゲーム中の
オブジェクトの振る舞いやルールは SceneGraph で管理し、それらの動きや Rendering の処理を動的に SPE に
割り振るカーネルとして、TaskManager が用いられる。PS3 の Graphics Engine の仕様は公開されておらず、
Cerium は独自の Rendering Engine を有している。

\subsection{Task Manager} \label{sec:cerium_taskmanager}

Task Manager は、 Task と呼ばれる、分割された各プログラムを管理する。 Task の単位は
サブルーチンまたは関数として、 Task 同士の依存関係を考慮しながら実行していく。

先行研究において実装されていた TaskManager の API を \tabref{old_taskmanager_api} に示す。

\begin{table}[htb]
  \caption{旧Task Manager API} \label{tab:old_taskmanager_api}
  \hbox to\hsize{\hfil
  \begin{tabular}{c|l} \hline \hline
    create\_task  & Task を生成する \\ \hline
    run           & 実行 Task Queue の実行 \\ \hline
    allocate      & 環境のアライメントを考慮した allocator \\ \hline
    \hline
    add\_inData   & Task への入力データのアドレスを追加 \\ \hline
    add\_outData  & Task からのデータ出力先アドレスを追加 \\ \hline
    add\_param    & Task のパラメータ (32 bits) \\ \hline
    wait\_for     & Task の依存関係の考慮 \\\hline
    set\_cpu      & Task を実行する CPU の設定 \\ \hline
    set\_post     & Task が終了したら PPE 側で実行される関数の登録 \\ \hline
    spawn         & Task を実行 Task Queue に登録する \\ \hline
  \end{tabular}\hfil}
\end{table}

以下に新しく追加した API 、仕様の変更があった API を \tabref{new_taskmanager_api} に示す。

\begin{table}[htb]
  \caption{Task Manager API} \label{tab:new_taskmanager_api}
  \hbox to\hsize{\hfil
  \begin{tabular}{c|l} \hline \hline
    create\_task\_array  & Task Array を生成する \\ \hline
    \hline
    set\_inData   & add\_inData から変更 \\ \hline
    set\_outData  & add\_outData から変更 \\ \hline
    set\_param    & add\_param から変更 \\ \hline
    next\_task\_array    & Task Array 内の Task の実行順を設定する\\ \hline
    spawn\_task\_array  & Task Array を実行 Task Queue に登録する \\ \hline
  \end{tabular}\hfil}
\end{table}

以下に Task Array を用いた記述例を示す。このプログラムは Task Array に複数の同一 Task を
登録して、まとめて実行するというプログラムである。各 API の詳細は後述する。

\begin{verbatim}
void
hello_init(TaskManager *manager)
{
    /**
     * Create Task
     *   create_task(Task ID);
     */

    /*うしろ3つ param/inData/outData の数を指定する*/
    HTask *twice_main = manager->create_task_array(Hello,task_num,data_count,
                                                   data_count,data_count);
    Task *t = 0;

    for(int i = 0;i<task_num;i++) {
        t = twice_main->next_task_array(Hello, t);
    }
    twice_main->spawn_task_array(t->next());
    twice_main->set_cpu(SPE_ANY);
    twice_main->spawn();
}

static int
run(SchedTask *s,void *rbuf, void *wbuf)
{
    s->printf("Hello World\n");
    return 0;
}

// 実行結果
% ./hello -task 6
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World

\end{verbatim}

create_task_array は、同一の Task を複数持つことのできる Task である。これまでの Task 
は、Task の処理が終わる度に PPE へ終了を通知して通信を行っていた。しかし、頻繁に SPE と 
PPE の間で通信が行われることにより、全体の処理速度の低下を招いてる可能性があったので、この
ような API を作成した。create_task_array は持っている Task を登録した順に実行してゆき、PPE 
との通信は Task Array 内の Task 全てが終了したときにまとめて行うようになっている。




\subsection{SceneGraph} \label{sec:cerium_scenegraph}
\subsection{Rendering Engine} \label{sec:cerium_renderingengine}