changeset 7:6b06734f1b3a

5章あと少し
author gongo@gendarme.cr.ie.u-ryukyu.ac.jp
date Sat, 07 Feb 2009 11:10:54 +0900
parents f7f53d2387f3
children 0789faebeac1
files paper/cerium.tex paper/images/amdahl.bb paper/images/cell_arch.bb paper/images/cell_mailbox.bb paper/images/cell_ppe.bb paper/images/cell_simd.bb paper/images/cell_spe.bb paper/images/cell_spurs_pipeline.bb paper/images/cell_spurs_task.bb paper/images/cerium_rendering_draw_span.bb paper/images/cerium_rendering_draw_span.graffle paper/images/cerium_rendering_draw_span.pdf paper/images/cerium_rendering_half.bb paper/images/cerium_rendering_half.graffle paper/images/cerium_rendering_half.pdf paper/images/cerium_rendering_spack.bb paper/images/cerium_rendering_spack.graffle paper/images/cerium_rendering_spack.pdf paper/images/cerium_rendering_span.bb paper/images/cerium_rendering_span.graffle paper/images/cerium_rendering_span.pdf paper/images/cerium_rendering_span_tex.bb paper/images/cerium_rendering_span_tex.graffle paper/images/cerium_rendering_span_tex.pdf paper/images/cerium_rendering_tex_tapestry.bb paper/images/cerium_rendering_tex_tapestry.graffle paper/images/cerium_rendering_tex_tapestry.pdf paper/images/cerium_rendering_tile.bb paper/images/cerium_rendering_tile.graffle paper/images/cerium_rendering_tile.pdf paper/images/cerium_sg_create.bb paper/images/cerium_sg_create.graffle paper/images/cerium_sg_create.pdf paper/images/cerium_sg_createlist.bb paper/images/cerium_sg_createlist.graffle paper/images/cerium_sg_createlist.pdf paper/images/cerium_sg_example.bb paper/images/cerium_sg_example.pdf paper/images/cerium_sg_tree.bb paper/images/cerium_task.bb paper/images/manycore_data_split.bb paper/images/manycore_step.bb paper/images/tm_scheduler.bb paper/images/tm_sm_global.bb paper/images/tm_sm_rbuf.bb paper/images/tm_sm_state.bb paper/images/tm_sm_wbuf.bb paper/images/tm_sort.bb paper/images/tm_sort_calc.bb paper/images/tm_sync.bb paper/images/tm_task_post.bb paper/images/tm_task_struct.bb paper/manycore.tex paper/master_paper.bib paper/taskmanager.tex
diffstat 55 files changed, 914 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/paper/cerium.tex	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/cerium.tex	Sat Feb 07 11:10:54 2009 +0900
@@ -11,10 +11,13 @@
 
 \begin{itemize}
 \item SceneGraph が持つ Polygon の座標から、実際に画面に表示する座標の
-  計算を行い、PolygonPack (\ref{sec:cerium_rendering_pp}節) を生成する
+  計算を行い、PolygonPack (\ref{sec:cerium_rendering_data}節) を生成する
+  SceneGraph2PolygonPack タスク (\ref{sec:cerium_rendering_s2p} 節)
 \item PolygonPack から、同じ Y 座標を持つ線分の集合
-  SpanPack (\ref{sec:cerium_rendering_span}節) を生成する
+  SpanPack (\ref{sec:cerium_rendering_data}節) を生成する
+  PolygonPack2SpanPack タスク (\ref{sec:cerium_rendering_p2s} 節)
 \item SpanPack を、Texture を読み込みながら Z Buffer を用いて描画する
+  DrawSpan タスク (\ref{sec:cerium_rendering_draw_span} 節)
 \end{itemize}
 
 \begin{figure}[htb]
@@ -29,7 +32,9 @@
 さらに、この3つのタスクは表示画面毎にパイプライン的に実行される。
 そのため、Cerium では並列度を維持することが出来る。
 
-Cerium は C++ で実装されており、プログラム行数は 6919 行である。
+Cerium は C++ で実装されており、画像の読み込みや入力デバイスは
+SDL を用いて行っている。
+%プログラム行数は 6919 行である。
 
 \section{SceneGraph} \label{sec:cerium_scene_graph}
 
@@ -49,9 +54,26 @@
   \end{center}
 \end{figure}
 
-\subsection{Scene の生成}
+SceneGraph のノードは以下のようなデータと動作を持つ。
+
+\begin{itemize}
+\item データ
+  \begin{enumerate}
+  \item Vervatim: ポリゴンオブジェクトの頂点座標
+  \item Texture: ポリゴンオブジェクトのテクスチャ座標
+  \item TextureImage: テクスチャイメージ
+  \item TransMatrix: ポリゴンオブジェクトの変換行列
+  \item Corrdinates: オブジェクトの座標
+  \item Angle: オブジェクトの角度
+  \end{enumerate}
+\item 動作
+  \item Move: 自律的なオブジェクトの動き
+  \item Collision: 他のノードと衝突したときの動き
+\end{itemize}
+
+\subsection{Scene ポリゴンの生成}
 ゲーム中に登場するオブジェクトは、オープンソースの
