2
|
1 \documentclass[twocolumn,twoside,9.5pt]{jarticle}
|
|
2 \usepackage[dvipdfm]{graphicx}
|
|
3 \usepackage{booktabs}
|
|
4
|
|
5 \usepackage{fancyhdr}
|
|
6 \pagestyle{fancy}
|
|
7 \lhead{\includegraphics[height=1zw,clip,keepaspectratio]{pic/emblem-bitmap.eps}琉球大学主催 工学部情報工学科 卒業研究発表会}
|
|
8 \rhead{}
|
|
9 \cfoot{}
|
|
10
|
|
11 \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
|
|
12 \setlength{\headheight}{0mm}
|
|
13 \setlength{\headsep}{5mm}
|
|
14 \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
|
|
15 \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
|
|
16 \setlength{\textwidth}{181mm}
|
|
17 \setlength{\textheight}{261mm}
|
|
18 \setlength{\footskip}{0mm}
|
|
19 \pagestyle{empty}
|
|
20
|
|
21 \begin{document}
|
|
22 \title{Cell上のソフトウェアレンダリングの高機能化と高速化}
|
|
23 \author{065725F 金城裕 {}{} 指導教員 : 河野真治}
|
|
24 \date{}
|
|
25 \maketitle
|
|
26 \thispagestyle{fancy}
|
|
27
|
|
28 \section{Cell上のソフトウェアレンダリング}
|
|
29
|
3
|
30 我々は、8SPE+2PPEのヘテロCPU構成を持つCell / PS3 上での
|
2
|
31 ソフトウェアレンダリングエンジン
|
|
32 を開発中である。これは、Cerium Task Manager 上に実装され、琉球大学情報工学科の
|
|
33 3年生の実験で使用中である。PS3 のGraphics Engine の仕様は公開されていない
|
|
34 ために、ソフトウェアレンダリングを
|
|
35 実装する必要がある。
|
|
36
|
|
37 ソフトウェアレンダリングは、SceneGraph、Polygon、Span、Z buffer の各段階があり、
|
3
|
38 それぞれの段階で、並列処理を行なう必要がある。現在は、Span の生成を1 SPE上で行ない、Z buffer を複数のSPE上で処理している。さらに、他の段階でも並列処理を
|
|
39 行なう必要がある。PPEよりもSPEの方が高速なので、1SPE 上で実行するだけでも
|
2
|
40 意味がある。
|
|
41
|
|
42 \vspace{-5mm}
|
3
|
43 \section{Cell BROADBAND ENGINE}
|
2
|
44 Cellは、1基の制御系プロセッサコア (PPE:PowerPc Processor ELement) と8基の演算系プロセッサコア (SPE:Synergistic Processor Element) で構成される。各プロセッサコアは、EIB (Element Interconnect Bus) と呼ばれる高速なバスで接続されている。また、EIBはメインメモリや外部入出力デバイスとも接続されていて、各プロセッサコアはEIBを経由してデータアクセスをおこなう。
|
|
45
|
|
46 この2種類のCPUをプログラマ自身が用途に合わせて適切に使い分けるように考慮する必要がある。
|
|
47
|
|
48 \vspace{-6mm}
|
|
49 \section{Cerium}
|
|
50 当研究室ではCeriumと呼ばれるゲーム開発フレームワークがあり、以下の3つの要素から構成されている。\\
|
|
51
|
|
52 \vspace{-6mm}
|
|
53 \begin{itemize}
|
|
54 \item SceneGraph
|
|
55 \vspace{-3mm}
|
|
56 \item Rendering Engine
|
|
57 \vspace{-3mm}
|
|
58 \item Task Manager
|
|
59 \end{itemize}
|
|
60
|
|
61 Ceriumは独自にRenderingEngineを持つ。ゲーム中のオブジャクトの振る舞いやルールはSceneGraphで管理し、それらの動きやレンダリングの処理を動的にSPEに割り振るカーネルとして、TaskMnagerが用いられる。
|
3
|
62 現在Ceriumはlinux,macosx上で動作し、コンパイル方法によってアーキテクチャを切り替えられる。
|
2
|
63
|
3
|
64 \section{Task Manager}
|
|
65 TaskManagerは、タスクと呼ばれる、分割された各プログラムを管理する。タスクの単位はサブルーチンまたは関数とし、タスク同士の依存関係を考慮し、実行可能状態になったタスクを各SPEに割り振る。タスクは通常PPEスレッドで生成され、SPEスレッドに送られる。
|
|
66 SPEスレッドでは、受け取ったタスクをパイプラインに沿ってステージを遷移しながら複数のタスクを同時に実行していく。
|
2
|
67
|
3
|
68 \vspace{-6mm}
|
2
|
69 \section{Rendering Engine}
|
|
70
|
|
71 Rendering Engineは主に、CreatePolygonFromSceneGraph、CreateSpan、DrawSpanという3つのタスクから構成されている。
|
|
72 それぞれのタスクの動作とレンダリングの流れを示す。
|
3
|
73
|
|
74 {\small
|
|
75 \begin{enumerate}
|
|
76 \item CreatePolygonFromSceneGraph タスクによってSceneGraphをもとにモデリングデータから、実際に表示するポリゴンを生成する。
|
|
77 \item CreateSpan タスクで生成したポリゴンからSpanの生成する。
|
|
78 \item DrawSpan タスクでSpanをRGBにマッピングし描画する。
|
2
|
79 ここでいうSpanとは、ポリゴンに対するある特定のY座標に関するデータを抜き出したものである。
|
3
|
80 \end{enumerate}
|
|
81 }
|
2
|
82
|
|
83 \vspace{0mm}
|
|
84 \begin{figure}[htbp]
|
|
85 \begin{center}
|
|
86 \includegraphics[scale=0.4]{pic/rendering3.pdf}
|
|
87 \caption{レンダリングの流れ} \label{rendering}
|
|
88 \end{center}
|
|
89 \end{figure}
|
|
90
|
|
91
|
3
|
92 \vspace{-10mm}
|
2
|
93 \section{レンダリングエンジンの高速化と高機能化}
|
|
94 \subsection{光源の実装}
|
3
|
95 Rendering Engine に光源処理の実装をした。光源は SceneGraph のオブジェクトと
|
2
|
96 して実装され、SceneGraph 側から、操作できる。光源は点光源であり、光源数は 4 つに
|
|
97 設定している。
|
|
98
|
|
99 \vspace{0mm}
|
|
100 \begin{figure}[htbp]
|
|
101 \begin{center}
|
|
102 \includegraphics[scale=0.4]{pic/nonlightearth.pdf}
|
|
103 \includegraphics[scale=0.4]{pic/lightearth.pdf}
|
|
104 \caption{光源実装前後の表示結果} \label{nonlightearth}
|
|
105 \end{center}
|
|
106 \end{figure}
|
|
107
|
3
|
108 \vspace{-6mm}
|
2
|
109 \subsection{実装手法}
|
|
110 光源処理は DrawSpan タスク内で行う。描画対象となる Span は法線ベクトルの情報
|
|
111 を持っている。光源の座標情報は、あらかじめ、各 SPE のローカルストアに確保してい
|
|
112 る。描画対象のドット座標と光源の座標から光源ベクトルを求める。光源ベクトルと法線
|
3
|
113 ベクトルとの内積を計算し、rgb 値に乗算する。 それにより描画されるrgb値が、点光源の位置から
|
|
114 光のあたり具合を考慮にいれた値になる。
|
2
|
115
|
3
|
116 \vspace{-6mm}
|
|
117 \subsubsection{光源座標の Load,Update の為のタスク}
|
|
118 光源実装のために DataLoad タスクと DataUpdate タスクを実装した。
|
|
119 DataLoad タスクは指定されたサイズ分の領域をSPEに確保するタスクである。
|
|
120 光源座標のメモリ領域を各 SPE のローカルストアに確保するために使用している。
|
|
121 DataUpdate タスクは DataLoad タスクで確保された領域に、指定されたデータを書き込むタスクである。
|
|
122 確保された領域の光源座標情報を更新するために使用している。
|
|
123 SPE 側でのメモリ領域の確保、参照には TaskManager の API を用いている。
|
2
|
124
|
3
|
125 \vspace{-6mm}
|
2
|
126 \subsubsection{光源処理のSIMD化}
|
|
127 光源処理の演算をSIMD演算で実装した。
|
|
128 Cell では、SPEに実装されている128ビットレジスタを用いてSIMD
|
|
129 (Single Instruction Multiple Data)を行うことが 出来る。
|
|
130 SIMDとは、1つの命令で複数のデータに対して処理を行う演算方式である。
|
|
131 そのSIMDを用いて、本来4つの光源を計算するため同じ処理を4回行うところを、
|
|
132 1度の光源処理で4つ分の光源の計算を行うことができた。以下にSIMDを用いない場合の光源ベクトルの算出コードを示す。
|
|
133
|
3
|
134 {\small
|
2
|
135 \begin{verbatim}
|
|
136 light_vector[0] = world_x - light_xyz[i*4];
|
|
137 light_vector[1] = world_y - light_xyz[i*4+1];
|
|
138 light_vector[2] = world_z - light_xyz[i*4+2];
|
|
139 light_vector[3] = light_xyz[i*4+3];
|
|
140 \end{verbatim}
|
3
|
141 }
|
2
|
142
|
|
143 次に上記のコードをSIMD化したコードを示す。
|
|
144
|
3
|
145 {\small
|
2
|
146 \begin{verbatim}
|
|
147 *vlight_vector = spu_sub(v_world[i],vlight_xyz[i]);
|
|
148 \end{verbatim}
|
3
|
149 }
|
2
|
150
|
|
151 このように、SIMD演算を用いて、4つの演算命令を1つの演算命令で行うことができる。
|
|
152
|
3
|
153 \section{評価とまとめ}
|
2
|
154 \subsection{実行速度評価}
|
|
155 光源を実装した後と、光源処理をSIMD化した時のFPS(Frame Per Second)を計測した。
|
3
|
156 計測対象として地球と月のオブジェクトを表示する例題プログラムを、Cell上のPPE1個、SPE6個で実行した。解像度は1920×1080である。
|
2
|
157 以下にFPSを示す。
|
|
158
|
3
|
159
|
2
|
160 %2 & 7.448494 FPS \\
|
|
161 %3 & 7.341228 FPS \\
|
3
|
162
|
|
163 \vspace{3mm}
|
|
164 \begin{table}[htb]
|
|
165 \begin{center}
|
|
166 \vskip -\lastskip \vskip -20pt
|
|
167 \caption{SIMD を用いることによる実行速度の比較}
|
|
168 \hbox to\hsize{\hfil
|
|
169 \begin{tabular}{c|l|l} \hline \hline
|
|
170 & SIMDなし(FPS) & SIMDあり (FPS)\\ \hline
|
|
171 \hline
|
|
172 %Mac OSX & 7.0 & 8.5\\ \hline
|
|
173 Cell (光源数 1) & 7.56 & 8.12 \\ \hline
|
|
174 Cell (光源数 4) & 7.21 & 7.60 \\ \hline
|
|
175 \end{tabular}\hfil}
|
|
176 \label{tb:lightspeed}
|
|
177 \end{center}
|
|
178 \end{table}
|
|
179 \vspace{-5mm}
|
2
|
180
|
|
181 計測結果より、SIMDを用いた4つ分の光源処理が、SIMDを用いていない処理より約 0.4FPS の速度向上が見られた。
|
|
182 また、SIMDを用いていない1つ分の光源処理との実行速度差が約 0.04FPS と近いものとなった。
|
|
183 このことより、SIMD化が有効に働いており、4つの分の光源処理を一度に処理できていると言える。
|
3
|
184 FPSはCerium全体の実行速度を対象としているため、光源数が1から4になり光源処理の計算が4倍
|
|
185 なっても、FPSが4分の1になるわけではない。
|
2
|
186
|
3
|
187 \vspace{-6mm}
|
|
188 \subsection{まとめ}
|
|
189 %Rendering Engine はまだ、高速化の余地がある。今回の光源処理でも見られたように、各タスクでの演算をSIMD化することで高速化が望める。また SceneGraph から Polygon の生成はSPEによって並列実行されていない。Polygon 生成のタスクをSPEで並列実行することでも高速化が望める。
|
|
190
|
2
|
191
|
|
192 \thispagestyle{fancy}
|
|
193 \begin{thebibliography}{9}
|
|
194
|
|
195 \bibitem{1} 宮國渡 "Implementation of Fine-grain Task Manager for Cell" 平成20年度 学位論文(修士)
|
|
196
|
|
197 \bibitem{3} fixstars:
|
|
198 http://cell.fixstars.com/ps3linux/index.php/メインページ
|
|
199
|
|
200 \bibitem{4} OpenCL:
|
|
201 http://www.khronos.org/opencl/
|
|
202
|
|
203 \end{thebibliography}
|
|
204 \end{document}
|