Mercurial > hg > Papers > 2011 > kaito-master
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}