-3DCG制作ソフトである Blender \cite{blender} を用いる。
+3Dモデリングツールである Blender \cite{blender} を用いる。
 Blender で記述したポリゴンオブジェクトを、座標やテクスチャイメージを
 埋め込んだ xml ファイルとして出力する。
 Blender にはPython インタプリタがあり、杉山 \cite{chiaki} が独自形式の
@@ -79,8 +101,8 @@
             -0.002805 0.996740
             ・・・・
         </texture>
-        <image name="ERTH.png.001">
-            (base64 でデコードされたテクスチャイメージ)
+        <image name="EARTH.png">
+            (base64 エンコードデコードされたテクスチャイメージ)
         </image>
     </surface>
     <surface name="ENEMY" size="48" prim="Triangle" parent="BACK">
@@ -99,10 +121,811 @@
 また、Cerium が将来的にネットワークを使用することを考えており、
 その際に有効なフォーマットであると考えたからである。
 
+\subsection{SceneGraph オブジェクトの生成} \label{sec:cerium_sg_create}
+
+Cerium は 生成された xml ファイルから、そのパラメータを持つ
+SceneGraph オブジェクトを生成する (Original Scene Graph)。
+ここで作られたオブジェクトはユーザには見せず、
+ユーザが該当する SceneGraph を生成したい場合は Orignal を参照し、
+そのコピー (Copy Scene Graph) を渡す (\figref{cerium_sg_create}) 。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_sg_create.pdf}
+    \caption{SceneGraph の生成}
+    \label{fig:cerium_sg_create}
+  \end{center}
+\end{figure}
+
+\figref{cerium_sg_create} の Original SceneGraph Database は
+Cerium が配列として持っており、
+xml ファイルを読み込んで生成された SceneGraph を、SceneGraph ID の位置に
+格納する。SceneGraph ID は SceneGraph に割り振られるグローバルIDである。
+Blender の時点では、SceneGraph の名前は付けられるが、ID(番号) をユーザが
+決定、管理するのは難しい。そこで、xml ファイルから自動的に ID を決定する
+スクリプトを作成した (\figref{cerium_sg_createlist}) 。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.6]{images/cerium_sg_createlist.pdf}
+    \caption{SceneGraph ID の決定}
+    \label{fig:cerium_sg_createlist}
+  \end{center}
+\end{figure}
+
+ゲームに使用する xml ファイルを指定して、SGList.h と SGList.cpp を生成する。
+SGList.h には各 SceneGraph の名前に対応する ID が割り振られている。
+SGList.cpp のsglist とは、Cerium が xml ファイルを読み込んで、
+SceneGraph の名前が分かったとき、
+その名前がどの ID を持つかを求めるための配列である。
+
 \subsection{SceneGraph の操作}
 
