Mercurial > hg > Events > OSC2009
changeset 10:2ee81742a961 default tip
presetation
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 26 Sep 2009 17:03:53 +0900 |
parents | c161dcb3d43f |
children | |
files | presen/osc2009.html presen/osc2009.ind |
diffstat | 2 files changed, 404 insertions(+), 531 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/osc2009.html Sat Sep 26 13:48:55 2009 +0900 +++ b/presen/osc2009.html Sat Sep 26 17:03:53 2009 +0900 @@ -1,556 +1,425 @@ <html> -<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> +<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> +<!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"> + <head> <title>2009-09-26 (土) Cerium を用いた PS3 でのゲームの作り方</title> +<!-- metadata --> +<meta name="generator" content="S5" /> +<meta name="version" content="S5 1.2a2" /> +<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="projec +tion" id="slideProj" /> +<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="scree +n" 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="project +ion" id="operaFix" /> +<!-- S5 JS --> +<script src="ui/default/slides.js" type="text/javascript"></script> </head> <body> -<h1>2009-09-26 (土) Cerium を用いた PS3 でのゲームの作り方</h1> -<a href=#content>content</a><br> -<nr> - -<p> - -<hr> -<h2><a name="content000">Linux 上でのゲームフレームワーク</a></h2> - -<pre> - Cerium Task Manager - Blender / SceneGraph - -</pre> - -<hr> -<h2><a name="content001">Cell ってどうなの?</a></h2> - -<p> - -<pre> - 結局、Video Chip に触れない - SPUでレンダリング - ソフトレンダリングにしては速いが... - 新型PS3では、Linux は使えない - とかいろいろだめ - -</pre> - -<hr> -<h2><a name="content002">Cell Architecture</a></h2> - -<p> -<img src="photo/Cell-main2.png" alt="pipeline" height="200"> -<p> -Linux 側から使える SPE は 6 個SPE は 256KB の Local Store (LS) SPE からメインメモリへ直接アクセスできない (DMAを使う)SPE は 128 ビットレジスタを 128 個持っている -<p> - -<hr> -<h2><a name="content003">楽するための並列プログラム</a></h2> -トリビアルなプログラムでも並列実行する必要がある -<p> -Single Thread でもPPE がクソ遅いので、SPEで実行するべき -<p> -例えば、 -<p> - -<pre> - Word Count - -</pre> - -<hr> -<h2><a name="content004">プログラムを Task に分割</a></h2> - -<p> -Task には依存関係がある -<p> -Open/CL , Spurs Engine -<p> - -<hr> -<h2><a name="content005">並列性</a></h2> - -<pre> - データ並列 - パイプライン - -</pre> -結局、これしかないらしい。 -<p> - -<hr> -<h2><a name="content006">階層的並列プログラミング</a></h2> - -<pre> - Row Level での並列性 - Vector/Streaming - 結局、データ並列とパイプライン - SPE Level での - データ読み込み、 実行、データ書込 - のパイプライン並列 - High Level での並列性 - Rendering - Scene Graph - -</pre> - -<hr> -<h2><a name="content007"> データ読み込み、 実行、データ書込 </a></h2> - -<p> -<img src="photo/pipeline.jpg" alt="pipeline"> -<p> -パイプラインバッファはいくつ? -<p> - -<hr> -<h2><a name="content008">Task は良いけど、データはどうするの?</a></h2> -データを右から左に... -<pre> - 処理中に必要なデータがメインメモリ上にある - でも、SPE には、256k しかメモリがない - -</pre> -メインメモリ(256MB、広くはないが十分)から、256Kに必要なだけキャッシュする -<pre> - ハードウェアでやれよ! - 普通の並列ハードウェアはキャッシュになっている - IBMはそう提案したらしいが、SCEの人が拒否したらしい - -</pre> -なので、自分でキャッシュする必要がある -<p> - -<hr> -<h2><a name="content009">Cerium Task Manager</a></h2> - -<pre> - Open/GL Mesa に Cell driver を書いたが、 - メインメモリに依存しすぎ - Task base で書く必要がある - Redering Engine も自前で一つ持っていて良い - SPEは256Kなのでコード管理も必要 - SPURSは公開されないらしい - -</pre> -そんな経緯で作成することに... -<p> - -<hr> -<h2><a name="content010">Crium Task Manager の特徴</a></h2> -<pre> - PPU/SPUで、Task の互換性がある - SPU上の最適化は当面禁止 - OS X 上でも動く - コードのデバッグはOS X 上でやる - 並列化とチューニングだけPS3上で行なう - SPU上のメモリをCode と Data を Hash とメモリリストで管理する - SPUに入り切らない巨大なTaskでも実行できる - -</pre> - -<hr> -<h2><a name="content011">ゲームの作り方</a></h2> - -<p> - -<pre> - Blender で、3Dモデリング - 階層化、グルーピング - これを、Blender の Python plugin で XMLに変換 - 画像/Texture もXMLに埋め込まれる - XMLを読み込み SceneGraph を作る - -</pre> -<img src="photo/cerium_sg_tree.jpg" alt="sg" > -<p> - -<hr> -<h2><a name="content012">Blender から SceneGraph 用の xml 生成</a></h2> -PythonScript の導入 -<p> -<ol><li> Blender をダウンロードしてインストール</li><li> export_xml.py を用意する</li><li>"/Applications/blender-version/blender.app/Contens/MacOS/.blender/scripts -" -<pre> - 以下にexport_xml.py をコピー</li> - -</pre> -<li>Blender を起動すると File -> Export に Libps3 (.xml) が追加される</li></ol> -<p> -ゲームの初期化部分でcrateFromXMLfileを呼ぶ<font size="4"><pre>void -game_init(TaskManager *manager, int bg){ -<pre> - sgroot->createFromXMLfile(manager, "xml_file/SG.xml"); - -</pre> -... -</pre></font> -<p> - -<hr> -<h2><a name="content013">SceneGraph</a></h2> - -<pre> - 階層化された3Dオブジェクト - 子供の向きを決定する変換行列 - Camera - 背景 - 入力デバイス - -</pre> -SceneGraph のノードには、 -<pre> - MoveTask - Collision Task - がある - -</pre> +<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>2009-09-26 (土) Cerium を用いた PS3 でのゲームの作り方</h1> +<h2></h2> +</div> +</div> -<hr> -<h2><a name="content014">ゲームとは、</a></h2> - -<p> - -<pre> - SceneGraph を - MoveTask - CollsionTask - で書き換えていく - MoveTask, CollsionTask は、ステートパターンで - 入れ換えられる - -</pre> -これで、すべて書ける。 -<p> - -<hr> -<h2><a name="content015">つまり、</a></h2> - -<pre> - SceneGraph の構築 - MoveTask - CollsionTask - -</pre> - -だけを書けば、あとは、Cell が自動的に並列に実行してくれる -<p> - -<hr> -<h2><a name="content016">Task の作り方</a></h2> -SchedTask を継承した class を作る<pre>class SpeTask : public SchedTask { -<pre> - SchedConstructor( SpeTask ); - int run(TaskManager *manager, void *rbuf, void *wbuf); - -</pre> -};</pre> -<p> -run 関数は Task における main 関数のようなものSchedConstructor() で class 名を登録する(C++のnew を使うとメモリを食われる...) -<p> -SchedRegisterTask(TASK_SPE, SpeTask) で SpeTask に TASK_SPE という ID をつけて登録します -<p> - -<hr> -<h2><a name="content017">Task の作り方(Con't)</a></h2> -<pre>/* 先ほど登録した ID を指定して Task を生成 */HTaskPtr task = manager->create_task(TASK_SPE); -<p> -/* 入出力先の指定 */task->add_inData(rbuff, rbuff_SIZE);task->add_outData(wbuff, wbuff_SIZE); -<p> -/* CPU の指定 */task->set_cpu(SPE_ANY); -<p> -/* Task の投入 */task->spawn();</pre> -<p> - -<hr> -<h2><a name="content018">Task の作り方(Con't)</a></h2> -Task は依存関係を記述する事ができる<pre>/* taskB は taskA が終わるまで待つ */taskB->wait_for(taskA); -<p> -/* taskC は taskB が終わるまで待つ */taskC->wait_for(taskB);</pre> -<p> - -<hr> -<h2><a name="content019">並列アーキテクチャは並列でないと...</a></h2> -特に、Cell/PS3 は、SPUで実行しないとだめ -<pre> - 既存のプログラミングでは、まったく歯が立たない - -</pre> -トリビアルなプログラムでも、並列にする必要がある -<p> +<ol class="xoxo presentation"> -<hr> -<h2><a name="content020">WordCount</a></h2> - -<pre> - Task をグラフ構造的に構築する (SceneGraphのMoveTask) - File を mmap する - mmap した部分をTask に割り当て、word countする - Task の構築 - Task の依存関係 - char *file_mmap = st_mmap.file_mmap; - +</li> +<li class="slide"> +<h1>Linux 上でのゲームフレームワーク</h1> +<p><pre> Cerium Task Manager<br> + Blender / SceneGraph<br> +</pre> +</li> +<li class="slide"> +<h1>Cell ってどうなの?</h1> +<p><pre> 結局、Video Chip に触れない<br> + SPUでレンダリング <br> + ソフトレンダリングにしては速いが...<br> + 新型PS3では、Linux は使えない<br> + とかいろいろだめ<br> +</pre> +</li> +<li class="slide"> +<h1>Cell Architecture</h1> +<p><img src="photo/Cell-main2.png" alt="pipeline" height="200"><br> +<p>Linux 側から使える SPE は 6 個<br> +SPE は 256KB の Local Store (LS) <br> +SPE からメインメモリへ直接アクセスできない (DMAを使う)<br> +SPE は 128 ビットレジスタを 128 個持っている<br> +<p></li> +<li class="slide"> +<h1>楽するための並列プログラム</h1> +トリビアルなプログラムでも並列実行する必要がある<br> +<p>Single Thread でもPPE がクソ遅いので、SPEで実行するべき<br> +<p>例えば、<br> +<p><pre> Word Count<br> </pre> - -<hr> -<h2><a name="content021">WordCount </a></h2> - -<p> - -<pre> - int word_flag = 0; - int i; - for (i = 0; i < task_num; i++) { - t_exec = manager->create_task(TASK_EXEC); - t_exec->add_inData(file_mmap + i*division_size, division_size); - t_exec->add_outData(o_data + i*status_num, division_out_size); - t_exec->add_param(division_size); - t_exec->add_param(word_flag); - t_exec->set_cpu(SPE_ANY); - t_print->wait_for(t_exec); - t_exec->spawn(); - word_flag = ((file_mmap[(i+1)*division_size-1] != 0x20) && (file_mmap[(i+ - +</li> +<li class="slide"> +<h1>プログラムを Task に分割</h1> +<p>Task には依存関係がある<br> +<p>Open/CL , Spurs Engine <br> +<p></li> +<li class="slide"> +<h1>並列性</h1> +<ul><li> データ並列 +</li> +<li> パイプライン +</li> +<p>結局、これしかないらしい。<br> +<p></ul> +</li> +<li class="slide"> +<h1>階層的並列プログラミング</h1> +<pre> Row Level での並列性 <br> + Vector/Streaming<br> + 結局、データ並列とパイプライン<br> + SPE Level での<br> + データ読み込み、 実行、データ書込<br> + のパイプライン並列<br> + High Level での並列性<br> + Rendering<br> + Scene Graph<br> </pre> -1)*division_size-1] != 0x0A)); -<pre> - size -= division_size; - } - -</pre> +</li> +<li class="slide"> +<h1> データ読み込み、 実行、データ書込 </h1> +<p><img src="photo/pipeline.jpg" alt="pipeline" height="300"><br> +<p>パイプラインバッファはいくつ?<br> +<p></li> +<li class="slide"> +<h1>Task は良いけど、データはどうするの?</h1> +データを右から左に...<br> +<pre> 処理中に必要なデータがメインメモリ上にある<br> + でも、SPE には、256k しかメモリがない<br> </pre> -<p> - -<hr> -<h2><a name="content022">WordCount 各SPEの結果を合計</a></h2> -<pre> -<pre> - .... - /* taskの数 */ - int task_num = size / division_size; - int out_task_num = task_num + (division_size*task_num < size); - t_print = manager->create_task(TASK_PRINT); - t_print->add_inData(o_data, out_size); - t_print->add_param(out_task_num); - t_print->add_param(status_num); - +メインメモリ(256MB、広くはないが十分)から、256Kに必要なだけキャッシュする<br> +<pre> ハードウェアでやれよ!<br> + 普通の並列ハードウェアはキャッシュになっている<br> + IBMはそう提案したらしいが、SCEの人が拒否したらしい<br> </pre> +なので、自分でキャッシュする必要がある<br> +<p></li> +<li class="slide"> +<h1>Cerium Task Manager</h1> +<pre> Open/GL Mesa に Cell driver を書いたが、<br> + メインメモリに依存しすぎ<br> + Task base で書く必要がある<br> + Redering Engine も自前で一つ持っていて良い<br> + SPEは256Kなのでコード管理も必要<br> + SPURSは公開されないらしい<br> </pre> -<p> - -<hr> -<h2><a name="content023">やってはいけないこと</a></h2> - -<pre> - 最初に大量のTaskをすべて作る - Task が自分でデータを拾って来る - Task 同士が、同期を行なう - +そんな経緯で作成することに...<br> +<p></li> +<li class="slide"> +<h1>Crium Task Manager の特徴</h1> +<pre> PPU/SPUで、Task の互換性がある<br> + SPU上の最適化は当面禁止<br> + OS X 上でも動く<br> + コードのデバッグはOS X 上でやる<br> + 並列化とチューニングだけPS3上で行なう<br> + SPU上のメモリをCode と Data を Hash とメモリリストで管理する<br> + SPUに入り切らない巨大なTaskでも実行できる<br> +</pre> +</li> +<li class="slide"> +<h1>ゲームの作り方</h1> +<p><pre> Blender で、3Dモデリング<br> + 階層化、グルーピング<br> + これを、Blender の Python plugin で XMLに変換<br> + 画像/Texture もXMLに埋め込まれる<br> + XMLを読み込み SceneGraph を作る<br> </pre> - -<hr> -<h2><a name="content024">Cerium Engine での同期</a></h2> - -<p> - -<pre> - Task 内では同期はしない - Local Storage/専有したメインメモリしか使わない - Task が終了した時に、Single Thread で動いているPPE - がデータの整理/同期を行なう - Task 側では、Task の生成は行なわない - Task の post_func (continuation) で、Taskを生成する - +<img src="photo/cerium_sg_tree.jpg" alt="sg" ><br> +<p></li> +<li class="slide"> +<h1>Blender から SceneGraph 用の xml 生成</h1> +PythonScript の導入<br> +<p><ol><br> +<li> Blender をダウンロードしてインストール</li><br> +<li> export_xml.py を用意する</li><br> +<li>"/Applications/blender-version/blender.app/Contens/MacOS/.blender/scripts<br> +"<br> +<pre> 以下にexport_xml.py をコピー</li><br> +</pre> +<li>Blender を起動すると File -> Export に Libps3 (.xml) が追加される</li><br> +</ol><br> +<p>ゲームの初期化部分でcrateFromXMLfileを呼ぶ<br> +<font size="4"><pre><br> +void<br> +game_init(TaskManager *manager, int bg)<br> +{<br> +<pre> sgroot->createFromXMLfile(manager, "xml_file/SG.xml");<br> </pre> - -<hr> -<h2><a name="content025">SPE Task, PPE Task</a></h2> - -<pre> - Task 内で生成しても即座には実行されない - Task 終了時に、SPEに送る Task List が作られる - Task List のアドレスがSPEにメールされる - SPEがメールを見て、Task List を読み込み実行する - Task List の読み込みとSPEのTaskの実行は並列 - Task List がなくなる(なくなりそうになると)と、 - PPEにメールで要求する - +...<br> +</pre></font><br> +<p></li> +<li class="slide"> +<h1>SceneGraph</h1> +<pre> 階層化された3Dオブジェクト<br> + 子供の向きを決定する変換行列<br> + Camera<br> + 背景<br> + 入力デバイス<br> </pre> -PPE Task -<pre> - SPE Task と互換。メインメモリを自由に参照できる - +SceneGraph のノードには、<br> +<pre> MoveTask<br> + Collision Task <br> + がある<br> </pre> - -<hr> -<h2><a name="content026">Fifo TaskManager</a></h2> - -<p> -全部、同じCPU上で実行する。 -<p> -OS X 上で動作する (Linux でも) -<p> -デバッグ用 -<p> - -<hr> -<h2><a name="content027">MemList と Hash</a></h2> - -<pre> - get_segment/put_segment/wait_segement - 明示的にキャッシュ制御する必要がある - +</li> +<li class="slide"> +<h1>ゲームとは、</h1> +<p><pre> SceneGraph を<br> + MoveTask<br> + CollsionTask<br> + で書き換えていく<br> + MoveTask, CollsionTask は、ステートパターンで<br> + 入れ換えられる<br> </pre> -特に、 -<p> -Dynamic SPE Task -<pre> - SPE上に常駐しないTask - MemList と Hash で管理されている - +これで、すべて書ける。<br> +<p></li> +<li class="slide"> +<h1>つまり、</h1> +<pre> SceneGraph の構築<br> + MoveTask<br> + CollsionTask<br> +</pre> +だけを書けば、あとは、Cell が自動的に並列に実行してくれる<br> +<p></li> +<li class="slide"> +<h1>Task の作り方</h1> +SchedTask を継承した class を作る<br> +<pre><br> +class SpeTask : public SchedTask {<br> +<pre> SchedConstructor( SpeTask );<br> + int run(TaskManager *manager, void *rbuf, void *wbuf);<br> </pre> -256K (GBAと同じ!?) しかメモリがないので重要 -<p> - -<hr> -<h2><a name="content028">SPU上でのコード管理</a></h2> - -<pre> - GCCのOverlayを使う - Overlay では、異なる場所にコードを置けない - 部分的にPICではなく、絶対参照に変更する - 自分自身へは相対参照。ライブラリへは絶対参照 - Perl Script で書き換える - +};<br> +</pre><br> +<p>run 関数は Task における main 関数のようなもの<br> +SchedConstructor() で class 名を登録する<br> +(C++のnew を使うとメモリを食われる...)<br> +<p>SchedRegisterTask(TASK_SPE, SpeTask) で SpeTask に TASK_SPE という ID をつけて<br> +登録します<br> +<p></li> +<li class="slide"> +<h1>Task の作り方(Con't)</h1> +<pre><br> +/* 先ほど登録した ID を指定して Task を生成 */<br> +HTaskPtr task = manager->create_task(TASK_SPE);<br> +<p>/* 入出力先の指定 */<br> +task->add_inData(rbuff, rbuff_SIZE);<br> +task->add_outData(wbuff, wbuff_SIZE);<br> +<p>/* CPU の指定 */<br> +task->set_cpu(SPE_ANY);<br> +<p>/* Task の投入 */<br> +task->spawn();<br> +</pre><br> +<p></li> +<li class="slide"> +<h1>Task の作り方(Con't)</h1> +Task は依存関係を記述する事ができる<br> +<pre><br> +/* taskB は taskA が終わるまで待つ */<br> +taskB->wait_for(taskA);<br> +<p>/* taskC は taskB が終わるまで待つ */<br> +taskC->wait_for(taskB);<br> +</pre><br> +<p></li> +<li class="slide"> +<h1>並列アーキテクチャは並列でないと...</h1> +特に、Cell/PS3 は、SPUで実行しないとだめ<br> +<pre> 既存のプログラミングでは、まったく歯が立たない<br> </pre> - -<hr> -<h2><a name="content029">Task list</a></h2> - -<p> - -<pre> - task_list にオブジェクト生成するコードを入れる - オブジェクトが生成されてしまえば、普通に扱える - task 実行中にコードが追い出されることはない - 現在実行中のコード - 次にロードするコード - の二つは必ずメモリ上にある - +トリビアルなプログラムでも、並列にする必要がある<br> +<p></li> +<li class="slide"> +<h1>WordCount</h1> +<pre> Task をグラフ構造的に構築する (SceneGraphのMoveTask)<br> + File を mmap する<br> + mmap した部分をTask に割り当て、word countする<br> + Task の構築<br> + Task の依存関係<br> + char *file_mmap = st_mmap.file_mmap;<br> </pre> - -<hr> -<h2><a name="content030">SceneGraph と Rendering Engine</a></h2> - -<p> - -<pre> - SceneGraph -> SceneGraph - SceneGraph -> Polygon - Polygon -> Span Pack - Span Pack を Texture を使って Rendering - これらを大きく並列に実行する - Rendering は細かく並列に実行する - +</li> +<li class="slide"> +<h1>WordCount</h1> +<p><img src="photo/wc_graf1.jpg" alt="sg" height="300"><br> +<p></li> +<li class="slide"> +<h1>WordCount </h1> +<pre> int word_flag = 0;<br> + int i;<br> + for (i = 0; i < task_num; i++) {<br> + t_exec = manager->create_task(TASK_EXEC);<br> + t_exec->add_inData(file_mmap + i*division_size, division_size);<br> + t_exec->add_outData(o_data + i*status_num, division_out_size);<br> + t_exec->add_param(division_size);<br> + t_exec->add_param(word_flag);<br> + t_exec->set_cpu(SPE_ANY);<br> + t_print->wait_for(t_exec);<br> + t_exec->spawn();<br> + word_flag = ((file_mmap[(i+1)*division_size-1] != 0x20) && (file_mmap[(i+<br> +</pre> +1)*division_size-1] != 0x0A)); <br> +<pre> size -= division_size;<br> + }<br> </pre> - -<hr> -<h2><a name="content031">SceneGraph と Rendering Engine</a></h2> - -<p> -1 dot 1 dot SPUが書いていく -<p> -<td><img src="photo/rendering.png" alt="rendering" ></td> -<p> - -<hr> -<h2><a name="content032">Rendering Task</a></h2> -SG2PP -<pre> - SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する - +</pre><br> +<p></li> +<li class="slide"> +<h1>WordCount 各SPEの結果を合計</h1> +<pre><br> +<pre> ....<br> + /* taskの数 */<br> + int task_num = size / division_size;<br> + int out_task_num = task_num + (division_size*task_num < size);<br> + t_print = manager->create_task(TASK_PRINT);<br> + t_print->add_inData(o_data, out_size);<br> + t_print->add_param(out_task_num);<br> + t_print->add_param(status_num);<br> </pre> -PP2SP -<pre> - ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する - +</pre><br> +<p></li> +<li class="slide"> +<h1>やってはいけないこと</h1> +<pre> 最初に大量のTaskをすべて作る<br> + Task が自分でデータを拾って来る<br> + Task 同士が、同期を行なう<br> </pre> -DrawSpan -<pre> - Span を使って 1 ラインずつ FrameBuffer に描画していく - +</li> +<li class="slide"> +<h1>Cerium Engine での同期</h1> +<p><pre> Task 内では同期はしない<br> + Local Storage/専有したメインメモリしか使わない<br> + Task が終了した時に、Single Thread で動いているPPE<br> + がデータの整理/同期を行なう<br> + Task 側では、Task の生成は行なわない<br> + Task の post_func (continuation) で、Taskを生成する<br> </pre> - -<hr> -<h2><a name="content033">Demo されている Chain</a></h2> - -<p> - -<pre> - 相互制約が非常に大きい物理シミュレーションの例 - 非ホロノミック系なので、単純な積分では力学を決定できない - SPU上で、すべての要素を同時に計算する必要がある - (あまり並列計算向きではない...ベクトル向き) - +</li> +<li class="slide"> +<h1>SPE Task, PPE Task</h1> +<pre> Task 内で生成しても即座には実行されない<br> + Task 終了時に、SPEに送る Task List が作られる<br> + Task List のアドレスがSPEにメールされる<br> + SPEがメールを見て、Task List を読み込み実行する<br> + Task List の読み込みとSPEのTaskの実行は並列<br> + Task List がなくなる(なくなりそうになると)と、<br> + PPEにメールで要求する<br> +</pre> +PPE Task<br> +<pre> SPE Task と互換。メインメモリを自由に参照できる<br> +</pre> +</li> +<li class="slide"> +<h1>Fifo TaskManager</h1> +<p>全部、同じCPU上で実行する。<br> +<p>OS X 上で動作する (Linux でも)<br> +<p>デバッグ用<br> +<p></li> +<li class="slide"> +<h1>MemList と Hash</h1> +<pre> get_segment/put_segment/wait_segement<br> + 明示的にキャッシュ制御する必要がある<br> +</pre> +特に、<br> +<p>Dynamic SPE Task<br> +<pre> SPE上に常駐しないTask<br> + MemList と Hash で管理されている<br> +</pre> +256K (GBAと同じ!?) しかメモリがないので重要<br> +<p></li> +<li class="slide"> +<h1>SPU上でのコード管理</h1> +<pre> GCCのOverlayを使う <br> + Overlay では、異なる場所にコードを置けない<br> + 部分的にPICではなく、絶対参照に変更する<br> + 自分自身へは相対参照。ライブラリへは絶対参照<br> + Perl Script で書き換える<br> +</pre> +</li> +<li class="slide"> +<h1>Task list</h1> +<p><pre> task_list にオブジェクト生成するコードを入れる<br> + オブジェクトが生成されてしまえば、普通に扱える<br> + task 実行中にコードが追い出されることはない<br> + 現在実行中のコード<br> + 次にロードするコード<br> + の二つは必ずメモリ上にある<br> </pre> -(地味です...) -<p> - -<hr> -<h2><a name="content034">まとめ</a></h2> -Blender/Linux/Cerium を用いたオープンソースなゲームフレームワーク -<p> -SceneGraphを作れば、move/collision を記述するだけで並列に実行される -<p> -ソフトウェアレンダリングなんで、なんでも自分で書ける -<p> - -<hr> -<h2><a name="content035">将来的には、</a></h2> - -<pre> - C++ やめたい。悪いことばかり。メモリ食い。 - CbC (Continuatin based C)で書き直す予定。 - Cell は、やばそうなので、新しい並列アーキテクチャとか。 - Open Scene Graph, Open/CLとの関係とか。 - -<h2><a name="content">Content</h2> -<ol> -<li><a href="#content000"> Linux 上でのゲームフレームワーク</a> -<li><a href="#content001"> Cell ってどうなの?</a> -<li><a href="#content002"> Cell Architecture</a> -<li><a href="#content003"> 楽するための並列プログラム</a> -<li><a href="#content004"> プログラムを Task に分割</a> -<li><a href="#content005"> 並列性</a> -<li><a href="#content006"> 階層的並列プログラミング</a> -<li><a href="#content007"> データ読み込み、 実行、データ書込 </a> -<li><a href="#content008"> Task は良いけど、データはどうするの?</a> -<li><a href="#content009"> Cerium Task Manager</a> -<li><a href="#content010"> Crium Task Manager の特徴</a> -<li><a href="#content011"> ゲームの作り方</a> -<li><a href="#content012"> Blender から SceneGraph 用の xml 生成</a> -<li><a href="#content013"> SceneGraph</a> -<li><a href="#content014"> ゲームとは、</a> -<li><a href="#content015"> つまり、</a> -<li><a href="#content016"> Task の作り方</a> -<li><a href="#content017"> Task の作り方(Con't)</a> -<li><a href="#content018"> Task の作り方(Con't)</a> -<li><a href="#content019"> 並列アーキテクチャは並列でないと...</a> -<li><a href="#content020"> WordCount</a> -<li><a href="#content021"> WordCount </a> -<li><a href="#content022"> WordCount 各SPEの結果を合計</a> -<li><a href="#content023"> やってはいけないこと</a> -<li><a href="#content024"> Cerium Engine での同期</a> -<li><a href="#content025"> SPE Task, PPE Task</a> -<li><a href="#content026"> Fifo TaskManager</a> -<li><a href="#content027"> MemList と Hash</a> -<li><a href="#content028"> SPU上でのコード管理</a> -<li><a href="#content029"> Task list</a> -<li><a href="#content030"> SceneGraph と Rendering Engine</a> -<li><a href="#content031"> SceneGraph と Rendering Engine</a> -<li><a href="#content032"> Rendering Task</a> -<li><a href="#content033"> Demo されている Chain</a> -<li><a href="#content034"> まとめ</a> -<li><a href="#content035"> 将来的には、</a> -</ol> - -</body></html> +</li> +<li class="slide"> +<h1>SceneGraph と Rendering Engine</h1> +<p><pre> SceneGraph -> SceneGraph<br> + SceneGraph -> Polygon<br> + Polygon -> Span Pack<br> + Span Pack を Texture を使って Rendering<br> + これらを大きく並列に実行する<br> + Rendering は細かく並列に実行する<br> +</pre> +</li> +<li class="slide"> +<h1>SceneGraph と Rendering Engine</h1> +<p>1 dot 1 dot SPUが書いていく<br> +<p><td><img src="photo/rendering.png" alt="rendering" ></td><br> +<p></li> +<li class="slide"> +<h1>Rendering Task</h1> +SG2PP<br> +<ul><li> SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する +</li> +PP2SP<br> +<li> ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 SpanPack (Span の集合)を生成する +</li> +DrawSpan<br> +<li> Span を使って 1 ラインずつ FrameBuffer に描画していく +</li> +<p></ul> +</li> +<li class="slide"> +<h1>Demo されている Chain</h1> +<pre> 相互制約が非常に大きい物理シミュレーションの例<br> + 非ホロノミック系なので、単純な積分では力学を決定できない<br> + SPU上で、すべての要素を同時に計算する必要がある<br> + (あまり並列計算向きではない...ベクトル向き)<br> +</pre> +(地味です...)<br> +<p></li> +<li class="slide"> +<h1>まとめ</h1> +Blender/Linux/Cerium を用いたオープンソースなゲームフレームワーク<br> +<p>SceneGraphを作れば、move/collision を記述するだけで並列に実行される<br> +<p>ソフトウェアレンダリングなんで、なんでも自分で書ける<br> +<p></li> +<li class="slide"> +<h1>将来的には、</h1> +<ul><li> C++ やめたい。悪いことばかり。メモリ食い。 +</li> +<p><li> CbC (Continuatin based C)で書き直す予定。 +</li> +<p><li> Cell は、やばそうなので、新しい並列アーキテクチャとか。 +</li> +<p><li> Open Scene Graph, Open/CLとの関係とか。 +</li> +<p> \ No newline at end of file
--- a/presen/osc2009.ind Sat Sep 26 13:48:55 2009 +0900 +++ b/presen/osc2009.ind Sat Sep 26 17:03:53 2009 +0900 @@ -64,7 +64,7 @@ -- データ読み込み、 実行、データ書込 -<img src="photo/pipeline.jpg" alt="pipeline"> +<img src="photo/pipeline.jpg" alt="pipeline" height="300"> パイプラインバッファはいくつ? @@ -230,6 +230,10 @@ char *file_mmap = st_mmap.file_mmap; +--WordCount + +<img src="photo/wc_graf1.jpg" alt="sg" height="300"> + --WordCount int word_flag = 0;