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