-Cerium では SceneGraph を管理するクラスとして SceneGraphRoot を実装している。
-SceneGraphRoot は、
+Cerium では、\ref{sec:cerium_sg_create} 節で述べたような、
+xml ファイルのロード、SceneGraph の生成など、SceneGraph を管理するクラスとして
+SceneGraphRoot クラスを実装している。
+SceneGraphRoot では、ユーザが生成した SceneGraph を持ち、
+カメラ、ジョイスティックなどの入力デバイスの管理を行う。
+
+以下は SceneGraphRoot の構造である。
+
+\begin{verbatim}
+typedef SceneGraphRoot *SceneGraphRootPtr;
+
+class SceneGraphRoot
+{
+    // xml から読み込んだ、オリジナルの SceneGraph
+    SceneGraphPtr *sg_src;
+
+    // move, collision 用の SceneGraph
+    SceneGraphPtr sg_exec_tree;
+
+    // 描画用の SceneGraph List
+    SceneGraphPtr sg_draw_tree;
+
+    // コントローラーオブジェクト (Keyboard, Joystick, ..)
+    Pad *controller;
+
+    // カメラオブジェクト
+    Camera *camera;
+};
+\end{verbatim}
+
+SceneGraphRoot と SceneGraph の API をそれぞれ
+\tabref{cerium_sg_rootapi}、\tabref{cerium_sg_api}に示す。
+
+\begin{table}[htb]
+  \begin{center}
+    \caption{SceneGraphRoot API} \label{tab:cerium_sg_rootapi}
+    \hbox to\hsize{\hfil
+      \begin{tabular}{l|l} \hline \hline
+        createFromXMLfile(char *xmlname) & xml ファイルから \\
+        & Original SceneGraph を生成する \\ \hline
+        createSceneGraph(int id) & ID に対応する SceneGraph を生成する \\ \hline
+        setSceneData(SceneGraoh* top) & セットした SceneGraph を辿って \\
+        & Cerium が処理を行う \\ \hline
+      \end{tabular}\hfil}
+  \end{center}
+\end{table}
+
+\begin{table}[htb]
+  \begin{center}
+    \caption{SceneGraphRoot API} \label{tab:cerium_sg_api}
+    \hbox to\hsize{\hfil
+      \begin{tabular}{l|l} \hline \hline
+        addChild(SceneGraph*) & 自身に子を追加する \\ \hline
+        addBrother(SceneGraph*) & 自身に兄弟を追加する \\ \hline
+        remove(void) & 自身を削除する \\ \hline
+        set\_move(move\_func move) & 自身の move を設定する\\ \hline
+        set\_collision(coll\_func collision) & 自身の collision を設定する\\ \hline
+        translate\{X, Y, Z\}(float) & 自身の、各軸に平行な移動 \\ \hline
+        rotate\{X, Y, Z\}(float) & 自身の、各軸に対する回転 \\ \hline
+      \end{tabular}\hfil}
+  \end{center}
+\end{table}
+
+
+%SceneGraphRoot は \verb+sg_exec_tree+ と \verb+sg_draw_tree+ の二つを持つ。
+%\verb+sg_exec_tree+ で各 SceneGraph の move と collison を行った後、
+%処理後のノードをコピーして保存しておく。その後 \verb+sg_exec_tree+ が
+%\verb+sg_draw_tree+ へ遷移し、保存してある SceneGraph を新たな
+%\verb+sg_exec_tree+ として使用する。SceneGraph のコピーを行うのは、
+%SceneGraph の処理を SPE で行わせることが目的だからである。
+%SceneGraph の全てを SPE 上に置けない場合、コピーをせず
+%木の操作をするのは困難である。
+
+
+\subsection{例題}
+
+以下のコードは、地球と月のオブジェクトがそれぞれ
+回転しながら移動するという SceneGraph を記述したものである。
+
+\begin{verbatim}
+void
+create_sg(void)
+{
+  SceneGraphRoot *sgroot = new SceneGraphRoot;
+  
+  // xml ファイルを読み込み、Original Scene Graph を生成
+  sgroot->createFromXMLfile("universe.xml");
+  
+  // ID を指定して SceneGraph を生成(Original からのコピー)
+  SceneGraph *earth = sgroot->createSceneGraph(EARTH); // 地球
+  SceneGraph *moon = sgroot->createSceneGraph(MOON); // 月
+ 
+  earth->set_move(earth_move);
+  moon->set_move(moon_move);
+ 
+  // 親子関係の設定
+  earth->addChild(moon);
+  
+  // SceneGraph をセット
+  sgroot->setSceneData(earth);
+}  
+
+/**
+ * @param node 自身 (この場合は moon)
+ */
+void
+moon_move(SceneGraph *node)
+{
+  // y軸 で 3度回転
+  node->rotateY(3.0f);
+}
+
+/**
+ * @param node 自身 (この場合は earth)
+ */
+void
+earth_move(SceneGraph *node)
+{
+  // y軸 で 1度回転
+  node->rotateY(1.0f);
+
+  // x,y 軸方向にそれぞれ平行移動
+  node->translateX(3.0f);
+  node->translateY(3.0f);
+}
+\end{verbatim}
+
+実行結果を \figref{cerium_sg_example} に示す。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.5]{images/cerium_sg_example.pdf}
+    \caption{SceneGraph 例題}
+    \label{fig:cerium_sg_example}
+  \end{center}
+\end{figure}
+
+この SceneGraph では、地球が自転と平行移動、月が自転を行うもので、
+地球の平行移動、回転に合わせて月が付いてきており、
+親子関係が正常に動作していることが確認できた。
+地球と月は Blender で、球体にそれぞれのテクスチャを貼付けて作成した。
+
 
 
 \section{Rendering Engine} \label{sec:cerium_rendering}
