Mercurial > hg > Papers > 2008 > gongo-sigos
changeset 16:c66181a100e3
*** empty log message ***
author | gongo |
---|---|
date | Tue, 22 Apr 2008 22:32:32 +0900 |
parents | 6c558cd2ac8b |
children | d95afaf26286 |
files | presentation/img/amdahl.jpg presentation/img/cbe.jpg presentation/img/cerium.jpg presentation/img/cube.tiff presentation/img/cube_cerium.tiff presentation/img/icon.bmp presentation/img/pipe.jpg presentation/img/pipeline.jpg presentation/img/scene_graph.graffle presentation/img/scene_graph.jpg presentation/img/span.graffle presentation/img/span.jpg presentation/img/sync.jpg presentation/presen.html |
diffstat | 14 files changed, 713 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presentation/presen.html Tue Apr 22 22:32:32 2008 +0900 @@ -0,0 +1,713 @@ +<!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>Cell 用の Fine-grain Task Manager の実装</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> +</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>[2008年04月23日]</h1> + <h2>[第108回システムソフトウェアとオペレーティング・システム研究会]</h2> + </div> + </div> + + <div class="presentation"> + + <div class="slide"> + <div align="center"> + <h1>Cell 用の Fine-grain Task Manager の実装</h1> + <h3> + 宮國渡、河野真治、神里晃、杉山千秋<br/><br/> + 琉球大学 + </h3> + </div> + </div> + + + <div class="slide"> + <h1>研究の背景と目的</h1> + 研究背景 + <ul> + <li>CPU の性能向上は、クロックサイクルを上げることよりも、 + 複数の CPU コア (Many Core Architecture) を導入することにより + 得られるようになってきている</li> + <li>しかし、Many Core Architecture のプログラムは複雑であり、 + その信頼性を確保することは難しい + </li> + </ul> + + <br/> + 研究目的 + <ul> + <li>Many Core Architecture 向けの Fine Grain Task OS を設計する</li> + <ul> + <li>Amdahl 則を考慮して、定常的な並列性を + 細粒度タスクを使って実現する + </li> + <li>タスク全体のデバッグを容易にするために、 + 同じタスクが Mac OS X や Linux、PS3 上などの + 複数の環境で動くようにする + </li> + </ul> + <li>例題として、本研究室で作成した、 + Rendering を含む PS3 上のゲームプログラム用 OS である + Cerium を用いる</li> + </ul> + </div> + + <div class="slide"> + <h1>Cell Broadband Engine</h1> + <div align="center"> + <img src="img/cbe.jpg" width="388" height="231" /> + </div> + <ul> + <li>2 thread の PPE(PowerPC Processor Element) と + 8個の SPE (Synergetic Processor Element) を持つ</li> + <ul> + <li>ユーザが使える SPE は 6個</li> + </ul> + <li>SPE は 256 KB の Local Store (LS) を持つ</li> + <li>SPE からメインメモリへは直接アクセスすることは出来ず、 + MFC (Memory Flow Controller) へ、DMA 命令を送ることで行われる</li> + <li>SPE はグラフィックスに適した、4つの固定小数点、 + 浮動小数点を同時に演算する命令を持つ</li> + <ul> + <li>ほとんどの演算を SPE 上で行わせることが推奨されている</li> + </ul> + </ul> + </div> + + <div class="slide"> + <h1>Many Core 上のプログラムの特徴</h1> + 従来の逐次型のプログラムでは、Cell といった + Many Core Architecture の性能を十分に + 引き出すことは出来ない。<br/> + <br/> + + 定常的な並列度の必要性 + + <ul> + <li>Amdahl則</li> + <ul> + <li>並列化率が低ければ、並列実行の性能を生かすことはできない</li> + <center><img src="img/amdahl.jpg" width="404" height="249"/></center> + </ul> + <li>高い並列度ではなくとも、恒常的に並列度を + 維持する必要がある</li> + <ul> + <li>逐次型プログラムの一部を並列化するという手法では不十分である</li> + <li>C 等では、for 文や配列のアクセス等に並列性が隠されてしまう</li> + </ul> + </ul> + </div> + + <div class="slide"> + <h1>プログラム中の並列度を維持するためには</h1> + + 以下の二つを同時に用いることで、<br/> + 定常的な並列度を維持することが可能となる。 + + <ul> + <li>データ並列</li> + <ul> + <li>分割したデータ(配列や木の中の個々の要素)に対して + 並列に実行する</li> + </ul> + <li>パイプライン処理</li> + <ul> + <li>複数の逐次処理の隣同士を重ねて実行する</li> + <img src="img/pipe.jpg" width="465" height="210"/> + </ul> + </ul> + + <br/> + データ並列とパイプライン処理を可能にするために + + <ul> + <li>プログラムとデータの適切な分割を行う必要がある</li> + <li>for 文、あるいは木を辿って処理する + 個々のステートメントがプログラムの分割の対象となる</li> + </ul> + + </div> + + <div class="slide"> + <h1>並列プログラムのデバッグ</h1> + 並列プログラムのデバッグは困難とされている + <ul> + <li>実行が非決定的である場合がある</li> + <ul> + <li>非決定的:同じ入力、状態で実行しても結果が異なる</li> + </ul> + <li>バグの状態を再現することが難しい</li> + <li>個々の Core 上のデータを調べる必要もある</li> + </ul> + </div> + + <div class="slide"> + <h1>OSMesa/SDL を用いた Cell 上でのゲームプログラミング</h1> + Cerium の先行研究 + <ul> + <li>PS3 の RSX (GDP) へのアクセスができないため、 + OSMesa を用いて Frame Buffer へ直接描画する</li> + <li>例題として、テクスチャを貼っていない一つの立方体を回転させる</li> + <ul> + <li>ポリゴンの情報からフレームバッファに描き込むところで、 + SPE を用いて高速化させている</li> + </ul> + </ul> + <div align="center"> + <table border="1" cellpadding="4"> + <td rowspan="4"> + <img src="img/cube.tiff" width="345" height="244" /> + </td> + <td>実行環境 (描画領域:1920x1080)</td> + <td>実行速度 (Frame Per Second)</td> + </tr> + <tr> + <td>SDL(1.2) + OSMesa(6.5.2)</td> + <td>18 FPS</td> + </tr> + <tr> + <td>SDL(1.2) + OSMesa(6.5.2) with SPE</td> + <td>24 FPS</td> + </tr> + <tr> + <td>SDL(1.2.13) + OSMesa(7.0.2) with SPE</td> + <td>43 FPS</td> + </tr> + </table> + </div> + </div> + + <div class="slide"> + <h1>OSMesa の問題点</h1> + <ul> + <li>巨大なマクロによるプログラム記述</li> + <li>コピーの多用</li> + <li>巨大な構造体</li> + <li>テクスチャモードによっていくつものコードが呼び出される</li> + </ul> + <br/> + 以上のコード全てに対して、細分化や後に拡張することは難しい + </div> + + <div class="slide"> + <h1>Cerium</h1> + Scene Graph、Rendering Engine、Task Manager から構成され、 + 以下の3つのタスクを持つ + + <table border="0"> + <tr> + <td> + <img src="img/cerium.jpg" width="380" height="432"/> + </td> + <td> + <ol> + <li>Scene Graph が持つ Polygon の座標から、 + 表示する座標の計算を行い、PolygonPack を生成する</li> + <li>PolygonPack から、同じ Y 座標を持つ線分の集合 + SpanPack を生成する</li> + <li>SpanPack を Z Buffer を用いて、 + Texture を読み込みながらフレームバッファに描画する</li> + </ol> + </td> + </tr> + </table> + </div> + + <div class="slide"> + <h1>Scene Graph</h1> + + <table border="0"> + <tr> + <td> + <img src="img/scene_graph.jpg" width="403" height="520"/> + </td> + <td> + ゲーム中の一つの場面 (Scene) を構成する + オブジェクトやその振る舞い、ゲームのルールの集合を + Scene Graph とする + <ul> + <li>親子関係を持つ木構造で構成される</li> + <ul> + <li>Scene Graph の各ノードに対して、 + データ並列実行をすることが可能</li> + </ul> + <li>ゲーム場面の遷移は StatePattern を用いて記述する</li> + <ul> + <li>if, case 文が排除でき、 + プログラムの可読性と独立性が向上する</li> + <li>移植や改良にかかる作業時間短縮が見込める</li> + </ul> + </ul> + </td> + </tr> + </table> + </div> + + <div class="slide"> + <h1>Rendering Engine</h1> + <ul> + <li>Scene Graph から得られた Polygon から Span を生成</li> + <table border="0"> + <tr> + <td><img src="img/span.jpg" /></td> + <td> + Span とは Polygon に対する、ある特定の Y 座標に関するデータ + </td> + </tr></table> + <li>Span に RGB をマッピングしフレームバッファに描画する</li> + <ul> + <li>生成された Span は SPE へ送られ、 + Z Buffer を用いてフレームバッファに書き込む</li> + <li> + ピクセルの座標に対応する RGB 値を、テクスチャデータから取り出す + </li> + <ul> + <li>テクスチャデータは、プログラム起動時に一度だけ + SPE が DMA で全て取得する。</li> + </ul> + </ul> + </ul> + </div> + + <div class="slide"> + <h1>Task Manager</h1> + Task と呼ばれる、分割された各プログラムを管理するライブラリ + + <br/><br/> + <div align="center"> + Task Manager API + <table border="1" cellpadding="4"> + <tr> + <td>create_task(cmd, size, in_addr, out_addr)</td> + <td>Task を生成する</td> + </tr> + <tr> + <td>spawn()</td> + <td>Task を実行タスクキューに登録する</td> + </tr> + <tr> + <td>set_depend(task)</td> + <td>Task の依存関係の考慮</td> + </tr> + <tr> + <td>set_cpu(cpu_type)</td> + <td>Task を実行する CPU の設定</td> + </tr> + <tr> + <td>run()</td> + <td>実行タスクキューの実行</td> + </tr> + </table> + </div> + + <br/><br/> + ここから、Task Manager を構成する特徴について述べていく + </div> + + <div class="slide"> + <h1>Task Manager - Task の定義</h1> + <table border="0" cellpadding="0"> + <tr> + <td> + <pre> +class Task { +public: + int command; + int size; + unsigned int in_addr; + unsigned int out_addr; + Task *self; +}; + </pre> + </td> + <td valign="top"> + Task クラスは、SPE で実行されるタスクのオブジェクト + + <ul> + <li>in_addr から入力データを取得</li> + <li>command に対応するプログラムコードを実行</li> + <li>実行結果を out_addr に書き込む</li> + </ul> + </td> + </tr> + <tr> + <td> + <pre> +class HTask : public Task { +public: + // 自分を待っているタスクのキュー + TaskQueue wait_me; + + // 自分が待つべきタスクのキュー + TaskQueue wait_i; + + // このタスクが実行する CPU + CPU_TYPE cpu_type; +}; + </pre> + </td> + <td valign="top"> + HTask クラスは、実行前のタスクオブジェクト + <ul> + <li>タスク依存の考慮、実行する CPU の選択等に使われる</li> + </ul> + </td> + </tr> + </table> + </div> + + <div class="slide"> + <h1>Task Manager - スケジューラ</h1> + <ul> + <li>SPE は DMA 完了を待たずに他の処理を行うことができるので、 + DMA のレイテンシを隠すことができる</li> + <li>ダブルバッファリングにより、パイプライン処理を行う</li> + </ul> + + <table border="0"> + <tr> + <td> + <pre> +do { + task3->write(); + task2->exec(); + task1->read(); + + taskTmp = task3; + task3 = task2; + task2 = task1; + task1 = task1->next(); +} while (task1); + </pre> + スケジューラの記述 + </td> + <td> + <img src="img/pipeline.jpg" width="557" height="405" /> + </td> + </tr> + </table> + + </div> + + <div class="slide"> + <h1>Task Manager - タスク依存</h1> + Task Manager はタスク依存を解決する機能を持っている + + <pre> + + /** + * task2 は task1 が終了してから開始する + */ + task2->set_depend(task1); + </pre> + + <ul> + <li>タスク依存が満たされたものをアクティブキューへ</li> + <li>SPE はアクティブキューから処理するコードとデータを取得し、 + 自律的に実行する</li> + <li>終了したタスクはPPEに終了のコマンドを発行する</li> + <li>コマンドを受け取り、ウェイトキューのタスクでタスク依存を + 満たしたものをアクティブキューにいれる</li> + </ul> + </div> + + <div class="slide"> + <h1>Task Manager - PPE コードと SPE コードの互換性</h1> + Cerium では、2つのプログラム記述が可能である + <ul> + <li>SPE を用いる Cell 上でのみ動作する SPE プログラム</li> + <li>Linux や Mac OS X などで動く、アーキテクチャに依存しない + FIFO プログラム</li> + <ul> + <li>DMA 命令は、バッファのアドレス参照でシミュレートする</li> + </ul> + </ul> + + + <br/> + タスクを PPE、SPE のどちらで動かすかを決める機能 + + <pre> + task1->set_cpu(CPU_PPE); // PPE で動作 + task2->set_cpu(CPU_SPE); // SPE で動作 + </pre> + + これにより、環境依存によるプログラム変換は + 分割したタスクの部分だけとなり、全体の変換は必要ない + </div> + + <div class="slide"> + <h1>Task Manager - PPE と SPE 間の同期</h1> + <table border="0"> + <tr> + <td> + <img src="img/sync.jpg" /> + </td> + <td> + Cerium が扱うスレッド + <ul> + <li>SPE に対応した PPE 上の Thread</li> + <ul> + <li>各 SPE の起動と終了を見るだけ</li> + </ul> + <li>Mailbox によるメッセージ交換を担当する Thread</li> + <ul> + <li>Outbound Mailbox (SPE → PPE) と + Inbound Mailbox (PPE → SPE) を扱う</li> + </ul> + </ul> + <li>Mailbox とは</li> + <ul> + <li>SPE の MFC (Memory Flow Controller) 内の FIFO キュー</li> + <li>PPE と SPE 間の 32 ビットメッセージの交換に用いられる</li> + <li>メッセージ交換なので、待ち合わせによる並列度の低下を + 避けることが可能となる + </li> + </ul> + </td> + </tr> + </table> + </div> + + <div class="slide"> + <h1>Cerium の開発行程 - 段階 1,2</h1> + Cerium 自身や Cerium を用いたプログラムの作成手順 + + <ol> + <li>C によるシーケンシャルな実装<br/> + Task Manager を用いず、プログラムのアルゴリズムの信頼性を + 確認するために用いる + </li> + <li>SPE を考慮したデータ構造 (PolygonPack, SpanPack) を持つ実装<br/> + データの変換が必要になり、段階 1 と + 同じ結果を得られるかどうかを検証する + <ul> + <li>決定的に動くので、テストは容易である</li> + <li>シーケンシャルな実装であるため、デバッグも + 二分法により容易に行える</li> + </ul> + </li> + </ol> + </div> + + <div class="slide"> + <h1>Cerium の開発行程 - 段階 3,4</h1> + <ol start="3"> + <li>コードをタスクに分割し、FIFO キューでシーケンシャルに実行する実装<br/> + Task Manager を用いる。この段階まではアーキテクチャに依存しないので、 + ターゲットが開発途中の段階でも記述することか可能である +</li> + <li>タスクを SPE に割り当て並列実行する実装<br/> + 段階3までが動いていれば問題なく動作すると期待される。 + 段階3から段階4へのプログラムの変換は、set_cpu() を用いることにより + 容易に出来る。 + <ul> + <li>SPE が持つ命令セットを用いて最適化することにより、 + 更なる性能向上が期待できる</li> + </ul> + </li> + </ol> + </div> + + <div class="slide"> + <h1>Cerium の評価</h1> + <table border="0"> + <tr> + <td> + OSMesa version と同じく立方体を回転させる処理を例題とする + </td> + <td> + <img src="img/cube_cerium.tiff"/> + <img src="img/icon.bmp" /> テクスチャ + </td> + </tr> + <tr> + <td> + + 描画領域 (640x80) + <table border="1"> + <tr> + <td>PPE の最適化</td> + <td>SPE の最適化</td> + <td>実行速度</td> + </tr> + <tr> + <td>最適化なし</td> + <td>最適化なし</td> + <td>263 FPS</td> + </tr> + <tr> + <td>-O2</td> + <td>最適化なし</td> + <td>317 FPS</td> + </tr> + <tr> + <td>最適化なし</td> + <td>-O2</td> + <td>821 FPS</td> + </tr> + <tr> + <td>-O2</td> + <td>-O2</td> + <td>1355 FPS</td> + </tr> + </table> + </td> + + + <td> + <!-- + <table border="1" cellpadding="4"> + <tr> + <td>Task</td> + <td>CPU</td> + </tr> + <tr> + <td>SceneGraph → PolygonPack</td> + <td>PPE</td> + </tr> + <tr> + <td>PolygonPack → SpanPack</td> + <td>PPE</td> + </tr> + <tr> + <td>Rendering</td> + <td>SPE</td> + </tr> + </table> + --> + + <ul> + <li>Rendering タスクを、SPE による高速化を行った</li> + <li>左表より、SPE に対する最適化が非常に有効であると言える</li> + </ul> + </td> + </tr> + </table> + + </div> + + <div class="slide"> + <h1>OSMesa version との比較</h1> + + <table border="1" cellpadding="4"> + <tr> + <td></td> + <td>実行環境 (描画領域:1920x1080)</td> + <td>実行速度 (Frame Per Second)</td> + </tr> + <tr> + <td>1</td> + <td>SDL(1.2) + OSMesa(6.5.2)</td> + <td>18 FPS</td> + </tr> + <tr> + <td>2</td> + <td>SDL(1.2) + OSMesa(6.5.2) with SPE</td> + <td>24 FPS</td> + </tr> + <tr> + <td>3</td> + <td>SDL(1.2.13) + OSMesa(7.0.2) with SPE</td> + <td>43 FPS</td> + </tr> + <tr> + <td>4</td> + <td>Cerium</td> + <td>33 FPS</td> + </tr> + </table> + + <br/> + <ul> + <li>Cerium は、環境1,2 を上回っているものの、環境3は下回っている</li> + <li>現在 Cerium に実装されていない機能があるため、 + SPE を活用しきれていないためと考えられる</li> + </ul> + </div> + + <div class="slide"> + <h1>Cerium に足りない主な機能</h1> + <ul> + <li>DMA を用いたプログラムコードのSPE 上へのロード</li> + <ul> + <li>SPE の LS の容量 (256KB) では、全てのタスクを SPE 上に + 乗せておくことが出来ない</li> + <li>必要なプログラムを必要な時にだけロードする必要がある</li> + <li>オーバーレイを用いると、SPE が止まってしまうため好ましくない</li> + </ul> + <li>テクスチャの On demand Load</li> + <ul> + <li>現在は起動時にテクスチャデータを全てSPE上に置く</li> + <ul> + <li>必要ないデータまで置いている状態なので、 + メモリ領域を無駄に消費している</li> + <li>メモリ不足により、1920ピクセル分の + Z Buffer を確保できていない</li> + </ul> + </li> + <li>パイプラインの Read ステージだけでなく、 + Exec ステージでの DMA Read が必要</li> + <li>ユーザが勝手に DMA 命令を発行すると、 + DMA 完了待ちやデータ重複等、 + パイプラインの流れが崩れてしまう恐れがある</li> + </ul> + </ul> + </div> + + + <div class="slide"> + <h1>まとめと今後の課題</h1> + まとめ + <ul> + <li>Many Core Architecture 向けの Fine Grain Task OS を提案した</li> + <li>例題として、PS3用の Cerium Rendering Engine を記述した</li> + </ul> + + <br/> + 今後の課題 + <ul> + <li>プログラムコード及びデータの On demand Load の実装</li> + </ul> + </div> + + <!-- コピペ用 + <div class="slide"> + <h1></h1> + <ul> + <li></li> + <li></li> + </ul> + </div> + --> + + </div> <!-- class="presentation" --> + +</body> +</html>