view presen/presen.html @ 20:f295152e8335 default tip

fix
author Yutaka_Kinjyo
date Thu, 14 Apr 2011 14:15:00 +0900
parents ce993bc15d84
children
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.ex08 { font-size: 0.8em; }
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><p class="ex08">琉球大学の学生実験で使用している</p></li>
  <li><p class="ex08">短期間でMacOSX,linux,<font color="red">PS3/Cell</font>上で動作ゲーム開発が可能</p></li>
</ul>

<u>Ceriumの改良を行い改良前と比べ、8倍の性能向上を達成した</u>
<table border="1" cellspacing="0" cellspacing="2" cellpadding="5" align="center">
<tr>
<th>例題</th>
<th>改良前</th>
<th>改良後</th>
<th>性能差</th>
</tr>
<tr align="center">
<td>ball bound</td>
<td>4.4FPS</td>
<td>37.7FPS</td>
<td>約8倍</td>
</tr>
</table>
FPS(Frames Per Second)
</div>

<div class="slide">
<h1>概要</h1>

Amdahlの法則より<br>

<img src="gazo/amdahl.jpg" style="display:block; width:60%; float: left; margin-top:0%">

 <font size="5">プログラム全体の並列化率が低ければ、マルチコアの性能を活かすことはできない。並列化率が80%から100%になる間に性能は3倍向上する(6コアの場合)</font><br><br>



<!--以上の改良により、OpenGL-->

</div>


<div class="slide">
<h1>概要</h1>

 <u>改良のまとめ(ball_bound)</u><br>
<img src="gazo/result.png" style="display:block; width:60%; float: left; margin-top:0%">

<u><font size="5">SPEの稼働率を落とさない為の改良点</font></u><br>

<font size="5">PPEとSPE間の通信回数を削減、タイミングを変更。</font>
<font size="5">Taskのパイプライン化。</font>
<font size="5">テクスチャをSPE内でキャッシュ。</font><br>

<font size="5">以上の改良により、FPSが8倍程度性能向上があった</font>

</table>
</div>


<div class="slide">
<h1>Cellの構成</h1>
<u>Cell Broadband Engine</u>

<img src="gazo/cell_arch.jpg" style="display:block; width:60%; float: right; margin-top:0%">

<ul>

  <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>


</div>

<div class="slide">
<h1>Cellの基本機能</h1>
<u>DMA</u>
<ul>
<li>メインメモリとLS間でデータが転送される</li>
<li>転送されるデータは16アラインメントでないといけない</li>
<li>転送されるデータは16の倍数の大きさでないといけない</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>
    <li><font size="4">ユーザが定義したTaskを管理し、各コアに割り当てる</font></li>
  </ul>

  <li>RenderingEngine</li>
  <ul>
    <li><font size="4">オブジェクトを画面に描画する</font></li>
    <li><font size="4">3種類のTaskから構成される</font></li>
  </ul>

  <li>SceneGraph</li>
  <ul>
    <li><font size="4">ゲームのシーンを作成し、それを切り替えながらゲームを進行する</font></li>
    <li><font size="4">OpenSceneGraphのようなもの</font></li>
  </ul>

</ul><br>

</div>

<div class="slide">
<h1>TaskManager</h1>

TaskManager は、Taskと呼ばれる分割された各プログラムを管理する。Task の単位
はサブルーチンである。Task 同士の依存関係を考慮しながら実行していく。</p>
<p>Task を生成する際に、以下のような要素が設定可能である</p>

<ul>
<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>
RenderingEngineの構成

<img src="gazo/renderingengine1.png" style="display:block; width:40%; float: right; margin-top:0%">

<ul>
  <li>CreatePolygon</li>
  <ul>
    <li>モデリングデータからポリゴンを生成する(PPE)</li>
  </ul>
  <li>CreateSpan</li>
  <ul>
    <li>ポリゴンをSpanと呼ばれる水平な線に分ける(SPE)</li>
    </ul>
  <li>DrawSpan</li>
  <ul>
    <li>Spanを実際にディスプレイに描画する(SPE)</li>
  </ul>