+
+Rendering Engine では、SceneGraph から、
+実際に表示するポリゴンの抽出 (\ref{sec:cerium_rendering_s2p}節)、
+ポリゴンから Span の生成 (\ref{sec:cerium_rendering_p2s}節)、
+Span に RGB をマッピングし描画する部分
+(\ref{sec:cerium_rendering_draw_span}節) と3つに分けることが出来る。
+
+ここでいう Span とは、ポリゴンに対するある特定の Y 座標に関するデータを
+抜き出したものである (\figref{cerium_rendering_span})。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_rendering_span.pdf}
+    \caption{Span}
+    \label{fig:cerium_rendering_span}
+  \end{center}
+\end{figure}
+
+\subsection{Rendering で使うデータの構造} \label{sec:cerium_rendering_data}
+
+レンダリング処理は SPE で行うことを前提とし、
+それに合わせたデータ構造を採用している。
+
+\subsubsection{PolygonPack}
+
+PolygonPack は、SceneGraph から抽出されたポリゴンの集合である。
+以下に構造を示す。
+
+\begin{verbatim}
+// ポリゴンを構成する辺の情報
+typedef struct VertexPack {
+     // 座標 (x, y, z)
+    float x;
+    float y;
+    float z;
+    // テクスチャの座標
+    float tex_x;
+    float tex_y;
+} VertexPack, *VertexPackPtr;
+
+// テクスチャ情報
+typedef struct TriTexInfo {
+    uint32 *addr; // テクスチャイメージのアドレス
+    int width;    // 幅
+    int height;   // 高さ
+    int scale_max; // 縮小率
+} TriangleTexInfo, *TriangleTexInfoPtr;
+
+typedef struct PolygonPack {
+    struct PORIGON_info {
+        int size;
+        int light_pos[3]; // 光源の位置
+        int light_rgb[3]; // 光源の色
+    }info;
+
+    TrianglePack tri[MAX_SIZE_TRIANGLE];
+    PolygonPack* next;
+}PolygonPack, *PolygonPackPtr;
+\end{verbatim}
+
+PolygonPack は光源やテクスチャ、頂点の情報から構成される。
+テクスチャの縮小率に関しては \ref{sec:cerium_rendering_texture_scale} 節で後述する。
+
+\subsubsection{SpanPack}
+
+SpanPack は、ポリゴンから抽出された Span の集合である。
+以下に構造を示す。
+
+\begin{verbatim}
+class Span {
+public:
+    // テクスチャ情報
+    uint32 *tex_addr;
+    int tex_width;
+    int tex_height;
+
+    int y; // y 座標
+    int x; // span の開始 x 座標
+    int length_x; // span の長さ
+
+    // span のz 座標(開始、終了)
+    float start_z, end_z;
+
+    // span に対応するテクスチャの座標
+    float tex_x1, tex_x2, tex_y1, tex_y2;
+}
+
+
+class SpanPack {
+public: /* fields */
+    struct SpanInfo {
+        int start;
+        int size;
+        int y_top;
+        int light_pos[3];
+        int light_rgb[3];
+    } info;
+
+    Span span[MAX_SIZE_SPAN];
+    SpanPack *next;
+};
+\end{verbatim}
+
+Span は、その座標と、対応するテクスチャの座標を持つ
+(\figref{cerium_rendering_span_tex})。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_rendering_span_tex.pdf}
+    \caption{Span構造}
+    \label{fig:cerium_rendering_span_tex}
+  \end{center}
+\end{figure}
+
+レンダリングには、この SpanPack を用いる。
+
+ここからは、レンダリングの役割を果たす3つのタスクを説明する。
+
+\subsection{SceneGraph2PolygonPack} \label{sec:cerium_rendering_s2p}
+
+SceneGraph の move や collision を行い、
+各オブジェクトの変換行列が生成されたら、SceneGraph が持つ
+ポリゴンの座標に変換行列をかけ、得られた座標を PolygonPack に格納していく。
+以下がそのコードである。
+
+\begin{verbatim}
+SceneGraph *sg = sg_draw_list;
+float xyz[4];
+
+// ポリゴンの 1辺
+xyz[0] = sg->coord[i*3];
+xyz[1] = sg->coord[i*3+1];
+xyz[2] = sg->coord[i*3+2]*-1;
+xyz[3] = 1;
+
+// matrix = SceneGraph の変換行列
+ApplyMatrix(xyz, sg->matrix);
+
+// 格納する PolygonPack と
+PolygonPackPtr pp = new PolygonPack;
+TrianglePack *triangle = &pp->tri[pp->info.size++];
+
+triangle->ver1.x = xyz[0];
+triangle->ver1.y = xyz[1];
+triangle->ver1.z = xyz[2];
+triangle->ver1.tex_x = sg->tex_pos[i*3];
+triangle->ver1.tex_y = sg->tex_pos[i*3+1];
+\end{verbatim}
+
+この処理を全ての SceneGraph に行い、PolygonPack を生成していく。
+
+\subsection{PolygonPack2SpanPack} \label{sec:cerium_rendering_p2s}
+
+生成された PolygonPack に格納されているポリゴンから、Span を抽出していく。
+Span は x 軸に平行な線分を表しているため、始めにポリゴンを水平に分割して
+二つの三角形にして、それぞれに対して Span を求める \cite{akira}
+(\figref{cerium_rendering_half})。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_rendering_half.pdf}
+    \caption{Span生成時のポリゴン分割}
+    \label{fig:cerium_rendering_half}
+  \end{center}
+\end{figure}
+
+得られた Span を SpanPack に格納する場合、
+その SpanPack が持つ全ての Span の y 座標が一定範囲内に入る様にする。
+
+レンダリングする場合、画面を複数の領域に分割しそれぞれを
+一つのタスク (\ref{sec:cerium_rendering_draw_span}節) で担当する。
+Cerium では レンダリング時に Z Buffer を用いているため、
+同じタスクに違う領域の Span があると正常に描画できない。
+そこで、一つの SpanPack には決まった y 座標を持った
+span だけを入れることにより、レンダリング時には独立して行うことができる。
+今回は、y の範囲を 8 とした (\figref{cerium_rendering_spack})。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_rendering_spack.pdf}
+    \caption{SpanPack の割り当て}
+    \label{fig:cerium_rendering_spack}
+  \end{center}
+\end{figure}
+
+
+\subsection{Rendering するための準備}
+
+SpanPack が出来れば、あとは Span を見ていき、対応する RGB 値を
+テクスチャイメージから取り出して
+フレームバッファに書き込むだけである。しかし、ここで問題がある。
+SPE のメモリ領域は 256KB しかないため、Span が参照している
+テクスチャイメージ全てを送ると動かなくなる可能性がある。
+
+そこで我々は、テクスチャイメージに対していくつかの操作を行った。
+ここからは、その詳細について説明する。
+
+
+\subsection{Texture の分割} \label{sec:cerium_rendering_texture_split}
+
+テクスチャは、SDL\_image \cite{sdl_image} の API である IMG\_Load を使用して
+読み込む。その後画像は1ピクセル32ビット(RGB$\alpha$)のデータに変換される。
+
+SPE のメモリ領域は 256KB しかないため、テクスチャ全て送ると
+動かなくなる可能性がある。
+そこで、テクスチャを分割し、そのブロック毎で送ることにした。
+そのブロックを Tile と呼び、分割単位は 8x8 とする
+(\figref{cerium_rendering_tile})。
+Tile は \figref{cerium_rendering_tile} のような順番で配列に変換する。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_rendering_tile.pdf}
+    \caption{Texture の分割 (Tile)}
+    \label{fig:cerium_rendering_tile}
+  \end{center}
+\end{figure}
+
+span が持つテクスチャのアドレスはこの配列を指しており、
+描画する span 中の 1 pixel の座標から、どの Tile かを計算する。
+その Tile をメインメモリから DMA で持って来て
+RGB 値を取り出す。コードは以下の様になる。
+
+\begin{verbatim}
+#define TEXTURE_SPLIT_PIXEL 8
+#define TEXTURE_BLOCK_SIZE 8*8
+
+/**
+ * テクスチャの座標から、
+ * テクスチャのどのブロックかを求める
+ *
+ * @param tx X coordinates of texture
+ * @param tx Y coordinates of texture
+ * @param twidth  Width of texture
+ * @return block ID
+ */
+int
+getTexBlock(int tx, int ty, int twidth)
+{
+     int blockX, blockY;
+
+     blockX = tx / TEXTURE_SPLIT_PIXEL;
+     blockY = ty / TEXTURE_SPLIT_PIXEL;
+
+     return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY;
+}
+
+/**
+ * block ID と、テクスチャの TOP address から
+ * (tx,ty) で使われるテクスチャの Tile addres を求める
+ *
+ * @param tx X coordinates of texture
+ * @param tx Y coordinates of texture
+ * @param tw Width of texture
+ * @param tex_addr_top (tx,ty) で使うテクスチャの先頭address
+ * @return block ID
+ */
+uint32*
+getTile(int tx, int ty, int tw, uint32 *tex_addr_top)
+{
+    int block = getTexBlock(tx, ty, tw);
+    return tex_addr_top + block*TEXTURE_BLOCK_SIZE;
+}
+
+/**
+ * texture の座標から、Tile が持つ RGB 値を返す
+ *
+ * @param tx   X coordinates of texture
+ * @param tx   Y coordinates of texture
+ * @param addr Tile address (return getTile())
+ */
+uint32
+get_rgb(int tx, int ty, uint32 *tile)
+{
+    uint32 pixel[TEXTURE_BLOCK_SIZE];
+
+    smanager->dma_load(pixel, tile,
+                       sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag);
+    smanager->dma_wait(tag);
+
+    return pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx];
+}
+
+\end{verbatim}
+
+\subsection{SPE 上での Tile の管理} \label{sec:cerium_rendering_texture_hash}
+
+\ref{sec:cerium_rendering_texture_split} 節で求めた Tile を毎回
+DMA で転送するのは効率が悪い。
+そこで、SPE 上にいくつか Tile を置ける領域を予め作っておき、
+DMA 転送してきた Tile を保存しておく。
+描画する span が、すでに SPE 上にある Tile を参照する場合、そのままそれを使い、
+それ以外の Tile を参照し且つ領域が満杯の場合、
+一番最初に保存した Tile を削除して、
+新しくきた Tile を保存するという FIFO で Tile を管理する。
+Tile の検索はハッシュを用いる。ハッシュ値は Tile のアドレスを使用している。
+
+コードは以下の様になる。
+
+\begin{verbatim}
+#define TEXTURE_BLOCK_SIZE 8*8
+
+// SPE 上での Tile の構造
+typedef struct {
+    uint32 pixel[TEXTURE_BLOCK_SIZE] // Tile の実データ;
+    uint32 *texture_addr // Tile のメインメモリのアドレス;
+} Tile, *TilePtr;
+
+// Tile リスト
+class TileList {
+public:
+    int curIndex;
+    Tile tile[MAX_TILE];
+
+    /**
+     * 次に扱う tile を取得する
+     *
+     * @return tile
+     *
+     * tile[] をリングバスとして
+     * FIFO を実現する
+     */
+    TilePtr nextTile(void) {
+        TilePtr t = &tile[curIndex];
+        curIndex = (curIndex + 1) % MAX_TILE;
+        return t;
+    }
+};
+
+TileListPtr tileList;
+
+/**
+ * 新しい Tile を登録する
+ * 一番古い Tile は順次削除していく
+ *
+ * @param addr Tile のアドレス(メインメモリ空間)
+ */
+void
+set_rgb(uint32 *addr)
+{
+    TilePtr tile;
+
+    // 新しい Tile の登録
+    tile = tileList->nextTile();
+    hash->remove(tile->texture_addr);
+    tile->texture_addr = addr;
+
+    // hash に登録    
+    hash->put(tile->texture_addr, tile);
+
+    // DMA 転送 (PPE->SPE)
+    smanager->dma_load(tile->pixel, (uint32)addr,
+                       sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag);
+}
+
+/**
+ * Tile のアドレスから、テクスチャイメージデータを返す
+ *
+ * @param tx   X coordinates of texture
+ * @param tx   Y coordinates of texture
+ * @param addr tile address
+ * @return Image data
+ *
+uint32
+get_rgb(int tx, int ty, uint32 *addr)
+{
+    TilePtr tile;
+
+    tile = hash->get(addr);
+    return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx];
+}
+\end{verbatim}
+
+\ref{sec:cerium_rendering_texture_split}節で説明した get\_rgb() も
+ハッシュを導入したことにより変更されている。
+
+現在、SPE 上で保存する Tile は 128 個としている。
+領域は \verb+global_alloc()+ (\ref{sec:tm_sm_global} 節)で確保する。
+
+\subsection{Texture の縮小} \label{sec:cerium_rendering_texture_scale}
+
+遠くにいるオブジェクトに対して、原寸のテクスチャを貼る必要はなく、
+経験的に荒いテクスチャを貼っても問題ないと考えられる。
+そこで、オリジナルのテクスチャに対して縮小したものを用意し、
+オブジェクトがどれだけ離れているかによって、縮小率を変えたテクスチャを
+使うことにする。
+
+まず、オリジナルのテクスチャの最大縮小率を求める。
+テクスチャは縦横ともに 1/2、1/4、1/8 と、2分の1ずつ縮小させる。
+また、後に Tile に分割しなければならないため、縦、横ともに
+8の倍数を保つようにする。
+テクスチャの width、height から、最大縮小率を求めるコードが以下になる。
+
+\begin{verbatim}
+// tex_w 原寸幅
+// tex_h 原寸高さ
+// TEXTURE_SPLIT_PIXEL 8
+while (tex_w % TEXTURE_SPLIT_PIXEL == 0 && 
+       tex_h % TEXTURE_SPLIT_PIXEL == 0) {
+  all_pixel_num += tex_w*tex_h;
+  tex_w /= 2;
+  tex_h /= 2;
+  scale *= 2;
+}
+
+scale /= 2;
+\end{verbatim}
+
+これで 最大縮小率 (scale = テクスチャを 1/(scale*2) する) が求められる。
+
+次に、scale を使ってテクスチャを縮小する。
+縮小したテクスチャ毎に Tile で分割し、全ての縮小率で求めた Tile を繋げて
+Tile Array とする (\figref{cerium_rendering_tex_tapestry})。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.8]{images/cerium_rendering_tex_tapestry.pdf}
+    \caption{Texture の縮小 (Tapestry の生成)}
+    \label{fig:cerium_rendering_tex_tapestry}
+  \end{center}
+\end{figure}
+
+
+ここでは、縮小された画像を Tapestry と呼ぶ。
+SceneGraph や PolygonPack の時点ではテクスチャイメージとして、
+\figref{cerium_rendering_tex_tapestry} における、TileArray の先頭
+(Tapestry 1) のアドレスを持つ。
+そして、PolygonPack2SpanPack (\ref{sec:cerium_rendering_p2s}節)の中で、
+span の長さと使用するテクスチャの長さの比率を調べ、それに適した
+Tapestry を Span のテクスチャイメージとする。
+以下が、Span で使用するテクスチャの scale を求め、その scale にあった
+Tapestry を決定するコードである。
+
+\begin{verbatim}
+/**
+ * span の width,height と texture の width,height を比べて
+ * span を描画する際に使う texture の比率を求める
+ *
+ * @param[in] width      Width of span
+ * @param[in] height     Height of span
+ * @param[in] tex_width  Width of 1/1 texture that span use
+ * @param[in] tex_height Height of 1/1 texture that span use
+ * @param[in] scale_max  この Span で使う texture の最大縮小率
+ *                   計算結果が scale_max 以上になるのを防ぐ
+ * @return 描画に使う texture の比率
+ *         width と height は 1/scale の画像を使う
+ *
+ */
+static int
+getScale(int width, int height,
+         int tex_width, int tex_height, int scale_max)
+{
+    int base, tex_base;
+    int scale = 1;
+
+    /**
+     * width と height で、長い方を基準に、
+     * texture の scale を決める
+     */
+    if (width > height) {
+        base = width;
+        tex_base = tex_width;
+    } else {
+        base = height;
+        tex_base = tex_height;
+    }
+
+    if (tex_base > base) {
+        int t_scale = tex_base/base;
+
+        while (t_scale >>= 1) {
+            scale <<= 1;
+        }
+    }
+
+    return (scale > scale_max) ? scale_max : scale;
+}
+
+/*
+ * scale の値から、各 Tapestry の先頭アドレスを返す
+ *
+ * @param[in] tw       Width of texture
+ * @param[in] th       Height of texture
+ * @param[in] scale    テクスチャの縮小率 (= 2^n)
+ * @param[in] addr_top TileArrayの先頭(Tapestry1)
+ * @return scale に対応する Tapestry のアドレス
+ */
+static uint32*
+getTapestry(int tw, int th, int scale, uint32 *addr_top)
+{
+    int index = 0;
+
+    for (int s = 1; s < scale; s <<= 1) {
+        index += tw*th;
+        tw /= 2;
+        th /= 2;
+    }
+
+    return addr_top + index;
+}
+\end{verbatim}
+
+\figref{cerium_rendering_tex_tapestry} を見てわかるように 
+縮小すれば Tile の数は減るので、Span に必要な Tile の数も抑えられる。
+そのことにより、SPE 上での Tile の入れ替えも少なくなり、
+Tile のヒット率も上昇する。
+
+\subsection{Rendering (DrawSpan)} \label{sec:cerium_rendering_draw_span}
+
+現在、PlayStation 3 の GPU にアクセスする API は公開されていないため、
+Cerium ではフレームバッファに描画する。
+フレームバッファのアドレスは mmap() で取得できるため、
+タスクの出力としてフレームバッファを指定するか、
+タスク内で DMA 転送を行えば (\ref{sec:tm_dma}節)、直接描画することができる。
+
+通常の Linux で動作する場合も同様にフレームバッファに描画する。
+MacOSX の場合は SDL 経由で描画する。
+
+レンダリングは DrawSpan というタスクで行う。
+受け取った SpanPack から Span を取り出す。
+Span の端から 1 pixel ずつ見ていき、その pixel の z 座標と Z Buffer を見比べ、
+描画するものとをわかれば、対応する RGB 値を書き込む。
+
+また、DrawSpan は分割された画面領域の一部を担当するので、
+span がその領域を超えている場合は描画しない。
+現在、一つの DrawSpan が描画する領域は 256x8 としている
+(\figref{cerium_rendering_draw_span})。
+
+\begin{figure}[htb]
+  \begin{center}
+    \includegraphics[scale=0.7]{images/cerium_rendering_draw_span.pdf}
+    \caption{DrawSpan の担当領域}
+    \label{fig:cerium_rendering_draw_span}
+  \end{center}
+\end{figure}
+
+{\small
+\begin{verbatim}
+/**
+ * Span から RGB 値を求め、FrameBuffer 用のバッファ (linebuf) に書き込む
+ *
+ * @param span   Span
+ * @param startx DrawSpan が担当する領域開始の x 座標
+ * @param endx   DrawSpan が担当する領域終了の x 座標
+ */
+void
+DrawSpan::drawLine(SpanPtr span, int startx, int endx)
+{
+    int x = span->x;
+    int rangex = endx - startx + 1;
+    int x_len = span->length_x;
+
+    int js = (x < startx) ? startx - x : 0;
+    int je = (x + x_len > endx) ? endx - x : x_len;
+
+    /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */
+    int tex_xpos, tex_ypos;
+
+    // span の始点に対応する座標 (tex1, tey1)
+    float tex1 = span->tex_x1;
+    float tey1 = span->tex_y1;
+
+    // span の終点に対応する座標 (tex2, tey2)
+    float tex2 = span->tex_x2;
+    float tey2 = span->tex_y2;
+
+    // span の始点、終点に対応する z 座標
+    float zpos1 = span->start_z;
+    float zpos2 = span->end_z;
+
+    // Tile 内での座標
+    int localx, localy = getLocalY(span->y-1);
+
+    for (int j = js; j <= je; j++) {
+        float tex_x, tex_y, tex_z;
+
+        localx = getLocalX(x-1+j);
+        tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1);
+
+        // z 座標が小さいほど、画面に近い                    
+        if (tex_z < zRow[localx + (rangex*localy)]) {
+            uint32 *tex_addr;
+            int tex_localx;
+            int tex_localy;
+
+            tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1);
+            tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1);
+            if (tex_x > 1) tex_x = 1;
+            if (tex_x < 0) tex_x = 0;
+            if (tex_y > 1) tex_y = 1;
+            if (tex_y < 0) tex_y = 0;
+            tex_xpos = (int)((span->tex_width-1) * tex_x);
+            tex_ypos = (int)((span->tex_height-1) * tex_y);
+
+            tex_addr = getTile(tex_xpos, tex_ypos,
+                               span->tex_width, span->tex_addr);
+            tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
+            tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
+            
+
+            // SPE 上に 使用する Tile がない
+            if (!isAvailableTile(tex_addr)) {
+                set_rgb(tex_addr);
+                smanager->dma_wait(tag);
+            }
+
+            int rgb = get_rgb(tex_x, tex_y, tex_addr);
+	
+            // Z Buffer の更新	    
+            zRow[x + (rangex*y)] = zpos;
+
+            // RGB 値の更新
+            linebuf[x + (rangex*y)] = rgb;
+        }
+    }
+}
+\end{verbatim}
+}
+
+タスク終了後、linebuf をフレームバッファに DMA 転送することで、描画が完了する。
+
+
+\section{Cerium を用いた学生によるゲーム開発}
--- a/paper/images/amdahl.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/amdahl.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./amdahl.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 360 252
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_arch.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_arch.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_arch.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 505 339
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_mailbox.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_mailbox.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_mailbox.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 514 342
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_ppe.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_ppe.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_ppe.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 370 327
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_simd.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_simd.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_simd.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 402 261
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_spe.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_spe.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_spe.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 380 340
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_spurs_pipeline.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_spurs_pipeline.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_spurs_pipeline.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 533 187
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cell_spurs_task.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cell_spurs_task.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cell_spurs_task.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 507 229
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_draw_span.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_draw_span.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 591 313
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_draw_span.graffle has changed
Binary file paper/images/cerium_rendering_draw_span.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_half.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_half.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 372 274
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_half.graffle has changed
Binary file paper/images/cerium_rendering_half.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_spack.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_spack.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 533 319
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_spack.graffle has changed
Binary file paper/images/cerium_rendering_spack.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_span.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_span.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 413 247
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_span.graffle has changed
Binary file paper/images/cerium_rendering_span.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_span_tex.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_span_tex.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 408 420
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_span_tex.graffle has changed
Binary file paper/images/cerium_rendering_span_tex.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_tex_tapestry.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_tex_tapestry.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 563 305
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_tex_tapestry.graffle has changed
Binary file paper/images/cerium_rendering_tex_tapestry.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_rendering_tile.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_rendering_tile.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 510 385
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_rendering_tile.graffle has changed
Binary file paper/images/cerium_rendering_tile.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_sg_create.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_sg_create.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 487 228
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_sg_create.graffle has changed
Binary file paper/images/cerium_sg_create.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_sg_createlist.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_sg_createlist.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 557 496
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_sg_createlist.graffle has changed
Binary file paper/images/cerium_sg_createlist.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/images/cerium_sg_example.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -0,0 +1,5 @@
+%%Title: ./cerium_sg_example.pdf
+%%Creator: ebb Version 0.5.2 (+ArtBox)
+%%BoundingBox: 0 0 625 466
+%%CreationDate: Sat Feb  7 11:08:56 2009
+
Binary file paper/images/cerium_sg_example.pdf has changed
--- a/paper/images/cerium_sg_tree.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cerium_sg_tree.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cerium_sg_tree.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 425 274
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/cerium_task.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/cerium_task.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./cerium_task.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 470 535
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/manycore_data_split.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/manycore_data_split.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./manycore_data_split.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 587 154
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/manycore_step.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/manycore_step.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./manycore_step.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 549 335
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_scheduler.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_scheduler.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_scheduler.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 517 492
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sm_global.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sm_global.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sm_global.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 523 364
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sm_rbuf.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sm_rbuf.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sm_rbuf.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 405 225
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sm_state.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sm_state.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sm_state.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 370 342
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sm_wbuf.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sm_wbuf.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sm_wbuf.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 505 487
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sort.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sort.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sort.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 553 371
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sort_calc.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sort_calc.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sort_calc.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 360 216
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_sync.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_sync.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_sync.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 577 554
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_task_post.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_task_post.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_task_post.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 335 388
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/images/tm_task_struct.bb	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/images/tm_task_struct.bb	Sat Feb 07 11:10:54 2009 +0900
@@ -1,5 +1,5 @@
 %%Title: ./tm_task_struct.pdf
 %%Creator: ebb Version 0.5.2 (+ArtBox)
 %%BoundingBox: 0 0 591 364
