Mercurial > hg > Papers > 2011 > yutaka-sigos
view presen/presen.html @ 12:e6a78ee8fb13
fix
author | Yutaka_Kinjyo |
---|---|
date | Tue, 12 Apr 2011 17:13:21 +0900 |
parents | |
children | 083c7035b2cf |
line wrap: on
line source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> <head> <title>発表資料</title> <!-- metadata --> <meta name="generator" content="S5" /> <meta name="version" content="S5 1.1" /> <meta name="presdate" content="20050728" /> <meta name="author" content="Eric A. Meyer" /> <meta name="company" content="Complex Spiral Consulting" /> <!-- configuration parameters --> <meta name="defaultView" content="slideshow" /> <meta name="controlVis" content="hidden" /> <!-- style sheet links --> <link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projection" id="slideProj" /> <link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" /> <link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" /> <link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" /> <!-- S5 JS --> <script src="ui/default/slides.js" type="text/javascript"></script> <style type="text/css"> body { font-size: 100%; } p.ex10 { font-size: 2.0em; } p.ex9 { font-size: 1.9em; } p.ex8 { font-size: 1.8em; } p.ex7 { font-size: 1.7em; } p.ex6 { font-size: 1.6em; } p.ex5 { font-size: 1.5em; } p.ex4 { font-size: 1.4em; } p.ex3 { font-size: 1.3em; } p.ex2 { font-size: 1.2em; } p.ex1 { font-size: 1.1em; } p.ex0 { font-size: 1.0em; } p.ex05 { font-size: 0.5em; } span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } </style> </head> <body> <div class="layout"> <div id="controls"><!-- DO NOT EDIT --></div> <div id="currentSlide"><!-- DO NOT EDIT --></div> <div id="header"></div> <div id="footer"> <!--<h1>Cell上のソフトウェアレンダリングの高速化と高機能化</h1> <h2>琉球大学工学部情報工学科並列信頼研</h2>--> </div> </div> <div class="presentation"> <div class="slide"> <h1>ゲームフレームワーク Cerium TaskManager の改良</h1> <h3>金城 裕, 河野 真治, <br>多賀野 海人, 小林 佑亮</h3> <h4>琉球大学大学院理工学研究科情報工学専攻並列信頼研</h4> </div> <div class="slide"> <h1>概要</h1> ゲームフレームワーク Cerium TaskManager を開発しました。 <ul> <li>動作環境:MacOSX, Linux, PS3/Cell</li> <li>主にCellに特化している。</li> <li>SceneGraphを用いて、ゲームを記述する</li> </ul><br> 琉球大学の学生実験で使用している。 </div> <div class="slide"> <h1>Cell</h1> Cell Broadband Engine <ul> <li>ソニー・コンピュータエンタテインメント、ソニー、IBM , 東芝によって開発されたマルチコア CPU である</li> <li>1基の制御系プロセッサコアPPE(PowerPC Processor Element)</li> <li>8基の演算系プロセッサコアSPE(Synergistic Processor Element)</li> <li>各コアはEIB(Element Interconnect Bus)とうバスで接続されている</li> </ul><br> </div> <div class="slide"> <h1>Cell</h1> Cell Broadband Engine <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/cell_arch.jpg" style="width: 50%%"></td></tr> </table> PPEは直接メインメモリアクセスできるが、SPEはそれぞれのLSにしかアクセスできない<br> DMA転送を用いてメインメモリからのデータを明示的に取得する </div> <div class="slide"> <h1>Cell</h1> Cell のプログラミングスタイル <ul> <li>PPEがデータと仕事を分割し、各SPEへ割り当てる</li> </ul><br> Ceriumでは関数をTaskとして定義。Taskを各SPEへ割り当てる。<br> 一つのTaskにはinput,output,param,等のデータを持たせる<br> </div> <div class="slide"> <h1>Ceriumの構成</h1> Ceriumの構成 <ul> <li>TaskManager</li> <ul> <li>ユーザが定義したTaskを管理し、各コアに割り当てる</li> </ul> <li>RenderingEngine</li> <ul> <li>オブジェクトを画面に描画する</li> <li>3種類のTaskから構成される</li> </ul> <li>SceneGraph</li> <ul> <li>ゲームのルールを記述してく</li> <li>ゲームのシーンを作成し、それを切り替えながらゲームを進行する</li> <li>OpenSceneGraphのようなもの</li> </ul> </ul><br> </div> <div class="slide"> <h1>Ceriumの構成</h1> <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/cerium.png" style="width: 50%%"></td></tr> </table> </div> <div class="slide"> <h1>TaskManager</h1> TaskManager <ul> <li>Taskは関数単位</li> <li>定義されたTaskは依存関係に沿って実行される</li> <li>Taskはある程度の数が揃った上で、TaskListにまとめられSPEに送られる。</li> <li>Taskはread,exec,write それぞれパイプライン化されて動く</li> <li>Taskに必要なデータはDMA転送で送られる。転送時間はパイプライン化によって隠される</li> <li>Taskの中にDMA転送命令を書くと自動ではパイプライン化されない</li> </ul> </div> <div class="slide"> <h1>TaskMangerを使った例題</h1> CeriumのTaskManager を使ったSortの例題<br> 10万個のランダムな値をクイックソートでソートする<br> ソートする関数をTaskにして各SPEで実行<br><br> <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <caption>Sortの例題</caption> <tr> <th></th> <th>PPEのみ</th> <th>SPE 1つ</th> <th>SPE 6つ</th> <!--<th>Mac(Core2Duo)</th>--> <th>SPE稼働率</th> </tr> <tr align="center"> <td>QuickSort</td> <td>5.60s</td> <td>6.22s</td> <td>1.07s</td> <td>97%</td> <!--<td>1.76s</td>--> </tr> </table> <!-- 2.13GHz --> </div> <div class="slide"> <h1>アムダール則</h1> プログラムの全体に対する並列化した部分の割合が低いと、マルチコアの性能がでない <!--プログラムの8割を並列化すると、6CPUでは3倍の性能向上しか得られない--> <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/amdahl.jpg" style="width: 55%%"></td></tr> </table> </div> <div class="slide"> <h1>RenderingEngine</h1> RenderingEngineの例題<br> 月と <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <tr> <th></th> <th>FPS</th> <th>稼働率</th> <!--<th>Mac(Core2Duo)</th>--> <th>SPE稼働率</th> </tr> <tr align="center"> <td>universe</td> <td>17FPS</td> <td>25.4%</td> <!--<td>1.76s</td>29%--> </tr> </table> </div> <div class="slide"> <h1>RenderingEngine</h1> SortとRenderingEngineの違い <ul> <li>三種類のTaskから構成されている</li> <li>三つのTaskはバリア同期を行っている</li> <li>すべてのTaskは一度に作られない</li> <li>PPEにもTaskが割り振られている</li> <li>大量のデータを扱う(ポリゴン、テクスチャ)</li> </ul> </div> <div class="slide"> <h1>RenderingEngineの構成</h1> RenderingEngineの構成 <ul> <li>CreatePolygon</li> <ul> <li>モデリングデータからポリゴンを生成する</li> </ul> <li>CreateSpan</li> <ul> <li>ポリゴンをSpanと呼ばれる水平な線に分ける</li> </ul> <li>DrawSpan</li> <ul> <li>Spanを実際にディスプレイに描画する</li> </ul> </ul><br> RenderingEngineは3種類のTaskから構成されている </div> <div class="slide"> <h1>RenderingEngine</h1> RenderingEngienの場合の問題点 <ul> <li>SPEの待ちが入る(SPEの稼働率の低下、処理性能の低下)</li> <ul> <li>MailをPPEが読み込みのを待つ</li> <li>他のSPEを待つ</li> <li>次のTaskListを待つ</li> </ul> <li>PPE側でTaskを生成、各SPEに割り振る</li> <li>Taskはバリア同期している</li> </ul> </div> <div class="slide"> <h1>バリア同期</h1> <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/renderingengine1.png" style="width: 35%%"></td></tr> </table> RenderingEngineのTaskは、3つそれぞれバリア同期をしている。 </div> <div class="slide"> <h1>バリア同期</h1> バリア同期には二つの待ちがある <ul> <li>SPEが他のSPEを待つ時間</li> <li>バリア同期が完了し、PPE側で次のTaskが作られる時間</li> </ul><br> </div> <div class="slide"> <h1>バリア同期</h1> <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/renderingengine2.png" style="width: 45%%"></td></tr> </table> この待ちを解消するためにTaskのパイプライン化を行った。 </div> <div class="slide"> <h1>Ceriumの改良点の概要</h1> Ceriumの改良点の概要 <ul> <li>TaskManager</li> <ul> <li>Taskの同期にはCellのMail機能を使う</li> <li>Mailの同期するタイミングの改良</li> <ul> <li>MailQueue</li> <li>TaskArray</li> </ul> </ul> <li>RenderingEngine</li> <ul> <li>Taskのパイプライン化</li> <li>扱う画像をSPE側でキャッシュする</li> </ul> </ul> </div> <div class="slide"> <h1>Mailbox機能</h1> CellのMailbox機能<br> <ul> <li>PPEとSPEとの間を双方向で32bitのデータを受け渡す</li> <li>FIFO キュー構造</li> </ul> Mailboxの種類 <ul> <li>Inbount Mailbox(PPE->SPE 4つ)</li> <li>Outbount Mailbox(SPE->PPE 一つ)</li> <li>Outbount interrupt Mailbox(SPE->PPE 一つ)</li> </ul> </div> <div class="slide"> <h1>Mailbox機能</h1> <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/mailbox.png" style="width: 60%%"></td></tr> </table> </div> <div class="slide"> <h1>Mailbox機能</h1> SPE側からTaskが一つ実行完了する度に、実行完了のMailをOutboxに書きこむ<br> <ul> <li>Outboxに既にMailが書きこまれている場合に、PPE側から読み込まれるまで、SPEは待つ(Cellの仕様)</li> <li>PPE側のMailチェックが追いつかない場合がある。</li> <li>その間、SPEは何もしないので、処理速度の低下につながる</li> </ul><br> そこで、Outboxに既に読み込まれていないMailがあった場合に、いったん、別のキューに追加する。(MailQueue) </div> <div class="slide"> <h1>MailQueue</h1> <ul> <li>TaskListを消化し、次のTaskListを要求する時に、MailQueueにMailが残っている場合はそれを先に書きだす</li> <li>PPE側はMailのチェックをMailが無くなるまでループする</li> <li>PPEはMailがない場合に、自分の仕事に戻る。</li> <li>今のPPEのMailチェックの仕様には、一度にMailを書きだすのが向いている</li> </ul> </ul> </div> <div class="slide"> <h1>MailQueueの効果</h1> <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <caption>MailQueueの効果</caption> <tr> <th></th> <th>改良前</th> <th>改良後</th> <th>性能</th> </tr> <tr align="center"> <td>universe</td> <td>16FPS</td> <td>18.5FPS</td> <td>12%向上</td> </tr> </table> 地球と月を表示する例題を使って計測した。 </div> <div class="slide"> <h1>Ceriumの改良点の概要</h1> Ceriumの改良点の概要 <ul> <li>TaskManager</li> <ul> <li>Taskの同期にはCellのMail機能を使う</li> <li>Mailの同期するタイミングの改良</li> <ul> <li><s>MailQueue</s></li> <li>TaskArray</li> </ul> </ul> <li>RenderingEngine</li> <ul> <li>Taskのパイプライン化</li> <li>扱う画像をSPE側でキャッシュする</li> </ul> </ul> </div> <div class="slide"> <h1>TaskArray</h1> Task毎のMailは、Task同士の依存関係を解決するために用いている。 <ul> <li>依存関係はグループ化できる</li> <li>TaskArrayを用いて複数のTaskのMailを一つに扱う</li> </ul> Mailの数を減らせるので、Mailのための処理が減る。その分処理速度が上がる </div> <div class="slide"> <h1>TaskArray</h1> <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <caption>TaskArrayの効果(universe)</caption> <tr> <th></th> <th>改良前</th> <th>改良後</th> <th>性能</th> </tr> <tr align="center"> <td>universe</td> <td>16FPS</td> <td>18.5FPS</td> <td>12%向上</td> </tr> </table> </div> <div class="slide"> <h1>MailQueueとTaskArray</h1> <table border="1" cellspacing="0" cellspacing="2" cellpadding="8" align="center"> <caption>MailQueueとTaskArrayの効果(universe)</caption> <tr> <th>TaskArray</th> <th>MailQueue</th> <th>FPS</th> <th>性能</th> </tr> <tr align="center"> <td>あり</td> <td>あり</td> <td>20FPS</td> <td>22%向上</td> </tr> <tr align="center"> <td>あり</td> <td>なし</td> <td>18.5FPS</td> <td>12%向上</td> </tr> <tr align="center"> <td>なし</td> <td>あり</td> <td>18.5FPS</td> <td>12%向上</td> </tr> <tr align="center"> <td>なし</td> <td>なし</td> <td>16.4FPS</td> <td>0%向上</td> </tr> </table> </div> <div class="slide"> <h1>Ceriumの改良点の概要</h1> Ceriumの改良点の概要 <ul> <li>TaskManager</li> <ul> <li>Taskの同期にはCellのMailbox機能を使う</li> <li>Mailの同期するタイミングの改良</li> <ul> <li><s>MailQueue</s></li> <li><s>TaskArray</s></li> </ul> </ul> <li>RenderingEngine</li> <ul> <li>Taskのパイプライン化</li> <li>扱う画像をSPE側でキャッシュする</li> </ul> </ul> </div> <div class="slide"> <h1>パイプライン化</h1> <table height="100%" width="100%" border="0"> <tr><td align="center" valign="middle"> <img src="gazo/renderingengine4.png" style="width: 40%%"></td></tr> </table> あまり、多段にするとゲームのキー入力の反映が遅れる。DrawSpanの処理が他の二つに比べて重いので DrawSpanとパイプラインを組むことで十分に隠れる </div> <div class="slide"> <h1>パイプライン化の比較</h1> 例題:<br> PS3上で学生実験で学生が作成したシューティングゲーム SuperDandy を用いる。 </div> <div class="slide"> <h1>パイプライン化の比較</h1> <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <caption>パイプライン化の効果(dandy)</caption> <tr> <th></th> <th>改良前</th> <th>改良後</th> <th>性能</th> </tr> <tr align="center"> <td>dandy</td> <td>11.5FPS</td> <td>16.6FPS</td> <td>44%向上</td> </tr> </table> 44%の向上がみられた。 </div> <div class="slide"> <h1>Ceriumの改良点の概要</h1> Ceriumの改良点の概要 <ul> <li>TaskManager</li> <ul> <li>Taskの同期にはCellのMailbox機能を使う</li> <li>Mailの同期するタイミングの改良</li> <ul> <li><s>MailQueue</s></li> <li><s>TaskArray</s></li> </ul> </ul> <li>RenderingEngine</li> <ul> <li><s>Taskのパイプライン化</s></li> <li>扱う画像をSPE側でキャッシュする</li> </ul> </ul> </div> <div class="slide"> <h1>SPEのキャッシュ効果</h1> SPE内でのキャッシュ <ul> <li>DrawSpan内で、描画するためのテクスチャデータを読み込む。</li> <li>テクスチャは分割さていて、必要な時に必要な部分を読み込む</li> <li>そこで、テクスチャをキャッシュするようにした(LRU)</li> <li>テクスチャのデータはハッシュで管理する</li> </ul> </div> <div class="slide"> <h1>SPEのキャッシュ効果</h1> <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <caption>SPEのキャッシュの効果(universe)</caption> <tr> <th></th> <th>改良前</th> <th>改良後</th> <th>性能</th> </tr> <tr align="center"> <td>ball_bound</td> <td>4FPS</td> <td>30FPS</td> <td>7.5倍</td> </tr> <tr align="center"> <td>panel</td> <td>0.2FPS</td> <td>2.6FPS</td> <td>13倍</td> </tr> </table> テクスチャは頻繁に読み込みが行われるので、キャッシュは非常に有効だった。 Span一つに対して、分割されたテクスチャが複数必要。 Spanの数は、1920x1080 の解像度で、最低でも8000ほどのテクスチャ読み込みが起こる。 </div> <div class="slide"> <h1>SPEのキャッシュ効果</h1> 実は改良前の計測にバグが。キャッシュを無効にした場合にキャッシュがHITしない動作 </div> <div class="slide"> <h1>OpenGLとの比較</h1> OpenGL(Open Graphics Library)とは、Silicon Graphics社が開発した、3Dグラフィックス処理の ためのプログラミングインターフェース。Taskに分割され、SPEを使用したCeriumと、PPEのみで動作 するOpenGLとで、処理速度の比較をした。例題は先ほど紹介したSuperDandyを用いた。 </div> <div class="slide"> <h1>OpenGLとの比較</h1> <table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> <caption>パイプライン化の効果(universe)</caption> <tr> <th></th> <th>OpenGL</th> <th>Cerium</th> <th>性能差</th> </tr> <tr align="center"> <td>dandy</td> <td>17.5FPS</td> <td>49.5FPS</td> <td>2.9倍</td> </tr> </table> コア一つを使用するOpenGLに比べ、Cerium では2.9倍の性能向上が見られた。 SPEを活用、待ち時間の短縮を行い、性能向上がみれた。 </div> <div class="slide"> <h1>まとめ</h1> 本研究ではゲームフレームワーク Cerium TaskManager の改良を行った。 特にCell上において、SPEの稼働率に注意する必要があった。 SPE、PPE間のデータのやり取りにMail通知を用いている。SPEはMailの書き込みの際に待ちが発生する <ul> <li>MailQueue</li> <li>TaskArray</li> </ul> で待ち時間の削減ができる </div> <div class="slide"> <h1>まとめ</h1> RenderingEngineにおいて、Taskがバリア同期をしている。バリア同期にも待ちが発生する <ul> <li>Task実行をパイプライン化</li> </ul> SPEの待ち時間を解消できる。頻繁に扱うデータはSPE内でキャッシュするのがよい </div> <div class="slide"> <h1>依存関係の話</h1> 稼働率を維持するためにパイプライン化がある <ul> <li>扱うデータの依存性から、Pipelineを自動で生成できるはず</li> <li>TaskArrayもデータから自動でできるはず。</li> <li>データはSegmentとして扱う</li> </ui> </div> <div class="slide"> <h1>Codeload</h1> Taskを事前に全部ロードしてる <ul> <li>SPEのLSは256KB</li> <li>大量のコードを入れるといっぱいになる</li> <li>必要な時に必要な分を予測してSPEにロードするのがよい</li> </ul> </div> <div class="slide"> <h1>Segment</h1> データはすべてSegmentという形にして、SPEに必要な分を予測、読み込みするのがよい。<br> テクスチャのように頻繁に扱うデータはキャッシュする<br> </div> <div class="slide"> <h1>END</h1> /*end*/ </div> </ul> <div class="handout"> [any material that should appear in print but not on the slide] </div> </div> </div> </body> </html>