</ul><br>

</div>

<div class="slide">

<h1>RenderingEngineの例題</h1>
ボールが跳ねる例題 : ball bound<br>
<img src="gazo/ballbound.png" style="width:50%;">

</div>


<div class="slide">
<h1>改良前RenderingEngine</h1>
<u>改良前のRenderingEngine例題</u><br>

<p class="ex08">解像度 1920x1080</p>

<table border="1" cellspacing="0" cellspacing="2" cellpadding="1" align="center">
<tr>
<th></th>
<th>FPS</th>
<th>DMA転送待ち</th>
<th>mail待ち</th>
<th>SPE稼働率</th>
<!--<th>Mac(Core2Duo)</th>-->
</tr>
<tr align="center">
<td>ball_bound</td>
<td>4.4FPS</td>
<td>0.4%</td>
<td>53.4%</td>
<td>46.2%</td>
</tr>
</table>

<p class="ex08"><u>アムダール則からmail待ちの時間を解消しないと性能は上がらない</u></p>
<font size="5.0em">SPEの稼働率を向上させる改良点を紹介していく</font><br>
 <font size="5">・テクスチャをSPE内でキャッシュする</font><br>
 <font size="5">・Mailの数の削除、タイミングを変更</font><br>
 <font size="5">・RenderingTaskのパイプライン化</font>


</div>

<div class="slide">
<h1>SPEキャッシュの効果</h1>

<u>SPE内キャッシュの目的</u>

<ul>
  <li>SPEで、画面にオブジェクトを描画する場合にテクスチャが必要</li>
  <li>すべてのテクスチャをSPEのLS内には置けない</li>
  <li>テクスチャを細かく分割し、必要な部分を必要な時にロードする</li>
</ul><br>

頻繁に扱うテクスチャはキャッシュしたほうが、DMAロードする時間が省けるはず.という事で
SPE内にテクスチャのキャッシュを用意した

</div>



<div class="slide">
<h1>キャッシュ効果訂正(1/2)</h1>

もともとSPE内のキャッシュにHITしないバグがあった<br>
そこを発見修正し、「キャッシュなし」の場合と比較した表<br>

<table border="1" cellspacing="0" cellspacing="1" cellpadding="1" align="center">
<caption>SPEのキャッシュの効果(ball_bound)</caption>

<th>キャッシュ</th>
<th>FPS</th>
<th>DMA転送待ちの割合</th>
<th>mail待ちの割合</th>
<th>SPE稼働率</th>
<!--<th>Mac(Core2Duo)</th>-->
</tr>

<tr align="center">
<td>無(<font color="red">誤</font>)</td>
<td><font color="red">4.4FPS</font></td>
<td><font color="red">0.4%</font></td>
<td><font color="red">53.4%</font></td>
<td><font color="red">46.2%</font></td>
</tr>

<tr align="center">
<td>有</td>
<td>30FPS</td>
<td>3%</td>
<td>80%</td>
<td>17%</td>
</tr>

</table><br>

<u>キャッシュの処理を無効にしきれてなかった.</u>キャッシュにHITはしないが
キャッシュ操作は行われていた.

</div>


<div class="slide">
<h1>キャッシュ効果訂正(2/2)</h1>

<table border="1" cellspacing="0" cellspacing="1" cellpadding="1" align="center">
<caption>正しいSPEのキャッシュの効果(ball_bound)</caption>


<th>キャッシュ</th>
<th>FPS</th>
<th>DMA転送待ちの割合</th>
<th>mail待ちの割合</th>
<th>SPE稼働率</th>
<!--<th>Mac(Core2Duo)</th>-->
</tr>

<tr align="center">
<td>無(<font color="red">誤</font>)</td>
<td>4.4FPS</td>
<td>0.4%</td>
<td>53.4%</td>
<td>46.2%</td>
</tr>