-%%CreationDate: Fri Feb  6 10:30:52 2009
+%%CreationDate: Sat Feb  7 11:08:56 2009
 
--- a/paper/manycore.tex	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/manycore.tex	Sat Feb 07 11:10:54 2009 +0900
@@ -1,4 +1,4 @@
-\chapter{Many Core Architecture 上でのプログラミング} \label{chapter:manycore}
+\chapter{Many Core プログラミング} \label{chapter:manycore}
 
 Many Core プログラミングは、一つのマシン内で複数のコアを扱う
 プログラミングである。
--- a/paper/master_paper.bib	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/master_paper.bib	Sat Feb 07 11:10:54 2009 +0900
@@ -120,3 +120,8 @@
 howpublished = "{http://www.libsdl.org/}"
 }
 
+@misc{sdl_image,
+author = "",
+title = "{SDL\_image}",
+howpublished = "{http://www.libsdl.org/projects/SDL\_image/}"
+}
\ No newline at end of file
--- a/paper/taskmanager.tex	Fri Feb 06 10:33:23 2009 +0900
+++ b/paper/taskmanager.tex	Sat Feb 07 11:10:54 2009 +0900
@@ -516,7 +516,7 @@
 タスク終了後、out に該当するメインメモリの領域が
 out と同じ値になっている。
 
