Mercurial > hg > Papers > 2011 > yutaka-sigos
diff presen/presen.html @ 14:06fe904e1951
fix
author | Yutaka_Kinjyo |
---|---|
date | Wed, 13 Apr 2011 17:26:26 +0900 |
parents | 083c7035b2cf |
children | 413e772d6cea |
line wrap: on
line diff
--- a/presen/presen.html Wed Apr 13 10:27:01 2011 +0900 +++ b/presen/presen.html Wed Apr 13 17:26:26 2011 +0900 @@ -93,67 +93,112 @@ <div class="slide"> <h1>概要</h1> -ゲームフレームワーク Cerium TaskManager を開発しました。 +ゲームフレームワーク Cerium TaskManager を開発した。 +<ul> + <li>琉球大学の学生実験で使用している</li> + <li>短期間でPS3/Cell上で並列処理されるゲーム開発が可能</li> +</ul> + +<p class="ex2">Ceriumの改良を行いOpenGLと比べ、2.9倍の性能向上を達成した(Cell上)</p> +<table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center"> +<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> +FPS(Frames Per Second) +</div> + +<div class="slide"> +<h1>概要</h1> + +Amdahlの法則より<br> + プログラム全体の並列化率が低ければ、マルチコアの性能を活かすことはできない。<br><br> + +<u>SPEの稼働率を落とさない為の改良点</u> <ul> - <li>動作環境:MacOSX, Linux, PS3/Cell</li> - <li>主にCellに特化している。</li> - <li>SceneGraphを用いて、ゲームを記述する</li> - + <li>PPEとSPE間の通信回数を削減、タイミングを変更</li> + <li>Taskのパイプライン化</li> + <li>テクスチャをSPE内でキャッシュ</li> </ul><br> -琉球大学の学生実験で使用している。 +以上の改良により、FPSが5〜10倍程度性能向上がありました + +<!--以上の改良により、OpenGL--> </div> + + <div class="slide"> -<h1>Cell</h1> -Cell Broadband Engine +<h1>概要</h1> + +Amdahlの法則より<br> + プログラム全体の並列化率が低ければ、マルチコアの性能を活かすことはできない。<br><br> + + +<u>SPEの稼働率を落とさない為の改良点</u> <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> + <li>PPEとSPE間の通信回数を削減、タイミングを変更</li> + <li>Taskのパイプライン化</li> + <li>テクスチャをSPE内でキャッシュ</li> </ul><br> +Ceriumの改良点を紹介していく。 + </div> <div class="slide"> -<h1>Cell</h1> +<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 のプログラミングスタイル +<img src="gazo/cell_arch.jpg" style="display:block; width:50%; float: right; margin-top:0%"> <ul> - <li>PPEがデータと仕事を分割し、各SPEへ割り当てる</li> + <li>ソニー・コンピュータエンタテインメント、ソニー、IBM , 東芝によって開発されたマルチコア CPU である</li> + <li>1個のPPEと8個のSPEがリングバスで構成されている</li> + <li>SPEは256KBのLocalStore(LS)を持つ</li> + <li>SPEからメインメモリへは直接アクセスできない</li> + <ul> + <li>SPEが持つMFC(Memroy Flow Controller)へDMA命令を送ることで行う</li> + </ul> </ul><br> -Ceriumでは関数をTaskとして定義。Taskを各SPEへ割り当てる。<br> -一つのTaskにはinput,output,param,等のデータを持たせる<br> - </div> <div class="slide"> +<h1>Cellの基本機能</h1> +<u>DMA</u> +<ul> +<li>メインメモリとLS間でデータが転送される</li> +</ul> +<u>Mailbox</u> +<ul> + <li>SPEのMFC内にあるFIFOキュー</li> + <li>PPEとSPE間で32bitメッセージの交換に用いられる</li> +</ul> +</div> + + +<div class="slide"> <h1>Ceriumの構成</h1> Ceriumの構成 +<img src="gazo/cerium.png" style="display:block; width:50%; float: right; margin-top:0%"> + <ul> <li>TaskManager</li> <ul> @@ -175,177 +220,34 @@ </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 +TaskManager は、Taskと呼ばれる分割された各プログラムを管理する。Task の単位 +はサブルーチンである。Task 同士の依存関係を考慮しながら実行していく。</p> +<p>Task を生成する際に、以下のような要素が設定可能である</p> <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>mail待ちに割合</th> -<th>SPE稼働率</th> -<!--<th>Mac(Core2Duo)</th>--> -</tr> -<tr align="center"> -<td>universe</td> -<td>17FPS</td> -<td>72.6%</td> -<td>25.4%</td> -</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> +<li><b>input data, output data, parameter</b><br> + これらは関数でいうところの引数に価する</li> +<li><b>cpu type</b><br> + Task を PPE または SPE のどちらで実行するのかを示している</li> +<li><b>dependency</b></li> + 他の Task との依存関係を示している +</li> </ul> </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>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>RenderingEngineの構成</h1> RenderingEngineの構成 + +<img src="gazo/renderingengine1.png" style="display:block; width:40%; float: right; margin-top:0%"> + <ul> <li>CreatePolygon</li> <ul> @@ -361,10 +263,80 @@ </ul> </ul><br> -RenderingEngineは3種類のTaskから構成されている +</div> + + +<div class="slide"> +<h1>改良前RenderingEngine</h1> + +<img src="gazo/universe.png" style="display:block; width:50%; float: right; margin-top:0%"> + +<u>改良前のRenderingEngineの例題</u><br> +地球と月の例題 + +<table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center"> +<tr> +<th></th> +<th>FPS</th> +<th>mail待ちの割合</th> +<th>SPE稼働率</th> +<!--<th>Mac(Core2Duo)</th>--> +</tr> +<tr align="center"> +<td>universe</td> +<td>17FPS</td> +<td>53.6%</td> +<td>45.4%</td> +</tr> +</table><br> + +処理全体の45%時間がmail待ちになっている. </div> +<div class="slide"> +<h1>Mail待ちについて</h1> + +<u>mail待ちが起こるタイミング</u> + +<ul> + <li>SPEが次のTaskのリストを待つとき</li> + <ul> + <li>Taskのパイプライン化で削減</li> + </ul> + <li>SPEがTaskの完了を書きこむとき</li> + <ul> + <li>MailQueueで削減</li> + <li>TaskArrayで削減</li> + </ul> +</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>バリア同期</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> @@ -452,8 +424,6 @@ </div> - - <div class="slide"> <h1>SPEのキャッシュ効果</h1> @@ -540,63 +510,6 @@ </div> - -<div class="slide"> -<h1>Mailbox機能</h1> -CellのMailbox機能<br> - -<ul> - <li>PPEとSPEとの間を双方向で32bitのデータを受け渡す</li> - <li>FIFO キュー構造</li> -</ul><br> -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> @@ -619,33 +532,6 @@ 地球と月を表示する例題を使って計測した。 </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> @@ -754,69 +640,7 @@ </div> -<div class="slide"> -<h1>まとめ</h1> -本研究ではゲームフレームワーク Cerium TaskManager の改良を行った。 -特にCell上において、SPEの稼働率に注意する必要があった。 - -SPE、PPE間のデータのやり取りにMail通知を用いている。SPEはMailの書き込みの際に待ちが発生する - -<ul> - <li>MailQueue</li> - <li>TaskArray</li> -</ul><br> - -で待ち時間の削減ができる - -</div> - -<div class="slide"> -<h1>まとめ</h1> - -RenderingEngineにおいて、Taskがバリア同期をしている。バリア同期にも待ちが発生する - -<ul> - <li>Task実行をパイプライン化</li> -</ul><br> - -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>