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 をコピー&lt;/li&gt;
-
-</pre>
-<li>Blender を起動すると File -> Export に Libps3 (.xml) が追加される</li></ol>
-<p>
-ゲームの初期化部分でcrateFromXMLfileを呼ぶ<font size="4"><pre>void
-game_init(TaskManager *manager, int bg){
-<pre>
-   sgroot-&gt;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-&gt;create_task(TASK_SPE);
-<p>
-/* 入出力先の指定 */task-&gt;add_inData(rbuff, rbuff_SIZE);task-&gt;add_outData(wbuff, wbuff_SIZE);
-<p>
-/* CPU の指定 */task-&gt;set_cpu(SPE_ANY);
-<p>
-/* Task の投入 */task-&gt;spawn();</pre>
-<p>
-
-<hr>
-<h2><a name="content018">Task の作り方(Con't)</a></h2>
-Task は依存関係を記述する事ができる<pre>/* taskB は taskA が終わるまで待つ */taskB-&gt;wait_for(taskA);
-<p>
-/* taskC は taskB が終わるまで待つ */taskC-&gt;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 &lt; task_num; i++) {
-        t_exec = manager-&gt;create_task(TASK_EXEC);
-        t_exec-&gt;add_inData(file_mmap + i*division_size, division_size);
-        t_exec-&gt;add_outData(o_data + i*status_num, division_out_size);
-        t_exec-&gt;add_param(division_size);
-        t_exec-&gt;add_param(word_flag);
-        t_exec-&gt;set_cpu(SPE_ANY);
-        t_print-&gt;wait_for(t_exec);
-        t_exec-&gt;spawn();
-        word_flag = ((file_mmap[(i+1)*division_size-1] != 0x20) &amp;&amp; (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 &lt; size);
-    t_print = manager-&gt;create_task(TASK_PRINT);
-    t_print-&gt;add_inData(o_data, out_size);
-    t_print-&gt;add_param(out_task_num);
-    t_print-&gt;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 -&gt; SceneGraph
-      SceneGraph -&gt; Polygon
-      Polygon -&gt; 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;