<tr align="center">
<td><font color="red">無</font></td>
<td><font color="red">28FPS</font></td>
<td><font color="red">6.5%</font></td>
<td><font color="red">79%</font></td>
<td><font color="red">14.5%</font></td>
</tr>

<tr align="center">
<td><font color="red">有</font></td>
<td><font color="red">30FPS</font></td>
<td><font color="red">3%</font></td>
<td><font color="red">80%</font></td>
<td><font color="red">17%</font></td>
</tr>

</table>

・キャッシュの操作は 1Fream で8000回x100で、重い処理となっていると考えられる<br>
・キャッシュがきちんとHITすれば、キャッシュの効果はある<br>
<!--・テクスチャが十分に小さいとキャッシュに収まる(ball_bound)<br>
・キャッシュ入れ替えが頻繁に起こる場合に操作の方が時間がかかる(panel)<br>-->

</div>

<div class="slide">
<h1>TaskArray</h1>

<u>SPEとPPEの間のやり取りは、Mailを用いている </u>

<ul>
  <li>依存関係解決のためTaskが完了するとSPEからPPEにMailが通知される</li>
  <!--<li>依存関係を解決し、TaskListのMailがPPEから返される</li>-->
<li>依存関係を解決したのち、次のTaskのListがPPEからMailで通知</li>
  <li>Mailが多い、PPEが自分のTaskで忙しい場合に返信が遅れる場合があると考える</li>
  <li>SPEのMail待ちの時間が増える</li>
</ul>

<font size="5.0em">依存関係はグループ化できる</font><br>
<font size="5.0em" color="red">複数のTaskのMailを一つにするTaskArrayを実装した.</font><br>


</div>


<div class="slide">
<h1>TaskArray</h1>

TaskArrayの効果を表に示す<br>

<table border="1" cellspacing="0" cellspacing="2" cellpadding="1" align="center">
<caption>TaskArrayの効果(ball bound)</caption>

<th>キャッシュ</th>
<th>FPS</th>
<th>DMA転送待ちの割合</th>
<th>mail待ちの割合</th>
<th>SPE稼働率</th>
<!--<th>Mac(Core2Duo)</th>-->
</tr>

<tr align="center">
<td>改良前</td>
<td>30FPS</td>
<td>3%</td>
<td>80%</td>
<td>17%</td>
</tr>

<tr align="center">
<td><font color="red">改良後</font></td>
<td><font color="red">35.5FPS</font></td>
<td><font color="red">3%</font></td>
<td><font color="red">70%</font></td>
<td><font color="red">27%</font></td>
</tr>

</table>
<font size="5.0em">Task毎のリプライMailが減り、PPEの応答スピードが向上させる目的</font>
<font size="5.0em">5FPSの向上がみられ、10%mail待ちが減少した</font>
</div>

<div class="slide">
<h1>MailQueueの効果</h1>

<u>SPEとPPEの間のやり取りは、Mailを用いている </u>

<ul>
  <li>SPEからのMail書き込みキューはサイズが1</li>
  <li>すでに書きこまれている場合は、PPE側が読み込むまでSPEは待つ</li>
  <li>その間SPEは止まってしまう(mail待ち)</li>
</ul><br>

<font color="red">ソフト的に別な書き込みキュー(MailQueue)を実装した。</font>
ハードなキューに書き込めない場合にmailQueueへ書きこむ。書き込みスロットが1から
複数になった


</div>

<div class="slide">
<h1>MailQueueの効果</h1>

<table border="1" cellspacing="0" cellspacing="2" cellpadding="1" align="center">
<caption>MailQueueの効果(ball bound)</caption>
<tr>
<th>MailQueue</th>
<th>FPS</th>
<th>dma待ち</th>
<th>mail待ち</th>
<th>稼働率</th>
</tr>
<tr align="center">
<td>なし</td>
<td>35.5FPS</td>
<td>3%</tb>
<td>69%</tb>
<td>27%</tb>
</tr>

