annotate paper/OS-116-6.tex @ 19:06b5f5f55d08

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 19 Dec 2010 23:14:14 +0900
parents dc5c27db9da4
children b385effa5e8e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
1 \documentclass[techrep]{ipsjpapers}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
2 \usepackage{graphicx}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
4 % 巻数,号数などの設定
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
5 \setcounter{年数}{2011}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
7 % ユーザが定義したマクロなど.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
8 \makeatletter
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
9 \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
10 \def\<{\(\langle\)\nobreak}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
11 \def\>{\nobreak\(\rangle\)}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
12 \def\|{\verb|}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
13 \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
14 \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
15 \def\LATEX{\iLATEX\Large}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
16 \def\LATEx{\iLATEX\normalsize}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
17 \def\LATex{\iLATEX\small}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
18 \def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
19 T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
20 \def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
21 \def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
22 \def\Quote{\list{}{}\item[]}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
23 \let\endQuote\endlist
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
24 \def\TT{\if@LaTeX@e\tt\fi}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
25 \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
26 $\backslash$#1\fi}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
27
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
28 %\checklines % 行送りを確認する時に使用
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
29 \begin{document}%{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
30 % 和文表題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
31 \title[学生用 PS3 GameFrameWork Cerium での Pipeline ストールの検出]%
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
32 {学生用 PS3 GameFrameWork Cerium での\\Pipeline ストールの検出}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
33 % 英文表題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
34 \etitle{Detecting pipeline stall on PS3 GameFrameWork Cerium}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
35 % 所属ラベル
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
36 \affilabel{UNI}{琉球大学 理工学研究科 情報工学専攻 並列信頼研究室\\
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
37 Concurrency Reliance Laboratory, Information Engineering Course,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
38 Faculty of Engineering Graduate School of Engineering and Science,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
39 University of the Ryukyus.}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
41 % 和文著者名
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
42 \author{小林 佑亮\affiref{UNI}\and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
43 河野 真治\affiref{UNI}\and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
44 多賀野 海人\affiref{UNI}\and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
45 金城 裕\affiref{UNI}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
46
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
47 % 英文著者名
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
48 \eauthor{Yusuke Kobayashi\affiref{UNI}\and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
49 Shinji Kono\affiref{UNI}\and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
50 Kaito Tagano\affiref{UNI}\and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
51 Yutaka Kinjo\affiref{UNI}}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
53 % 和文概要
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
54 \begin{abstract}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
55 我々は PlayStation3 上でのゲームプログラミングをサポートする Cerium Engine を開発した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
56 Cerium におけるゲーム開発ではオブジェクトの描画や動作を Task という単位で管理しており、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
57 この Task を SPE に送り、Pipeline で実行することによってプログラムの並列化を図っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
58 この Pipeline におけるストールによって実行速度の低下が発生することが分かっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
59 本研究ではこのストールを検出することを考える。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
60 \end{abstract}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
61 % 英文概要
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
62 \begin{eabstract}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
63 We developed Cerium Engine which support Game Programming on PlayStation3.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
64 Cerium managed drawing objects and movement in unit called Task.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
65 By sending SPE a Task and executing on pipeline,we attempt parallelize program.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
66 Stalling of this pipeline reduce execution speed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
67 Ins this paper, we detect this stall.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
68 \end{eabstract}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
69
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
70 % 表題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
71 \maketitle
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
72
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
73 \newpage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
74
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
75 % 本文
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
76 \section{はじめに}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
77 当研究室ではこれまで家庭用ゲーム機上でのゲームプログラミングの開発を行ってきた。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
78 過去には PlayStation や PlayStation2、GameBoyAdvance を用いており、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
79 現在は PlayStation3(以下 PS3) で 動作するゲーム開発を行っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
80 PS3 では Fedora や Yellow Dog Linux といった Linux O を動作させることができるので
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
81 (現在の公式のサポートは終了している)C や C++ といったプログラム言語を用いて
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
82 Linux 上でプログラミングすることが可能となっている。しかし、PS3 の Architecture である
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
83 CellBroadbandEngine は複数の SPE を使用する並列プログラミングが求められている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
84 そこで我々は Cell のような ManyCoreArchitecture を用いた、並列プログラムの開発を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
85 サポートするフレームワークとして FineGrainTaskManager を開発した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
86 この TaskManager を用いたゲーム開発フレームワークが Cerium である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
87
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
88 Cerium を用いたゲーム開発ではプログラムの動作を Task という単位で管理し、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
89 この Task と必要なデータを複数の SPE に転送して処理させる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
90 転送された各 TASK は並列に処理され、Pipeline で実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
91 本研究では Cerium に対して様々なテストを行い、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
92 Cerium の チューニングやゲームプログラミングを補助するテスト手法を提案する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
93 % }{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
94
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
95 \section{Cell Broadband Engine}\label{sec:Cell}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
96 CellBroadbandEngine は SCEI と IBM、東芝によって開発された CPU である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
97 2 thread の PPE(PowerPC Processor Element)と
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
98 8個の SPE(Synergistic Processor Element)からなる非対称なマルチコアプロセッサであり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
99 高速リングバスであるEIB(Element Interface Bus)で構成されている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
100 PS3 Linux では6個の SPE を使うことが出来る。(図\ref{fig:cell})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
101
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
102 \subsection{PPE(PowerPC Processor Element)}\label{ssec:PPE}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
103 PPE は Cell Broadband Engine のメインプロセッサで、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
104 複数の SPE をコアプロセッサとして使用することができる汎用プロセッサである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
105 メインメモリや外部デバイスへの入出力、SPE を制御する役割を担っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
106 PPU(PowerPC Processor Unit)は、PPEの演算処理を行うユニットで、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
107 PowerPC アーキテクチャをベースとした命令セットを持つ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
108 PPSS(PowerPC Processor Storage Subsystem)は PPU からメインメモリへのデータアクセスを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
109 制御するユニットである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
111 \subsection{SPE(Synergistic Processor Element)}\label{ssec:SPE}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
112 SPE には 256KB の Local Store(LS)と呼ばれる直接参照できるメモリ領域があり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
113 バスに負担をかける事なく並列に計算を進めることが出来る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
114 SPE からメインメモリへは、直接アクセスすることは出来ず、SPE を構成する一つである
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
115 MFC (Memory Flow Controller)へ、チャネルを介してDMA(Direct Memory Access)命令を送ることで行われる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
116
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
117 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
118 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
119 \includegraphics[scale=0.7]{figure/cell.eps}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
120 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
121 \caption{Cell Broadband Engine}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
122 \label{fig:cell}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
123 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
124
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
125 \section{Cerium Engine}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
126 Cerium は 独自の Rendering Engine と Scene Graph、Task Manager の3つによって構成される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
127 ゲーム中のオブジェクトの振る舞いやルール、Polygon Data は SceneGraph によって管理され、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
128 それらの動きや Rendering の処理を動的に SPE に割り振るカーネルとして TaskManager が用いられる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
129 Cerium は C++ で実装されており、画像の読み込みや入力デバイスはSDL\footnote[1]{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
130 Simple DirectMedia Layer。グラフィックやサウンドなどの API を提供するフリーのライブラリ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
131 } を用いて行っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
132
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
133 \subsection{Scene Graph}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
134 Cerium ではゲーム中の一つの場面(Scene)を構成するオブジェクトの頂点座標やテクスチャー、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
135 そしてその振る舞いの集合を SceneGraph としている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
136 SceneGraph のノードは親子関係を持つ tree で構成される。親子関係とは、親オブジェクトの回転や
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
137 並列移動等の行列計算による頂点座標の変更が、子オブジェクトにも反映する関係のことである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
138 これは子に対してスタックに積まれた親の変換行列を掛けることで実現できる。(図\ref{sg})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
139
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
140 \subsection{Task Manager}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
141 Task Manager は Task と呼ばれる、分割された各プログラムを管理する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
142 Task の単位はサブルーチンまたは関数とする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
143 Task は主に PPE 内で生成され、処理する内容と必要なデータを設定する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
144 実行可能になった Task から各 SPE 割り当てられ、Task を受け取った SPE はその情報を元に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
145 処理を実行する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
146
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
147 \subsection{Rendering Engine}\label{ssec:rendering}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
148 現在、PlayStation3 の GPU にアクセスする API が公開されていないため、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
149 Cerium の Rendering Engine では、オブジェクトの描画を Cell で並列処理している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
150 描画処理を段階別に以下の3種類の Task に分けている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
151
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
152 \begin{itemize*}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
153 \item
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
154 SceneGraph が持つ Polygon の座標から、実際に画面に表示する座標の計算を行い、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
155 それを格納した PolyPack を生成する SceneGraph2PolygonPack Task
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
156 \item
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
157 PolygonPack から同じ Y 座標を持つ線分の集合である SpanPack を生成する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
158 PolygonPack2SpanPack Task
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
159 \item
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
160 SpanPack を Texture を読み込みながら Z Buffer を用いて描画する DrawSpan Task
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
161 \end{itemize*}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
162
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
163 この3つの Task に依存関係を持たせ、CPU に送ることにより画面の描画を実現している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
165 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
166 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
167 \includegraphics[width=5cm]{figure/scenegraph.eps}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
168 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
169 \caption{Scene Graph Tree}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
170 \label{fig:sg}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
171 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
173 \newpage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
174
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
175 \section{Cerium の Task}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
176
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
177 \subsection{Task ID}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
178 Task ID とは、各 Task に割り振られたグローバル ID である。通常の逐次型プログラムでは
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
179 Task を選択して実行する場合、その関数ポインタを指定して実行すればいい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
180 しかし Cell の場合、PPE と SPE 上ではアドレス空間が異なるため、SPE 上で実行される
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
181 Task を PPE から直接アドレス指定することはできない。そこで、Task 毎に ID を割り振り、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
182 その ID から、SPE 上にある Task が格納された配列を参照して実行する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
183
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
184 \subsection{Task を実行させる CPU の選択}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
185 Task Manager の {\bf set\_cpu()}により、Task をどの CPU で実行するか選択することが出来る。(図\ref{set_cpu})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
186
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
187 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
188 \setbox0\vbox{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
189 \hbox{//SPE 1 で実行する}
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
190 \hbox{task1\|->set\_cpu(SPE\_1);|}
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
191 \hbox{}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
192 \hbox{//SPE のどれかで実行する}
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
193 \hbox{task2\|->set\_cpu(SPE\_ANY);|}
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
194 \hbox{}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
195 \hbox{//PPE で実行する}
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
196 \hbox{task3\|->set\_cpu(PPE);|}
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
197 }\fbox{\box0}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
198 \caption{set\_cpu による実行 CPU の選択}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
199 \label{fig:set_cpu}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
200 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
201
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
202 これにより、PPE 内でも Task を実行することが可能になるため、環境依存によるプログラム変換は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
203 Task の部分だけとなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
204
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
205 \subsection{Task で入出力されるデータ}\label{ssec:inout}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
206 Task に渡すデータとして、{\bf add\_inData}と{\bf add\_param}がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
207 {\bf add\_inDara(addr, size)}は、Task に渡すデータのアドレスと、そのデータの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
208 サイズを引数として入力する。このデータは DMA 命令により転送される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
209 {\bf add\_param(param)}は、Task に32 bit のデータを渡す。param はアドレスとして
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
210 ではなく、値を Task オブジェクトが直接持っているので DMA 命令による転送は行わない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
211
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
212 \subsection{Task 間の共用領域}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
213 各 Task は独立して動作するため、使用するメモリ領域も他の Task と干渉することは無い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
214 しかし、処理によっては Task 間で同じデータを使用する場合がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
215 その場合、Task 毎に同じデータを持つよりも、LS 上に一つロードしてそのデータを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
216 各 Task が参照することが望ましい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
217 共用領域を allocate するには、{\bf global\_alloc(int id, int size)}を使う。id は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
218 allocate した領域に割り振る番号で、size が allocate するバイト数を表す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
219 allocate した領域のアドレスは{\bf glbal\_get(int id)}で、global\_alloc() 時に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
220 指定した id を渡すことで取得できる。 global\_alloc() した領域は、TaskManager 側で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
221 解放することな無いのでユーザが{\bf global\_free(int id)}を実行する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
222 共用領域は各 SPE 上に置かれるので、違う SPE の領域を参照することはできない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
223
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
224 \subsection{Task の Dependency}\label{ssec:dependency}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
225 Task に依存関係(Dependency)を持たせるには{\bf wait\_for}を使用する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
226
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
227 \setbox0\vbox{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
228 \hbox{//task2 は task1 が終了してから開始する}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
229 \hbox{task2\|->|wait\_for(task1);}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
230 }\fbox{\box0}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
231 \label{fig:single}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
232
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
233 上記の場合には task1 は Active Queue へ、task2 は Wait Queue へ格納される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
234 Active Queue に格納された Task は各 SPE に送られ処理される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
235 終了した Task から PPE の Task Manager へタスク終了のコマンドを発行する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
236 コマンドを受け取った Task Manager は Wait Queue を調べ、依存関係を満たした Task から
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
237 Active Queue に移し、SPE へ送る。(図\ref{fig:dependency})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
238
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
239 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
240 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
241 \includegraphics[scale=0.45]{figure/dependency.eps}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
242 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
243 \caption{Task の Dependency}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
244 \label{fig:dependency}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
245 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
246
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
247 \subsection{Task 終了時に実行される関数}\label{ssec:set_post}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
248 {\bf set\_post}を使うことでTask が終了した際に PPE で実行される関数と、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
249 その引数を指定できる。(図\ref{fig:set_post})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
250
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
251 {\bf set\_post}により、ユーザ側でも Task が終了したということを検知できる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
252 また、大量の Task に依存関係を設定する場合、一度に {bf create\_task}で生成し、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
253 {\bf wait\_for}で繋げるというのは難しい。その場合、ある一定数の Task だけ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
254 生成しておき、{\bf set\_post}を使って終了したことを確認して、その中で新たに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
255 Task を生成していくという方法により依存関係を設定することができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
257 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
258 \setbox0\vbox{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
259 \hbox{int data = 3;}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
260 \hbox{task\|->|set\_post(func1, (void*)data);}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
261 \hbox{}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
262 \hbox{void}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
263 \hbox{func1(void *data)}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
264 \hbox{\|{|}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
265 \hbox{\ \ printf\|("func1: data = %d\n", (int)data)|;}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
266 \hbox{\|}|}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
267 \hbox{//実行結果}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
268 \hbox{func1: data = 3}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
269 }\fbox{\box0}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
270 \caption{set\_post による関数の設定}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
271 \label{fig:set_post}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
272 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
273
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
274 \section{Super Dandy}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
275 {\bf SuperDandy}は当研究室が PlayStation でのゲーム開発を行っていた時期に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
276 開発されたシューティングゲームである。{\bf SuperDandy}は開発する環境が変わる度に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
277 移植されており、過去には PlayStation2、MacOSX 用も作られた。今回、新たに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
278 MacOSX バージョンをベースとして Cerium で動作するバージョンを作成した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
279 SuperDandyが伝統的に移植されてきた背景には、ある程度のボリュームのあるゲームであること、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
280 動作結果を過去の環境と比較することで新たな環境のチューニングが行えることが挙げられる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
281
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
282 \subsection{Super Dandy の Cerium への移植}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
283 Cerium ではオブジェクトの管理は SceneGraph を用いて行っているが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
284 Super Dandy は独自にオブジェクトの管理を行なっている。また PutSprite という
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
285 描画用の関数が存在する。この関数は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
286 OpenGL\footnote[2]{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
287 2D, 3D オブジェクトの描画の為のプログラムインターフェース
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
288 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
289 を使用しており、XY座標、テクスチャの指定を行うことによってオブジェクトの描画を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
290 行うことができる。また、PutSprite の他にオブジェクトの拡大縮小が可能な PutSpriteEx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
291 が存在する。Super Dandy を Cerium へ移植する場合には、この PutSprite, PutSpriteEx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
292 と同名の関数を用意し、その中で SceneGraph tree への登録を行うことで Cerium 上への
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
293 移植に成功した。また、この方法で移植することによってSuper Dandy 内で設定された
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
294 細かなパラメータを再利用でき、旧バージョンとの比較によって Cerium の機能の洗い出しを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
295 することができる。具体的にはテクスチャの表示のズレ、光源処理のチューニングなどである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
296 また、元の PutSprite,PutSpriteEX を使うことにより旧バージョンを動かすことができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
297 これにより異なる環境での動作の確認が容易に行える。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
298
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
299 \subsection{Super Dandy on PlayStation3}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
300 現在、この Super Dandy を Task ベースで動かすための移植作業を行っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
301 Super Dandy を Task 化して PlayStation3 上で動かす場合、Cell Broadband Architecture
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
302 を意識する必要がある。Super Dandy は move(動作)やcollision(衝突判定)を関数ポインタ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
303 で持っているが、それを Task 化して並列で動かす場合、PPE と SPE のメモリ領域は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
304 異なるので関数ポインタのアドレスは使用できない。Cerium では Task を ID で管理しているので
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
305 それを使用して move や collision を行うのが望ましい。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
306 Super Dandy を始め、ゲームには相互に干渉するパラメータが多数存在する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
307 共通のパラメータを必要とする Task 群を global\_alloc を使用して同じ Task 内で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
308 処理させたり、Task 同士に依存関係を持たせる事が必要となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
309 しかし、Task に複雑な依存関係を持たせると、Pipeline 処理がストールしてしまう原因となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
310
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
311 \section{Rendering Pipeline }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
312
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
313 SceneGraph の状態変更
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
314 SceneGraph から Polygon
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
315 Polygon から Span
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
316 Span を Draw
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
317
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
318 これを図示して示す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
319
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
320 \section{Pipeline のストール}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
321 Task は SPE で並列処理させることで全体的な処理速度が増す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
322 しかし、PPE による処理が挟まれたり、Task の依存関係を解決するために時間がかかると
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
323 パフォーマンスが低下する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
324 例えばある Task の処理を複数の Task が待つような dependency が設定されていたとき、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
325 依存している Task の処理に時間がかかると、動作していない SPE が発生してしまう。(図\ref{fig:stall})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
326 これにより Task 処理の並列度が低下し、全体的なパフォーマンスの低下に繋がる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
327 Cerium で実行される各 Task は Pipeline 状に処理することによって全ての SPE を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
328 常に busy 状態することにより、並列度を維持することが望ましい。(図\ref{fig:pipeline})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
329 そこで Pipeline 上のストールを検出し、並列度の低い箇所を発見するテスト機構を実装した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
330
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
331 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
332 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
333 \includegraphics[scale=0.6]{figure/stall.eps}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
334 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
335 \caption{dependency によるストール}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
336 \label{fig:stall}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
337 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
338
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
339 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
340 \begin{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
341 \includegraphics[scale=0.5]{figure/pipeline.eps}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
342 \end{center}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
343 \caption{各 SPE による Task の Pipeline 実行}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
344 \label{fig:pipeline}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
345 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
346
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
347 \subsection{Pipeline ストールの検出}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
348 SPE の稼働率が低い場合、Task の依存関係の問題や
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
349 PPE 処理が挟まれている可能性がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
350 そこで SPE の稼働率が低下している時の Task Queue を調べる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
351 この Task Queue には PPE で実行される Task を格納するキューと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
352 SPE で実行される Task を格納するキューがあり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
353 それぞれ activeTaskQueue と waitTaskQueue を持つ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
354 ここで大きなパフォーマンスの低下を引き落としていると思われる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
355 PPE 側の TaskQueue を検証した。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
356 また、キューの長さと格納されている Task ID を表示し、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
357 どの Task がどれくらい積まれているかを調べた。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
358
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
359 \subsection{ball\_bound}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
360 ball\_bound は 3D のボールが画面内で跳ねる初歩的なプログラムである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
361 このボールの描画には Cerium の機能の一つである Rendering Engine が使われている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
362
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
363 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
364 \setbox0\vbox{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
365 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
366 \hbox{task\_name = StartTask ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
367 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
368 \hbox{task\_name = CreatePolygonFromSceneGraph ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
369 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 6 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
370 \hbox{task\_name = CreateSpan ,task\_name = CreateSpan ,task\_name = CreateSpan ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
371 \hbox{task\_name = CreateSpan ,task\_name = CreateSpan ,task\_name = CreateSpan ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
372 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
373 \hbox{task\_name = StartTask ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
374 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
375 \hbox{task\_name = CreatePolygonFromSceneGraph ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
376 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 6}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
377 \hbox{...}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
378 \hbox{4.073489 FPS}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
379 }\fbox{\box0}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
380 \caption{実行結果1}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
381 \label{fig:result}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
382 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
383
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
384 図\ref{fig:result}を見ると3種類の Task が表示されているのが分かる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
385 {\bf StartTask }は全ての Task の一番初めに PPE で実行される Task である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
386 {\bf CreatePolygonFromSceneGraph}と{\bf CreateSpan}は\ref{ssec:rendering}節で述べたように
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
387 Rendering Engine の Task であるが、PPE 側の TaskQueue に格納されてしまっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
388 これが実行速度の低下を招いていると考えられる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
389
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
390 上記の実行結果を検証したところ、SPE に送られる予定の Task が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
391 PPE で実行される Task を待っている時、PPE 側の TaskQueue に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
392 格納されてしまうバグがあることがわかった。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
393 このバグを修正した結果が(図\ref{fig:result2})である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
394
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
395 \begin{figure}[tb]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
396 \setbox0\vbox{
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
397 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
398 \hbox{task\_name = StartTask ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
399 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
400 \hbox{task\_name = CreatePolygonFromSceneGraph ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
401 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
402 \hbox{task\_name = StartTask ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
403 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
404 \hbox{task\_name = CreatePolygonFromSceneGraph ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
405 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
406 \hbox{task\_name = StartTask ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
407 \hbox{spu\_idle! spe\_running = 0 : activeTaskQueue\|->|length = 1 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
408 \hbox{task\_name = CreatePolygonFromSceneGraph ,}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
409 \hbox{...}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
410 \hbox{3.059250 FPS}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
411 }\fbox{\box0}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
412 \caption{実行結果2}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
413 \label{fig:result2}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
414 \end{figure}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
415
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
416 CreateSpan が正しく SPE に送られ、処理されている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
417 しかし、実行速度は低下してしまっている。これは SPE に送られた Task が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
418 必要なデータを DMA 転送により取得しているため、その待ち時間と送信時間が
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
419 結果的に PPE 上での実行処理より遅延を引き起こしていると考えられる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
420
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
421 <--- どこが並列に動いていないのかを図示する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
422
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
423
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
424 \section{まとめ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
425 TaskQueue に格納された Task と SPE の稼働率により、並列度の低い箇所を
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
426 知ることができた。しかし、処理速度は改善されていない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
427 同じ Task でも PPE 上での処理と SPE 上での処理にかかる時間が異なる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
428 そこで Task の 両環境での平均的な処理時間を取得することで、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
429 CPU に適切な Task 処理の振り分けをすることができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
430 また、今回の方法だけでは局所的な情報だけであり
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
431 Task がどのように展開されているのか、どの程度並列度が落ちているのかまではわからない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
432 登録された Task には set\_post や wait\_for で設定された依存関係が保存されており、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
433 この情報のログを取り、依存関係の樹形図を可視化することができれば
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
434 Cerim における並列プログラミングを強力にバックアップすることができる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
435
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
436 \begin{thebibliography}{3}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
437
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
438 \bibitem{article1}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
439 宮國 渡: Cell 用の Fine-Grain Task Manager の実装.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
440 琉球大学大学院 理工学研究科 情報工学専攻 平成20年度 学位論文 2008.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
441
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
442 \bibitem{article2}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
443 FIXSTARS:http://cell.fixstars.com/ps3linux/index.php/メインページ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
444
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
445 \bibitem{article3}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
446 Mark Deloura:Game Programming Gems
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
447 株式会社ボーンデジタル 2001
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
448
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
449 \end{thebibliography}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
450
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
451 \end{document}