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>