comparison presen/presen1.html @ 24:716f0a413687 draft

add file
author Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
date Mon, 13 Feb 2012 11:55:11 +0900
parents 02067287fac3
children fa8b52588f67
comparison
equal deleted inserted replaced
23:02067287fac3 24:716f0a413687
77 <h4>琉球大学理工学研究科情報工学専攻</h4> 77 <h4>琉球大学理工学研究科情報工学専攻</h4>
78 <div class="handout"></div> 78 <div class="handout"></div>
79 </li> 79 </li>
80 80
81 <li class="slide"> 81 <li class="slide">
82 <h1>研究背景と目的(1/2)</h1> 82 <h1>研究背景と目的</h1>
83 <font size="5"> 83 <font size="5">
84 当研究室では、マルチコアCPU上での開発を支援するたの、並列プログラミングフレームワーク Cerium を開発し、学生実験で使用している。本研究では 84 <u>本研究では並列プログラムフレームワーク Cerium の改良を行い、並列処理の並列度向上とCell以外のマルチコアCPUへの対応に成功した。</u><br>
85 Cerium の信頼性の向上を目的とし、改良を行った (信頼性 = 仕様通りに動作する)<br> 85
86 86 <img src="pix/amdahl.jpg" style="display:block; width:50%; float: right; margin-top:0%">
87 マルチコア上の並列プログラミングでは 87
88 <ul> 88 <ul>
89 <li>並列処理部分の特定や同期処理を適切に行わなければ、台数効果は得られない。</li> 89 <li>アムダールの法則より、プログラム全体の並列化率が低ければマルチコアの性能を活かすことができない</li>
90 <li>再現性ないバグなどが発生する可能性がある</li> 90 <li>現在の Cerium を用いたプログラムの開発では、高い並列度が保証されない</li>
91 <li>アーキテクチャを理解し最適なプログラムを書く必要がある</li> 91 <li>Cerium はPS3/Cell での並列処理を行えるが、当初はCell向けに作られた為、他の汎用マルチコアCPU に対応していない</li>
92 </ul><br> 92 </ul><br>
93 93
94 など信頼性のあるプログラムを開発するには逐次プログラミングよりも技術と手間がかかる問題がある<br> 94 Cerium の他CPUへの対応と、自明な並列度があるレンダリングとゲーム処理を例題に、高い並列度の維持を目的とする
95 Cell上でのゲーム作成を行う学生実験でも、講義期間中に作品が一定のレベルに達しない問題が生じた。そこで学生実験での使用を考慮した フレームワーク Cerium を開発した<br> 95
96 96 </font>
97 </font> 97
98
99 <li class="slide">
100 <h1>研究背景と目的(2/2)</h1>
101 <font size="5">
102 Cerium を用いて 期間中のゲームの作成が可能になった。しかし学生実験での使用や、例題の実装を行い Cerium の信頼性が十分でない点が明らかになった。
103 <ul>
104 <li>仕様通りの稼働率がでない</li>
105 <li>アーキテクチャ依存の記述が含まれている</li>
106 </ul><br>
107 以上の問題点を解決するため
108 <ul>
109 <li>ソフトウェアMailQueueの実装</li>
110 <li>TaskをグルーピングするTaskArrayの実装</li>
111 <li>明示的なDMAロードを隠蔽するMemorySegmentのAPIの実装</li>
112 </ul><br>
113 などの改良を行い、信頼性のある並列プログラミングフレームワークを目指す。
114 </font>
115 98
116 <li class="slide"> 99 <li class="slide">
117 <h1>発表構成</h1> 100 <h1>発表構成</h1>
118 <ul> 101 <ul>
119 <li>Cellの機能</li> 102 <li>Cellの機能</li>
120 <li>Ceriumの構成</li> 103 <li>Ceriumの構成</li>
121 <li>Ceriumに行った改良とその効果</li> 104 <li>Cerium の問題点1(Mail の待ち時間)</li>
122 <ul> 105 <ul>
123 <li>TaskArrayの実装(Mailの待ち時間の削減)</li> 106 <li>TaskArray での改良と効果</li>
124 <li>ソフトウェアMailQueueの実装(Mailの待ち時間の削減)</li> 107 <li>MailQueue での改良と効果</li>
125 <li>MemorySegmentの実装(アーキテクチャ依存記述の隠蔽)</li> 108 </ul>
109 <li>Cerium の問題点2(アーキテクチャ依存の記述)</li>
110 <ul>
111 <li>MemorySegmentでの改良と効果</li>
126 </ul> 112 </ul>
127 <li>まとめ</li> 113 <li>まとめ</li>
114 <li>OpenGLとの比較</li>
128 <li>今後の課題</li> 115 <li>今後の課題</li>
129 </ul> 116 </ul>
130 117
131 <li class="slide"> 118 <li class="slide">
132 <h1>Cell Broadband Engine</h1> 119 <h1>Cell Broadband Engine</h1>
133 <font size="5"> 120 <font size="5">
134 121
135 研究、実験の題材となった Cell Broadband Engine とは、 122 研究、実験の題材となった Cell Broadband Engine とは、
136 <ul> 123
137 <li>ソニー、SCE、 IBM、 東芝によって開発されたプロセッサ</li> 124 <img src="pix/cell.png" style="display:block; width:50%; float: right; margin-top:0%">
138 <li>マルチコアで、9つのコアを持つ</li> 125
139 <ul> 126 <ul>
140 <li>制御用コア PorwerPC Processor Element 1基</li> 127 <li>1基のPPEと8基のSPEがリングバス(EIB)で構成されている。動作クロックは3.2GHz(実験で使えるSPEの数は6基)</li>
141 <li>演算用コア Synergistic Processor Element 8基 (実験で使用できるのは6基)</li> 128 <li>リングバスのデータ帯域幅は1サイクルあたり最大96byte(3.2GHz駆動時には307.2GB/sec)</li>
142 <li>各コアは Element Interconnect Bus を経由してデータアクセスを行う</li> 129 <li>SPEは256KBのLocalStore(LS)を持つ</li>
143 </ul> 130 <li>SPEからメインメモリへは直接アクセスできない</li>
144 </ul> 131 <ul>
145 132 <li>SPEが持つMFC(Memory Flow Controller)へDMA命令を送ることで行う</li>
146 <p style="text-align: center;"> 133 </ul>
147 <img class="scale" src="pix/cell.png" alt="" title="At a Glance" /> 134 </ul>
148 </p> 135
149 136 </font>
150 </font> 137
151 138 <li class="slide">
152 <li class="slide"> 139 <h1>Cellの機能</h1>
153 <h1>Cellの機能(DMA転送)</h1>
154 <font size="6"> 140 <font size="6">
155 Cell の SPE は直接 MainMemory にアクセスできない。 明示的な DMA 転送命令を用いてデータにアクセスする。転送するデータの条件として 141
156 142 <u>Mailbox</u>
157 <ul> 143
158 <li>16アラインメントに揃える</li> 144 <ul>
159 <li>16byte の倍数のサイズでなければならない</li> 145 <li>SPEのMFC内にあるFIFOキュー</li>
160 <li>一度の転送は16KB の大きさまでできる</li> 146 <li>PPE と SPE 間で32ビットメッセージの交換ができる</li>
147 <li>Mail の Queue の種類</li>
148 <ul>
149 <li>SPU inbound Mailbox: PPE -> SPE (キューのサイズは4)</li>
150 <li>SPU Outbound Mailbox: SPE -> PPE (キューのサイズは1)</li>
151 </ul>
161 </ul><br> 152 </ul><br>
162 153
163 プログラムが明示的にDMA命令を発行して、データ転送を行う 154 Outbound Mailbox へ Mail を書き込む際、キューがいっぱいの時は、PPE 側から読み込まれるまで待つ。
164 </font> 155
165 156 </font>
166 <li class="slide"> 157 <li class="slide">
167 <h1>Cellの機能(Mailbox)</h1> 158 <h1>Cerium</h1>
159 <font size="5">
160 Cerium の構成
161
162 <img src="pix/cerium.png" style="display:block; width:50%; float: right; margin-top:0%">
163
164 <ul>
165 <li>TaskManager</li>
166 <ul>
167 <li><font size="5">ユーザが定義したTaskを管理し、各コアに割り当てる</font></li>
168 </ul>
169
170 <li>RenderingEngine</li>
171 <ul>
172 <li><font size="5">オブジェクトを画面に描画する</font></li>
173 <li><font size="5">3種類のTaskから構成される</font></li>
174 </ul>
175
176 <li>SceneGraph</li>
177 <ul>
178 <li><font size="5">ゲームのシーンを作成し、それを切り替えながらゲームを進行する</font></li>
179 <li><font size="5">OpenSceneGraphのようなもの</font></li>
180 </ul>
181
182 </ul><br>
183
184 </font>
185
186 <li class="slide">
187 <h1>TaskManager</h1>
188 <font size="5">
189 TaskManager は、Taskと呼ばれる分割された各プログラムを管理する。Task の単位
190 はサブルーチンである。Task 同士の依存関係を考慮しながら実行していく。</p>
191 <p>Task を生成する際に、以下のような要素が設定可能である</p>
192
193 <ul>
194 <li><b>input data, output data, parameter</b><br>
195  これらは関数でいうところの引数に価する</li>
196 <li><b>cpu type</b><br>
197  Task を PPE または SPE のどちらで実行するのかを示している</li>
198 <li><b>dependency</b></li>
199  他の Task との依存関係を示している
200 </li>
201 </ul>
202
203 </font>
204
205 <li class="slide">
206 <h1>TaskManager</h1>
207 <font size="5">
208
209 <img src="pix/scheduler1.png" style="display:block; width:50%; float: right; margin-top:0%">
210
211 <ul>
212 <li>生成された Task は TaskList としてまとめられ SPE で実行される</li>
213 <li>SPE 側では受け取った TaskList から Task を受け取り、パイプライン的に実行していく</li>
214 </ul>
215
216 </font>
217
218
219 <li class="slide">
220 <h1>Mailのやり取り</h1>
168 <font size="6"> 221 <font size="6">
169 222 <ul>
170 PPE と SPE の通信には Mailbox を用いる 223 <li>SPE と PPE 間の同期は Mail のやり取りを行う</li>
171 224 <br>
172 <ul> 225 <li>Mailのタイミング</li>
173 <li>PPE と SPE 間で32ビットメッセージの交換ができる</li> 226 <br>
174 <li>Mail の Queue は3種類</li> 227 <font color="red">SPE -> PPE</font>
175 <ul> 228 <ul>
176 <li>SPU inbound Mailbox: PPE -> SPE</li> 229 <li>タスクの終了(Taskの依存関係の解決のため)</li>
177 <li>SPU Outbound Mailbox: SPE -> PPE</li> 230 <li>新しい TaskList のリクエスト</li>
178 <li>SPU Outbound interrupt Mailbox: SPE -> PPE (割り込み)</li> 231 </ul>
179 </ul> 232 <br>
180 </ul><br> 233 <font color="red">PPE -> SPE</font>
181 234 <ul>
182 235 <li>新しい TaskList の送信</li>
183 </font> 236 </ul>
184 <li class="slide"> 237 </ul>
185 <h1>Cerium</h1> 238
186 <font size="6"> 239 </font>
187 Cerium とは 240
188 241 <li class="slide">
189 <ul> 242 <h1>PPEとSPEで行われるパイプライン処理</h1>
190 <li>並列プログラミング用のフレームワーク</li> 243 <font size="5">
191 <li>学生実験での使用を考慮して PS3/Cell, Linux, MacOSX で動作する</li> 244 PPEとSPE 間で Mail を介して Task の実行をパイプライン化している。
192 <li>Ceriumの構成</li> 245 Mail の受け取りは PPE 側から定期的にポーリングするしかなく、PPE のMain ループで定期的に チェックしている。<br>
193 <ul> 246 <u>パイプラインがうまく動作する例</u>
194 <li>TaskManager</li> 247 <img src="pix/mailsched1.png" style="display:block; width:60%; float: center; margin-top:0%">
195 <li>RenderingEngine</li> 248
196 <li>SceneGraph</li> 249 当初はこれでうまくパイプラインが実行されていると思われていたが、うまくいかないパターンが存在することが明らかになった。
197 </ul> 250
198 </ul> 251
199 </font> 252 </font>
200 253
201 <li class="slide"> 254 <li class="slide">
202 <h1>TaskManager</h1> 255 <h1>PPEとSPEで行われるパイプライン処理</h1>
203 TaskManager とは Task のスケジューラ 256 <font size="5">
204 257 PPE 側で実行される Task の処理が多い時に、Mail チェックの頻度が少なくなる。
205 <ul> 258 Outbound Mailbox がひとつの Mail で占有される時間が長くなり、SPE 側の終了した Task の終了Mail が書き出せなくなる。
206 <li>Task とよばれるデータ構造を提供</li> 259 そのため、書き込み待ちが発生し、SPE に待ち時間が発生する。<br>
207 <li>ユーザは処理(単位は関数に近い)を Task で記述していく</li> 260 <u>パイプラインが崩れてしまう例</u>
208 <li>定義されたTask は、Task 情報に沿って各コアに処理を割り振られる</li> 261 <img src="pix/mailsched2.png" style="display:block; width:57%; float: center; margin-top:0%">
209 </ul><br> 262
210 263 これが並列度の低下を招いている。
211 Task で記述された部分の、自動的な並列処理スケジューリングを行う。 264 </font>
212 265
213 <li class="slide"> 266
214 <h1>RenderingEngine(1/2)</h1> 267 <li class="slide">
215 PS3 では Graphics Engine の仕様が公開されていないので、独自の RenderingEngine を開発した。 268 <h1>PPEとSPEで行われるパイプライン処理</h1>
216 Task で記述され、主に3つの Task から構成される 269 <font size="5">
217 <ul> 270 そこで、その問題を解決するため、一つ目のアプローチとして Outbound Mailbox と Task の終了処理の間に ソフトウェア MailQueue を導入した。
218 <li>CreatePolygonTask</li> 271 Outbound Mailbox がいっぱいの場合その Queue に Task 終了 Mail を挿入し、次の Task が実行されるようになった<br>
219 <ul> 272
220 <li>モデリングデータを、三角形のポリゴンに変換する</li> 273 <u>MailQueueを導入によりパイプラインが正常に動作している例</u>
221 </ul> 274 <img src="pix/mailsched3.png" style="display:block; width:55%; float: center; margin-top:0%">
222 <li>CreateSpanTask</li> 275
223 <ul> 276 そのため、SPE の待ち時間が無くなり、並列度が向上した。<br>
224 <li>ポリゴンを水平な線(Span)に分割する</li> 277 </font>
225 </ul> 278
226 <li>DrawSpanTask</li> 279 <li class="slide">
227 <ul> 280 <h1>PPEとSPEで行われるパイプライン処理</h1>
228 <li>Span を Texture とマッピングし画面に出力する</li> 281 <font size="5">
229 </ul> 282 二つ目のアプローチとして、複数の Task を TaskArray としてグルーピングする 方法を考えた。
230 </ul> 283 依存関係が線形である Task は TaskArray としてまとめることにより、Task 終了のメールを減らすことが出来る。
231 284 <img src="pix/taskarray3.png" style="display:block; width:60%; float: center; margin-top:0%">
232 <li class="slide"> 285 TaskArrayを導入することによって、wait time が削減された。
233 <h1>RenderingEngine(2/2)</h1> 286 <img src="pix/taskarray2.png" style="display:block; width:60%; float: center; margin-top:0%">
234 287 これにより、並列度が向上した。
235 例: Cube のモデリングデータの場合には、以下のように Task が働く。 288 </font>
236 289
237 <p style="text-align: center;"> 290 <li class="slide">
238 <img class="scale" src="pix/rendering3.png" width="50%" alt="" title="At a Glance" /> 291 <h1>改良効果の測定</h1>
239 </p> 292 RenderingEngine を用いて、効果を計測した。レンダリングの例題として、ball bound と panelを用いた。<br>
240 293 ball bound は赤いボールが跳ねる例題である。描画領域が画面の中でボールの部分だけであり、描画領域が狭いと言える。<br>
241 <li class="slide"> 294 panel は画面一面に画像を描画する例題である。描画領域が最大である。<br>
242 <h1>SceneGraph</h1> 295 <img src="pix/ball_bound1.png" style="display:block; width:30%; float: left; margin-top:0%">
243 ゲームのシーンを構成する木構造のグラフ。各 Node がゲームのオブジェクトになる。オブジェクトには Move 関数と collision 関数が設定でき、ステイトパターンで入れ替える。 296 <img src="pix/panel1.png" style="display:block; width:30%; float: right; margin:5% 20% 0% 20%">
244 297
245 <p style="text-align: center;"> 298 </font>
246 <img class="scale" src="pix/scenegraph1.png" width="30%" alt="" title="At a Glance" /> 299
247 </p> 300 <li class="slide">
248 301 <h1>改良効果の測定</h1>
249 302 <font size="5">
250 <li class="slide">
251 <h1>Cerium の改良(Mailの待ち時間)</h1>
252 <font size="5">
253 RenderingEngine を用いた例題で、ball bound, panel がある。(FPS = Frame per second)
254 303
255 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center"> 304 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
256 <tr> 305 <caption>ballbound</caption>
257 <th></th> 306
307 <tr>
308 <th>改良項目</th>
258 <th>FPS</th> 309 <th>FPS</th>
259 <th>DMA転送待ち割合</th> 310 <th>mail待ちの割合</th>
260 <th>mail待ち割合</th>
261 <th>SPE稼働率</th> 311 <th>SPE稼働率</th>
262 </tr> 312 <th>SPE稼働率の差分</th>
263 <tr> 313 </tr>
264 <th>ball bound</th> 314
315 <tr>
316 <th>改良なし</th>
265 <th>30.2</th> 317 <th>30.2</th>
266 <th>1.8%</th>
267 <th>74.3%</th> 318 <th>74.3%</th>
268 <th>23.7%</th> 319 <th>23.7%</th>
269 </tr> 320 <th>-</th>
270 <tr> 321 </tr>
271 <th>panel</th> 322
323 <tr>
324 <th>TaskArray適用後</th>
325 <th>32.2</th>
326 <th>66.7%</th>
327 <th>30.8%</th>
328 <th><font color="red">+7.1%</font></th>
329 </tr>
330
331 <tr>
332 <th>MailQueue適用後</th>
333 <th>41.7</th>
334 <th>56.8%</th>
335 <th>40.0%</th>
336 <th><font color="red">+10.8%</font></th>
337 </tr>
338
339
340 </table>
341
342 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
343 <caption>panel</caption>
344
345 <tr>
346 <th>改良項目</th>
347 <th>FPS</th>
348 <th>mail待ちの割合</th>
349 <th>SPE稼働率</th>
350 <th>SPE稼働率の差分</th>
351 </tr>
352
353 <th>改良なし</th>
272 <th>4.0</th> 354 <th>4.0</th>
273 <th>21.3%</th>
274 <th>11.1%</th> 355 <th>11.1%</th>
275 <th>67.6%</th> 356 <th>67.6%</th>
276 </tr> 357 <th>-</th>
277 </table> 358 </tr>
278 359
279 <ul> 360 <tr>
280 <li>panel</li> 361 <th>TaskArray適用後</th>
281 <ul>
282 <li>解像度1980x1080の一枚の画像の描画行う。</li>
283 </ul>
284 <li>ball bound</li>
285 <ul>
286 <li>球が跳ねる例題。</li>
287 </ul>
288 </ul>
289
290 ball bound では Mail 待ちが約70%、稼働率23%と十分な稼働率ではない。(panel は ball bound より描画の処理が重く、その分稼働率が高くなっている)<br>
291 アムダールの法則より稼働率がでないとマルチコアの性能は発揮されない。フレームワークとしての信頼性が十分でない問題がある
292 </font>
293
294 <li class="slide">
295 <h1>Mail 通知のスケジューリング</h1>
296 稼働率を向上させるために、Mail の待ち時間を削減する。<br><br>
297 Cerium では SPE が Mail で 待ち時間が発生するタイミングは2つ
298
299 <ul>
300 <li>TaskList を待つ場合</li>
301 <li>SPE から Mailbox へ書き込む際の待ち</li>
302 </ul>
303
304 <li class="slide">
305 <h1>TaskListのMail待ち</h1>
306 TaskList は処理する Task の List である。PPE で生成され SPE へ Mail で通知される
307
308 <p style="text-align: center;">
309 <img class="scale" src="pix/tasklistmail1.png" width="80%" alt="" title="At a Glance" />
310 </p>
311
312 TaskList が生成され SPE に通知されるまで、SPE に待ち時間が発生する。
313
314 <li class="slide">
315 <h1>Mail の書き込み待ち</h1>
316 Task が終了した際と TaskList が終了した際に SPE が Mailbox へ書き込みを行う(依存関係解決のため)。Outbound Mailbox はサイズが1なので、他のMailが書き込まれている場合、それが PPE側から読み込まれるまで、待つ。
317
318 <p style="text-align: center;">
319 <img class="scale" src="pix/mailschedule2.png" width="80%" alt="" title="At a Glance" />
320 </p>
321
322 TaskList が生成され SPE に通知されるまで、SPE に待ち時間が発生する。
323
324
325 <li class="slide">
326 <h1>TaskArray(1/3)</h1>
327 <font size="5">
328 Task毎に依存関係の解決のため、Mail を通知する。バリア同期など複数の Task が同じ Task を待つ場合にはグルーピングできる。
329 Task のグルーピングを可能にするために TaskArray を実装した。
330
331 <p style="text-align: center;">
332 <img class="scale" src="pix/taskarray1.png" width="80%" alt="" title="At a Glance" />
333 </p>
334
335 </font>
336
337 <li class="slide">
338 <h1>TaskArray(2/3)</h1>
339 例えば TaskListのサイズが4, TaskArray のサイズが4の場合、Task が8個の場合
340
341 <p style="text-align: center;">
342 <img class="scale" src="pix/taskarray2.png" width="80%" alt="" title="At a Glance" />
343 </p>
344
345 グルーピングされるため Task 毎の Mail 回数が減る。TaskList の要求回数が減る。そのため Mail の待ち時間が入る箇所が削減され、Mail の待ち時間自体の削減につながる。
346
347 <li class="slide">
348 <h1>TaskArray(3/3)</h1>
349 <font size="5">
350 TaskArray の効果を示す
351
352 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
353 <caption>ballbound</caption>
354 <tr>
355 <th>TaskArray</th>
356 <th>FPS</th>
357 <th>DMA転送待ち時間</th>
358 <th>mail待ちの割合</th>
359 <th>SPE稼働率</th>
360 </tr>
361 <tr>
362 <th> なし </th>
363 <th>30.2</th>
364 <th>1.8%</th>
365 <th>74.3%</th>
366 <th>23.7%</th>
367 </tr>
368 <tr>
369
370 <tr>
371 <th> あり </th>
372 <th>32.2</th>
373 <th>2.5%</th>
374 <th>66.7%</th>
375 <th>30.8%</th>
376 </tr>
377
378 </table>
379
380 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
381 <caption>panel</caption>
382 <tr>
383 <th>TaskArray</th>
384 <th>FPS</th>
385 <th>DMA転送待ち時間</th>
386 <th>mail待ちの割合</th>
387 <th>SPE稼働率</th>
388 </tr>
389
390 <th>なし</th>
391 <th>4.0</th>
392 <th>21.3%</th>
393 <th>11.1%</th>
394 <th>67.6%</th>
395 </tr>
396
397 <tr>
398 <th>あり</th>
399 <th>4.2</th> 362 <th>4.2</th>
400 <th>22.5%</th>
401 <th>5.7%</th> 363 <th>5.7%</th>
402 <th>71.8%</th> 364 <th>71.8%</th>
403 </tr> 365 <th><font color="red">+4.2%</font></th>
404 </table> 366 </tr>
405 367
406 TaskArray を ball bound, panel の DrawSpanTask に適応。FPS、稼働率の向上。Mail 待ちの時間が削減された 368 <tr>
407 369 <th>MailQueue適用後</th>
408 </font>
409
410 <li class="slide">
411 <h1>MailQueue(1/3)</h1>
412 Task 毎の Mail 書き込み時の待ち時間を削減するため、MailQueue を実装した。
413
414 <ul>
415 <li>SPE から Mailbox に書き出せない場合に MailQueue へと書きだす</li>
416 <li>MailQueue に Mail がある場合は、MailQueue から Mailbox へ書き出す</li>
417 <li>MailQueue に残っている Mail は TaskList のTask を消化した時点で、すべて書き出す処理を挟む</li>
418 </ul>
419
420 <li class="slide">
421 <h1>MailQueue(2/3)</h1>
422
423 Mailbox に書き込めない場合は、MailQueue に書き込む例
424
425 <p style="text-align: center;">
426 <img class="scale" src="pix/mailqueue1.png" width="70%" alt="" title="At a Glance" />
427 </p>
428
429 <li class="slide">
430 <h1>MailQueue(3/3)</h1>
431 <font size="5">
432 MailQeueuの効果
433
434 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
435 <caption>ball bound</caption>
436 <tr>
437 <th>MailQueue</th>
438 <th>FPS</th>
439 <th>DMA転送待ち時間</th>
440 <th>mail待ちの割合</th>
441 <th>SPE稼働率</th>
442 </tr>
443 <tr>
444 <th> なし </th>
445 <th>32.2</th>
446 <th>2.5%</th>
447 <th>66.7%</th>
448 <th>30.8%</th>
449 </tr>
450 <tr>
451
452 <tr>
453 <th> あり </th>
454 <th>41.7</th>
455 <th>3.3%</th>
456 <th>56.8%</th>
457 <th>40.0%</th>
458 </tr>
459
460 </table>
461
462 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
463 <caption>panel</caption>
464 <tr>
465 <th>MailQueue</th>
466 <th>FPS</th>
467 <th>DMA転送待ち時間</th>
468 <th>mail待ちの割合</th>
469 <th>SPE稼働率</th>
470 </tr>
471
472 <tr>
473 <th>なし</th>
474 <th>4.2</th> 370 <th>4.2</th>
475 <th>22.5%</th>
476 <th>5.7%</th>
477 <th>71.8%</th>
478 </tr>
479
480 <th>あり</th>
481 <th>4.2</th>
482 <th>23.7%</th>
483 <th>4.1%</th> 371 <th>4.1%</th>
484 <th>72.3%</th> 372 <th>72.3%</th>
485 </tr> 373 <th><font color="red">+0.5%</font></th>
486 374 </tr>
487 </table> 375 </table>
488 </font> 376
489 377 改良を加え 各例題 の<u>FPS、稼働率の向上。Mail 待ちの時間が削減され、並列度が向上したといえる</u>
490 ball bound , panel ともに Mail 待ち時間が削減され、稼働率、FPS の向上につながった。 378
491 379 </font>
492 380
493 <li class="slide"> 381 <li class="slide">
494 <h1>Ceriumの改良(アーキテクチャ依存記述の隠蔽)</h1> 382 <h1>他のアーキテクチャへの対応</h1>
495 RenderingEngine の Task内 では明示的にDMA転送命令を記述している。 383 PS3 が Linux をサポートしなくなっため、これ以上のCell上での実験が困難になってきている。<br>
496 384 <ul>
497 <ul> 385 <li>これまでアーキテクチャ依存を排除して MacOSX,Linux などの上でも動作する設計を行なっていたため他のアーキテクチャでも動作はする。</li>
498 <li>処理するデータ構造上の理由、Task内でのデータロードが必要</li> 386 <li>しかし並列実行はサポートしておらず、FIFOを用いた 逐次処理のみをサポートしていた。 </li>
499 <li>DMA転送命令は Cell アーキテクチャ依存の記述</li> 387 </ul>
500 <li>他のアーキテクチャなどでは不要</li> 388
501 </ul><br> 389 そこで、汎用マルチコア向けのパラレルタスクのサポートを行った。
502 390
503 フレームワークとしての汎用性に欠ける。 391 <li class="slide">
504 アーキテクチャ依存の記述を隠蔽できるAPIが必要になった。 392 <h1>他のアーキテクチャへの対応</h1>
505 393
506 <li class="slide"> 394 異なるアーキテクチャで動作させるにあたり、アーキテクチャの依存を吸収できるインターフェイスが望ましい。<br>
507 <h1>MemorySegment(1/6)</h1> 395 現在のSPEからのメモリアクセスは直接DMA転送を行うのではなく、MemorySegment API を用いて記述している。
396 MemorySegment API は、読み込んだデータの LSへのLRU方式のキャッシュをサポートする。そのため無駄なデータの転送が
397 削減された。
398 このAPIを用いる前は、Task内部で直接DMA転送を行っており、一度LSに読み込んだデータを再利用する機構がなかった。
399 このMemorySegmentのAPIには MainMemory のアドレスが用いられており、Cell 以外のアーキテクチャでも問題なく動作する。
400
401
402
403 <li class="slide">
404 <h1>Ceriumの改良-MemorySegment(1/6)</h1>
508 明示的なDMA転送命令を隠蔽するため MemorySegment を実装した 405 明示的なDMA転送命令を隠蔽するため MemorySegment を実装した
509 MemorySegemnt はデータ構造。LS 内のデータを管理する。 406 MemorySegemnt はデータ構造。LS 内のデータを管理する。
510 <ul> 407 <ul>
511 <li>一定のメモリを確保し、ハッシュで管理(LRU方式)</li> 408 <li>一定のメモリを確保し、ハッシュで管理(LRU方式)</li>
512 <li>API 内部で自動的なキャッシュを行う (サイズは任意に設定できる)</li> 409 <li>API 内部で自動的なキャッシュを行う (サイズは任意に設定できる)</li>
517 <li>dma_wait -> wait_segment</li> 414 <li>dma_wait -> wait_segment</li>
518 </ul> 415 </ul>
519 </ul> 416 </ul>
520 417
521 <li class="slide"> 418 <li class="slide">
522 <h1>MemorySegment(2/6)</h1> 419 <h1>Ceriumの改良-MemorySegment(2/6)</h1>
523 420
524 <p style="text-align: center;"> 421 <p style="text-align: center;">
525 <img class="scale" src="pix/getsegment1.png" width="50%" alt="" title="At a Glance" /> 422 <img class="scale" src="pix/getsegment1.png" width="50%" alt="" title="At a Glance" />
526 </p> 423 </p>
527 424
528 425
529 <li class="slide"> 426 <li class="slide">
530 <h1>MemorySegment(3/6)</h1> 427 <h1>Ceriumの改良-MemorySegment(3/6)</h1>
531 428
532 <p style="text-align: center;"> 429 <p style="text-align: center;">
533 <img class="scale" src="pix/putsegment1.png" width="50%" alt="" title="At a Glance" /> 430 <img class="scale" src="pix/putsegment1.png" width="50%" alt="" title="At a Glance" />
534 </p> 431 </p>
535 432
536 433 <li class="slide">
537 <li class="slide"> 434 <h1>Ceriumの改良-MemorySegment(6/6)</h1>
538 <h1>MemorySegment(4/6)</h1> 435 MemorySegment を導入し、
539 明示的に記述したDMA転送命令の例
540 <pre>
541 loop() {
542
543 tmp_data = get_data;
544 get_data = send_data;
545 send_data = tmp_data;
546
547 dma_wait(WAIT_STORE);
548
549 dma_store(send_data, send_addr, data_size, WAIT_STORE);
550 dma_load(get_data, get_addr, data_size, WAIT_LOAD);
551
552 dma_wait(WAIT_LOAD);
553
554 calc(get_data);
555
556 }
557 </pre>
558
559 <li class="slide">
560 <h1>MemorySegment(5/6)</h1>
561 MemorySegment を適応させた例
562 <pre>
563 loop() {
564
565 wait_segment(put_ms);
566
567 put_ms = get_ms;
568
569 put_segment(put_ms);
570 get_ms = get_segment(get_addr, ml);
571
572 wait_segment(get_ms);
573 get_data = get_ms->data;
574
575 calc(get_data);
576 }
577 </pre>
578
579 <li class="slide">
580 <h1>MemorySegment(6/6)</h1>
581 MemorySemgment を導入
582 436
583 <ul> 437 <ul>
584 <li>アーキテクチャ依存の記述を隠蔽することに成功した</li> 438 <li>アーキテクチャ依存の記述を隠蔽することに成功した</li>
585 <li>汎用的な Task 内でのデータ転送APIとして使用でき</li> 439 <li>汎用的な Task 内でのデータ転送APIとして使用でき</li>
586 <li>Core i7, Xeon などの汎用のメニーコアにも対応可能</li> 440 <li>Core i7, Xeon などの汎用のマルチコアにも対応可能</li>
587 </ul> 441 </ul>
588 442
589 <li class="slide"> 443 <li class="slide">
590 <h1>まとめ(1/2)</h1> 444 <h1>まとめ</h1>
591 並列プログラミングフレームワーク Cerium の改良を行った。 445 並列プログラミングフレームワーク Cerium の改良を行った。
592 446
593 <ul> 447 <ul>
594 <li>MailQeueu, TaskArry を実装、導入した。その結果 Mail の待ち時間の削減、稼働率と FPS の向上に成功した</li> 448 <li>MailQeueu, TaskArry を実装、導入した。その結果 Mail の待ち時間の削減、稼働率と FPS の向上に成功した</li>
595 <li>MemorySegment を実装し、汎用的なデータ転送APIが利用できるようになった。Cell アーキテクチャ依存の記述の隠蔽に成功</li> 449 <li>MemorySegmentを適応し、汎用的なデータ転送APIが利用できるようになった。</li>
596 </ul><br> 450 </ul><br>
597 451
598 以上の改良を行い、稼働率の向上、アーキテクチャ依存のコードの排除に成功し、フレームワークとしての信頼性が向上した。 452 以上の改良を行い、稼働率の向上、Cellのみでなく、他の汎用マルチコアCPUへの対応にも成功した。
599
600 <li class="slide">
601 <h1>まとめ(2/2)</h1>
602
603 改良の効果を示す
604
605 <font size="5">
606 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
607 <caption>ball bound</caption>
608 <tr>
609 <th></th>
610 <th>FPS</th>
611 <th>DMA転送待ち時間</th>
612 <th>mail待ちの割合</th>
613 <th>SPE稼働率</th>
614 </tr>
615 <tr>
616 <th>改良前</th>
617 <th>30.2</th>
618 <th>1.8%</th>
619 <th>74.3%</th>
620 <th>23.7%</th>
621 </tr>
622 <tr>
623
624 <tr>
625 <th>改良後</th>
626 <th>41.7</th>
627 <th>3.3%</th>
628 <th>56.8%</th>
629 <th>40.0%</th>
630 </tr>
631 </table>
632
633 <table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
634 <caption>panel</caption>
635 <tr>
636 <th></th>
637 <th>FPS</th>
638 <th>DMA転送待ち時間</th>
639 <th>mail待ちの割合</th>
640 <th>SPE稼働率</th>
641 </tr>
642
643 <tr>
644 <th>改良前</th>
645 <th>4.0</th>
646 <th>21.3%</th>
647 <th>11.1%</th>
648 <th>67.6%</th>
649 </tr>
650
651 <th>改良後</th>
652 <th>4.2</th>
653 <th>23.7%</th>
654 <th>4.1%</th>
655 <th>72.3%</th>
656 </tr>
657
658 </table>
659 </font>
660 453
661 <li class="slide"> 454 <li class="slide">
662 <h1>OpenGL との比較</h1> 455 <h1>OpenGL との比較</h1>
663 学生実験で作成された シューティングゲーム「SuperDandy」 を例題に OpenGL と比較。OpenGL は PPE 1基のみを使用。Cerium は 456 学生実験で作成された シューティングゲーム「SuperDandy」 を例題に OpenGL と比較。OpenGL は PPE 1基のみを使用。Cerium は
664 SPE6基+PPE1基を使用した。 457 SPE6基+PPE1基を使用した。
693 <li>自動的な依存関係の解決</li> 486 <li>自動的な依存関係の解決</li>
694 <ul> 487 <ul>
695 <li>扱うデータから Task の依存関係がわかる</li> 488 <li>扱うデータから Task の依存関係がわかる</li>
696 <li>ユーザが複雑な依存関係を設定しない</li> 489 <li>ユーザが複雑な依存関係を設定しない</li>
697 </ul> 490 </ul>
698 <li>プログラムとデータの On demand Load</li> 491 <li>DataSegment</li>
699 <ul> 492 <ul>
700 <li>プログラムコードはすべて LS に置いている</li> 493 <li>プログラムコードはすべて LS に置いている</li>
701 <li>LS の容量を圧迫しプログラムが動作しなくなる</li> 494 <li>LS の容量を圧迫しプログラムが動作しなくなる</li>
702 <li>すべてのデータを扱う包括的なデータ構造が必要</li> 495 <li>すべてのデータを扱う包括的なデータ構造が必要</li>
703 </ul> 496 </ul>