<tr align="center">
<td>あり</td>
<td><font color="red">35.7FPS</font></td>
<td>3%</tb>
<td>69%</tb>
<td>27%</tb>
</tr>

</table>

Mail書き込みのタイミングをずらせる。Taskが足りなくなった時点で溜まった分の精算する
が結果的にあまり効果がないのは、精算する際に同じぐらい待ちは発生すると考える<br>
今後mail待ちの細かい内訳が必要<br>

</div>

<div class="slide">
<h1>パイプライン化の効果</h1>

RenderingEngineの3つのTaskはバリア同期を行い、逐次的に実行されていた。<br>
<u>そこで、DrawSpanTaskほ他の二つと並列に実行されるように改良した</u>

<img src="gazo/rend-dep.bmp" style="display:block; width:40%; float: right; margin-top:0%">

<ul>
  <li>DrawSpanが他の二つのTaskに比べて重い処理なので、他の二つのTaskが十分に隠れる</li>
  <li>あまり多段にするとキーの入力が遅延しすぎる</li>
</ul>

</div>



<div class="slide">
<h1>パイプライン化の比較</h1>

<table border="1" cellspacing="0" cellspacing="2" cellpadding="10" align="center">
<caption>パイプライン化の効果(universe)</caption>
<tr>
<th>Pipeline化</th>
<th>FPS</th>
<th>dma待ち</th>
<th>mail待ち</th>
<th>稼働率</th>
</tr>

<tr align="center">
<td>なし</td>
<td>35.7FPS</td>
<td>3%</tb>
<td>69%</tb>
<td>27%</tb>
</tr>

<tr align="center">
<td><font color="red">あり</font></td>
<td><font color="red">37.7FPS</font></td>
<td><font color="red">2%</font></tb>
<td><font color="red">66%</font></tb>
<td><font color="red">31%</font></tb>
</tr>

</table>

mail待ちが3%減少、FPSが2向上した。
DrawTaskに他のRenderinTaskが隠れたと考えられる。<br>


</div>

<div class="slide">
<h1>改良のまとめ</h1>

 <u>これまでの改良のまとめ(ball_bound)</u><br>
<img src="gazo/result.png" style="display:block; width:70%; float: left; margin-top:0%">
最終的にSPEの稼働率は14%削減できた。FPSは8倍に向上。


</table>
</div>



<div class="slide">
<h1>OpenGLとの比較</h1>
OpenGL(Open Graphics Library)とは、Silicon Graphics社が開発した、3Dグラフィックス処理の
ためのプログラミングインターフェース。PPEのみで動作するOpenGLと処理速度の比較をした。<br>
比較する例題には学生が実験中に作成したSuperDandyを用いた。

<img src="gazo/dandy.png" style="display:block; width:40%; float: center; margin-top:0%">

</div>

<div class="slide">
<h1>OpenGLとの比較</h1>

<table border="1" cellspacing="0" cellspacing="2" cellpadding="10" 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>

コア一つを使用するOpenGLに比べ、Cerium では2.9倍の性能向上が見られた。
SPEを活用、待ち時間の短縮を行い、性能向上がみれた。

</div>


<div class="slide">
<h1>今後の課題</h1>

<u>処理全体の並列化率の向上</u><br>

<font size="5">以下の部分をSPE実行し、並列化率を向上させる</font>


<ul>
  <li>CreatePolygonTask</li>
  <li>ゲーム操作部分(SceneGraph)</li>
</ul>

<u>それにはCode Loadが必要(実装済み、まだ使ってない)</u>

<ul>
  <li>SPEで必要なコードはすべて事前にSPEに読み込んでいる</li>
  <li>LSは256KBしかないので、オンデマンドロードで対応</li>
</ul>

<u>さらに細かいプロファイリング(ex.mail待ちに細かい内訳)</u>

</div>




</ul>

<div class="handout">
[any material that should appear in print but not on the slide]
</div>
</div>


</div>

</body>
</html>