23
|
1 .. include:: s5defs.txt
|
|
2 .. include:: <mmlalias.txt>
|
20
|
3
|
|
4 ===========================================
|
|
5 Cell 用の Fine-Grain Task Manager の実装
|
|
6 ===========================================
|
|
7
|
|
8 *発表者*
|
|
9 **宮國渡**
|
|
10
|
|
11 *指導教官*
|
|
12 **河野真治**
|
|
13
|
|
14 *所属*
|
|
15 **琉球大学 理工学研究科 情報工学専攻 並列信頼研究室**
|
|
16
|
|
17
|
24
|
18 発表の流れ
|
|
19 ======================
|
|
20
|
|
21 - 研究の背景と目的
|
|
22 - Cell アーキテクチャの概要
|
|
23 - Many Core プログラミングの特徴
|
|
24 - Task Manager の実装
|
|
25 - Task Manager を用いた並列プログラム
|
|
26 - Cerium
|
|
27 - Cerium を用いたゲーム
|
|
28 - まとめと今後の課題
|
|
29
|
|
30
|
23
|
31 研究の背景
|
20
|
32 ===================
|
|
33
|
23
|
34 現在、学生実験で PS3Linux を用いてゲーム開発を行っているが、
|
|
35 学生には困難であることがわかってきている
|
20
|
36
|
23
|
37 + :maroon:`問題1` : :underline:`Cell アーキテクチャプログラミング`
|
20
|
38
|
|
39 + Many Core による並列プログラミング
|
|
40
|
|
41 (データ、コードの分割の必要性)
|
|
42
|
|
43 + Cell の仕様 (DMA、データのアライメント、etc..)
|
|
44
|
23
|
45 + :maroon:`問題2` : :underline:`ゲーム開発用の Framework が無い`
|
|
46
|
|
47 実験期間の大半を Cell の勉強に費やさねばならず、
|
|
48 開発されるゲームのレベルが例年一定以上にならない
|
|
49
|
|
50 研究目的
|
|
51 ============
|
|
52
|
|
53 Many Core Architecture を用いた並列プログラムの開発をサポートするフレームワーク :maroon:`Fine Grain Task Manager` を提案する
|
|
54
|
|
55 - 動作環境
|
|
56
|
24
|
57 - Mac OS X、Linux、PS3(Cell)
|
23
|
58
|
|
59 - Fine Grain Task の単位
|
|
60
|
24
|
61 - サブルーチンまたは関数
|
23
|
62
|
|
63 - Task Manager を用いた開発行程
|
|
64
|
24
|
65 1. 逐次型プログラム (MacOSX、Linux)
|
|
66 #. データやコードを分割したプログラム (MacOSX、Linux)
|
|
67 #. 並列に動かすプログラム (Cell)
|
23
|
68
|
|
69 各段階で信頼性を確保しながら開発を進める
|
|
70
|
|
71
|
|
72 研究目的 (Con't)
|
|
73 ==================
|
|
74
|
|
75 **Cerium**
|
|
76 Task Manager を用いた、PS3ゲーム開発用フレームワーク
|
|
77
|
|
78 Cerium は 3 つの機能で構成されている
|
|
79
|
|
80 - 独自の :maroon:`Rendering Engine`
|
|
81 - ゲームに登場するオブジェクトやルールなど、ゲームを構成する要素を
|
|
82 木構造として持つ :maroon:`Scene Graph`
|
|
83 - Rendering Engine や Scene Graph の処理単位を Task とし、複数の Core へ
|
|
84 割り振りを行うカーネル :maroon:`TaskManager`
|
|
85
|
|
86
|
|
87 Cell アーキテクチャの概要
|
|
88 ===========================
|
|
89
|
24
|
90 - :silver:`研究の背景と目的`
|
23
|
91 - :big:`Cell アーキテクチャの概要`
|
|
92 - :silver:`Many Core プログラミングの特徴`
|
|
93 - :silver:`Task Manager の実装`
|
|
94 - :silver:`Task Manager を用いた並列プログラム`
|
|
95 - :silver:`Cerium`
|
|
96 - :silver:`Cerium を用いたゲーム`
|
|
97 - :silver:`まとめと今後の課題`
|
20
|
98
|
23
|
99 Cell Broadband Engine
|
|
100 ========================
|
|
101
|
|
102 .. image:: images/cell_arch.jpg
|
|
103 :align: center
|
|
104 :width: 280px
|
|
105
|
|
106 - 1個の PPE と 8 個の SPE がリングバスで構成されている
|
|
107
|
|
108 - Linux 側から使える SPE は 6 個
|
|
109
|
|
110 - SPE は :maroon:`256KB` の Local Store (LS) を持つ
|
|
111 - SPE からメインメモリへは直接アクセスできない
|
|
112
|
|
113 - SPE が持つ MFC (Memory Flow Controller) へ
|
|
114 :maroon:`DMA 命令` を送ることで行う
|
|
115
|
|
116 Cell の基本機能
|
|
117 =======================
|
|
118
|
|
119 - :maroon:`DMA (Direct Memory Access)`
|
|
120
|
|
121 メインメモリと LS 間でデータが転送される
|
|
122
|
|
123 DMA 転送を行うにはいくつか条件がある
|
|
124
|
|
125 - データサイズは 16 バイトの倍数
|
|
126 - 転送元と転送先のアドレスが 16 バイト境界に揃えられている
|
|
127
|
|
128 - :maroon:`Mailbox`
|
|
129
|
|
130 SPE の MFC 内にある FIFO キュー
|
|
131
|
|
132 PPE と SPE 間で 32 ビットメッセージの交換に用いられる
|
|
133
|
|
134 キューは 3 種類
|
|
135
|
|
136 - SPU Inbound Mailbox : PPE |rightarrow| SPE
|
|
137 - SPU Outbound Mailbox : SPE |rightarrow| PPE
|
|
138 - SPU Outbound interrupt Mailbox : SPE |rightarrow| PPE (割り込み)
|
|
139
|
|
140 Many Core プログラミングの特徴
|
|
141 ================================
|
|
142
|
24
|
143 - :silver:`研究の背景と目的`
|
23
|
144 - :silver:`Cell アーキテクチャの概要`
|
|
145 - :big:`Many Core プログラミングの特徴`
|
|
146 - :silver:`Task Manager の実装`
|
|
147 - :silver:`Task Manager を用いた並列プログラム`
|
|
148 - :silver:`Cerium`
|
|
149 - :silver:`Cerium を用いたゲーム`
|
|
150 - :silver:`まとめと今後の課題`
|
|
151
|
|
152
|
|
153 定常的な並列度の必要性
|
|
154 ========================
|
|
155
|
|
156 **Amdahl 則**
|
|
157 元のプログラムの並列化率が低ければ、その性能を生かすことは出来ない
|
|
158
|
|
159 .. image:: images/amdahl.jpg
|
|
160 :align: center
|
|
161 :width: 360px
|
20
|
162
|
|
163 .. raw:: html
|
|
164
|
23
|
165 <div align="center" style="font-size: large;">
|
|
166 6 CPU を使っても、プログラムの並列化率が 8 割程度では<br/>
|
|
167 3倍程度の性能向上しか得られない
|
|
168 </div>
|
20
|
169
|
23
|
170 Amdahl 則より、恒常的に並列プログラムの並列度を維持する必要がある
|
24
|
171
|
|
172
|
|
173 プログラム及びデータの分割
|
|
174 ============================
|
|
175
|
|
176 プログラム中の並列度は、以下の形で取り出すことが可能
|
|
177
|
|
178 .. raw:: html
|
|
179
|
|
180 <table>
|
|
181 <tr>
|
|
182 <td style="border: 1px solid black;">
|
|
183 <img src="images/manycore_data_split.jpg" width="350">
|
|
184 </td>
|
|
185 <td style="border: 1px solid black;">
|
|
186 <img src="images/manycore_pipeline.jpg" width="350">
|
|
187 </td>
|
|
188 </tr>
|
|
189 <tr>
|
|
190 <td align="center">データ並列</td>
|
|
191 <td align="center">パイプライン処理</td>
|
|
192 </tr>
|
|
193 </table>
|
|
194
|
|
195 上二つの処理を行うには、プログラムとデータの適切な分割が必要
|
|
196
|
|
197 - プログラムの分割
|
|
198
|
|
199 - for 文、木構造で処理する個々のステートメント
|
|
200
|
|
201 - データの分割
|
|
202
|
|
203 - 自明には行えない可能性がある
|
|
204 - 分割できるデータ構造の採用が必要となる
|
|
205
|
|
206 Many Core の同期とデバッグ
|
|
207 ============================
|
|
208
|
|
209
|
|
210 **同期**
|
|
211 複数の CPU がデータの待ち合わせ、または、整合性を維持するために、他の CPU との待ち合わせを行うこと
|
|
212
|
|
213 - 各 CPU が待ち合わせを行うと、並列度が下がってしまうため、同期自体を減らす必要がある
|
|
214
|
|
215 .. raw:: html
|
|
216
|
|
217 <div align="center">
|
|
218 ↓
|
|
219 </div>
|
|
220
|
|
221 - 各 CPU が独立に (ロック無しで) データにアクセスできる様にデータを分割すれば良い
|
|
222
|
|
223 **デバッグ**
|
|
224
|
|
225 - 並列プログラムの実行は非決定的
|
|
226
|
|
227 - 非決定的 = 同じ状態で実行しても結果が異なる
|
|
228
|
|
229 - バグの状態を再現することが難しい
|
|
230
|
|
231 - 個々の CPU 上のデータを調べる必要がある
|
|
232
|
|
233
|
|
234 並列プログラムの開発行程
|
|
235 ==========================
|
|
236
|
|
237 並列プログラミングでは、以下の段階において、それぞれ実装とテストを行う。
|
|
238
|
|
239 1. C によるシーケンシャルな実装
|
|
240 2. 並列実行を考慮したデータ構造を持つ実装
|
|
241 3. コードを分割し、シーケンシャルに実行する実装
|
|
242 4. 分割したコードを並列実行する実装
|
|
243
|
|
244
|
|
245 比較 - Gallium
|
|
246 ===========================
|
|
247
|
|
248 .. _Gallium: http://www.tungstengraphics.com/wiki/index.php/Gallium3D
|
|
249 .. _OSMesa: http://www.mesa3d.org/
|
|
250
|
|
251 Gallium_
|
|
252 オープンソースの 3D グラフィックドライバ
|
|
253
|
|
254 フレームバッファエンジン用のレンダリングエンジンである OSMesa_ の
|
|
255 Cell ドライバとして用いられている
|
|
256
|
|
257 - Triangle (Polygon) を SPE に送り、その中から得られた Span に
|
|
258 テクスチャを貼ってレンダリングする
|
|
259 - SPE は6 個使用
|
|
260 - SIMD 演算を積極的に使用している。
|
|
261
|
|
262 先行研究では Rendering Engine に OSMesa を使用していたため、
|
|
263 Cerium Rendering Engine のレンダリング手法は OSMesa を参考にしている
|
|
264
|
|
265
|
|
266 比較 - Gallium (Con't)
|
|
267 ====================================================
|
|
268
|
|
269 - 先行研究 (神里)
|
|
270
|
|
271 - 現在 PS3Linux からは :maroon:`GPU にアクセスできない`
|
|
272 - :maroon:`フレームバッファは使用できる` ため、OSMesa を使用
|
|
273 - OSMesa の機能の一部を SPE に乗せ、高速化に成功
|
|
274 - ソースコードの複雑化を招いた
|
|
275
|
|
276 - OSMesa の元々の実装の影響 (巨大なマクロ、構造体)
|
|
277
|
|
278 - 以降のメンテナンスや機能の追加、改良が困難と判断
|
|
279 - 独自に Rendering Engine を持つことに
|
|
280
|
|
281 - Gallium
|
|
282
|
|
283 - OSMesa の Cell Driver
|
|
284 - OpenGL + Gallium でのゲーム開発は可能
|
|
285 - PS3 上のゲーム開発において、レンダリングのみを SPE に実装するのでは足りない
|
|
286
|
|
287 - ゲームに登場するオブジェクトの計算 (衝突判定等)
|
|
288 - Amdahl 則の問題
|
|
289
|
|
290 - レンダリングだけでなく、ゲームオブジェクトも SPE で処理できるように
|
|
291 しなければならない
|
|
292
|
|
293 - Cerium
|
|
294
|
|
295 - SceneGraph、レンダリングを SPE 上で処理する
|
|
296
|
|
297 比較 - Gallium (Con't)
|
|
298 ==========================
|
|
299
|
|
300 - 実行速度比較
|
|
301
|
|
302 - 出力解像度は 1920x1080
|
|
303 - 地球のテクスチャを貼った球体のオブジェクトを表示
|
|
304
|
|
305 .. image:: images/com_gallium.jpg
|
|
306 :align: center
|
|
307 :width: 350px
|
|
308
|
|
309 ===================== ===============
|
|
310 Gallium (SPE 6 個) 5.4 FPS
|
|
311 --------------------- ---------------
|
|
312 Cerium (SPE 1 個) 2.5 FPS
|
|
313 --------------------- ---------------
|
|
314 Cerium (SPE 6 個) :maroon:`9.5 FPS`
|
|
315 ===================== ===============
|
|
316
|
|
317
|
|
318 比較 - OpenGL
|
|
319 ==========================
|
|
320
|
|
321 .. _OpenGL: http://www.opengl.org/
|
|
322
|
|
323 OpenGL_
|
|
324 オープンソースの3Dグラフィックスプログラムインターフェース
|
|
325
|
|
326 - ポリゴンの描画
|
|
327
|
|
328 .. raw:: html
|
|
329
|
|
330 <div align="center" style="color: maroon; font-size: large;">
|
|
331 // 線分3つ指定し、三角形を生成<br/>
|
|
332 glVertex3d(x1, y1, z1);<br/>
|
|
333 glVertex3d(x2, y2, z2);<br/>
|
|
334 glVertex3d(x3, y3, z3);<br/>
|
|
335 </div>
|
|
336
|
|
337 - OpenGL での親子関係の表現
|
|
338
|
|
339 glPushMatrix();
|
|
340 //現在処理してるオブジェクトの変換行列をスタックに登録
|
|
341
|
|
342 makePolygon();
|
|
343 //このオブジェクトは今まで Push された変換行列の影響を受ける
|
|
344
|
|
345 glPopMatrix();
|
|
346 //スタックから変換行列を取り出す
|
|
347
|
|
348
|
|
349 比較 - OpenGL (Con't)
|
|
350 ==========================
|
|
351
|
|
352 レンダリングは Cerium Rendering Engine を用いて、
|
|
353 ゲームオブジェクトの操作は OpenGL を用いることでゲーム開発は可能
|
|
354
|
|
355 - OpenGL が持つレンダリングドライバは使用せずに、オブジェクトの操作結果をポリゴンとして出力するためには、各オブジェクトの変換行列が必要
|
|
356
|
|
357 - 各オブジェクトのパラメータは変換行列が掛けられる前の状態を保持
|
|
358
|
|
359 - 変換行列は OpenGL が内部にもつ Matrix Stack に格納されている
|
|
360
|
|
361 - Matrix Stack から、 :maroon:`各オブジェクトに対応する変換行列` を取り出す必要がある
|
|
362
|
|
363 最初から自身の変換行列を持っている SceneGraph というデータ構造を用いれば、
|
|
364 SPE 上でオブジェクトの操作から変換行列による更新まで一括して行える
|
|
365
|
|
366
|
|
367
|
|
368 比較 - OpenCL
|
|
369 =====================
|
|
370
|
|
371 **OpenCL**
|
|
372 マルチコアCPUやGPU、その他のプロセッサによる、ヘテロジニアスコンピューティングのフレームワーク
|
|
373
|
|
374 .. image:: images/cp_opencl_plat.jpg
|
|
375 :align: center
|
|
376 :width: 300px
|
|
377
|
|
378 - Host から PE へ実行コマンドが送られる
|
|
379 - Host や OpenCL Device はコマンドの管理を行う kernel を持つ
|
|
380 - OpenCL Device 毎に独立したメモリ領域を持つ
|
|
381 - データ並列、タスク並列をサポート
|
|
382
|
|
383 比較 - OpenCL (Con't)
|
|
384 ======================
|
|
385
|
|
386 **OpenCL**
|
|
387
|
|
388 - あらゆる Many Core Architecture に対応できるような汎用的な実装
|
|
389 - 開発環境にあわせた記述が必要
|
|
390
|
|
391 **Task Manager**
|
|
392
|
|
393 - Cell アーキテクチャに重きを置いた記述
|
|
394 - DMA によるメモリアクセスなど、決まった記述で開発できる
|
|
395 - 大幅なコードの変更無く Mac OS X や Linux など複数の環境で動作させることが可能
|
|
396
|
|
397 Task Manager は :maroon:`OpenCL による実装の一つ` と言える
|
|
398
|
|
399 - 学生による Cell プログラミングフレームワークとしては Task Manager が扱いやすい
|