-\subsection{タスク間の共用領域}
+\subsection{タスク間の共用領域} \label{sec:tm_sm_global}
 
 各タスクは独立して動作するため、使用するメモリ領域も
 他のタスクと干渉することは無い。
@@ -550,21 +550,21 @@
 同じ SPE 上で実行させることにより、メモリ使用量も軽減できる。
 
 
-\subsection{DMA 命令}
+\subsection{DMA 命令} \label{sec:tm_dma}
 
 タスクの入力データや結果の出力データの操作は、
 TaskManagerが パイプラインに沿ってDMA を行っている。
 しかし、タスク内でメインメモリ上の新たなデータが必要になる可能性がある。
 この時、タスク内で明示的に DMA 転送命令を出すことができる。
 
-\verb+dma_load(unsigned int ls, unsigned int ea, int size, int tag)+
+dma\_load(unsigned int ls, unsigned int ea, int size, int tag)
 はメインメモリ上のデータ ea から、SPE の LS 上の領域 ls に
 size バイトの DMA 転送を行う。
 Cell の DMA 転送ではタグを使用することになっており、
 指定したタグ毎に DMA 転送完了待ちを行うことができる。
 タグは Cell の仕様では 0 〜 31 を使用することが出来る。
 
-同じ様に、\verb+dma_store(unsigned int ls, unsigned int ea, int size, int tag)+
+同じ様に、\verb+dma_store(ls, ea, size, tag)+
 では SPE から PPE への DMA 送信を行う。
 
 DMA 送受信の完了を待つのが \verb+dma_wait(int tag)+ ある。