Mercurial > hg > Papers > 2010 > yutaka-thesis
view resume/finalutf8.tex @ 2:f9330d7fcfb0
add resume
author | Yutaka_Kinjyo |
---|---|
date | Mon, 15 Feb 2010 19:37:42 +0900 |
parents | |
children | dadfafc34c6e |
line wrap: on
line source
\documentclass[twocolumn,twoside,9.5pt]{jarticle} \usepackage[dvipdfm]{graphicx} \usepackage{booktabs} \usepackage{fancyhdr} \pagestyle{fancy} \lhead{\includegraphics[height=1zw,clip,keepaspectratio]{pic/emblem-bitmap.eps}琉球大学主催 工学部情報工学科 卒業研究発表会} \rhead{} \cfoot{} \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}} \setlength{\headheight}{0mm} \setlength{\headsep}{5mm} \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}} \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}} \setlength{\textwidth}{181mm} \setlength{\textheight}{261mm} \setlength{\footskip}{0mm} \pagestyle{empty} \begin{document} \title{Cell上のソフトウェアレンダリングの高機能化と高速化} \author{065725F 金城裕 {}{} 指導教員 : 河野真治} \date{} \maketitle \thispagestyle{fancy} \section{Cell上のソフトウェアレンダリング} 我々は、8SPU+2PPUのヘテロCPU構成を持つCell / PS3 上での ソフトウェアレンダリングエンジン を開発中である。これは、Cerium Task Manager 上に実装され、琉球大学情報工学科の 3年生の実験で使用中である。PS3 のGraphics Engine の仕様は公開されていない ために、ソフトウェアレンダリングを 実装する必要がある。 ソフトウェアレンダリングは、SceneGraph、Polygon、Span、Z buffer の各段階があり、 それぞれの段階で、並列処理を行なう必要がある。現在は、Span の生成を1 SPU上で行ない、Z buffer を複数のSPU上で処理している。さらに、他の段階でも並列処理を 行なう必要がある。PPUよりもSPUの方が高速なので、1SPU 上で実行するだけでも 意味がある。 \vspace{-5mm} \section{ヘテロジニアス・マルチコアプロセッサCell} Cellは、1基の制御系プロセッサコア (PPE:PowerPc Processor ELement) と8基の演算系プロセッサコア (SPE:Synergistic Processor Element) で構成される。各プロセッサコアは、EIB (Element Interconnect Bus) と呼ばれる高速なバスで接続されている。また、EIBはメインメモリや外部入出力デバイスとも接続されていて、各プロセッサコアはEIBを経由してデータアクセスをおこなう。 この2種類のCPUをプログラマ自身が用途に合わせて適切に使い分けるように考慮する必要がある。 \vspace{-6mm} \section{Cerium} 当研究室ではCeriumと呼ばれるゲーム開発フレームワークがあり、以下の3つの要素から構成されている。\\ \vspace{-6mm} \begin{itemize} \item SceneGraph \vspace{-3mm} \item Rendering Engine \vspace{-3mm} \item Task Manager \end{itemize} Ceriumは独自にRenderingEngineを持つ。ゲーム中のオブジャクトの振る舞いやルールはSceneGraphで管理し、それらの動きやレンダリングの処理を動的にSPEに割り振るカーネルとして、TaskMnagerが用いられる。 TaskManagerは、Taskと呼ばれる、分割された各プログラムを管理する。Taskの単位はサブルーチンまたは関数とし、Task同士の依存関係を考慮しながら実行していく。 現在Ceriumはlinux,macosx上で動作し、コンパイル方法によってCellのspeを使うかどうかを選択できる。 \section{Rendering Engine} Rendering Engineは主に、CreatePolygonFromSceneGraph、CreateSpan、DrawSpanという3つのタスクから構成されている。 それぞれのタスクの動作とレンダリングの流れを示す。 \\ 1.CreatePolygonFromSceneGraph タスクによってSceneGraphをもとにモデリングデータから、実際に表示するポリゴンを生成する。\\ 2.CreateSpan タスクで生成したポリゴンからSpanの生成する。\\ 3.DrawSpan タスクでSpanをRGBにマッピングし描画する。\\ ここでいうSpanとは、ポリゴンに対するある特定のY座標に関するデータを抜き出したものである。 \vspace{0mm} \begin{figure}[htbp] \begin{center} \includegraphics[scale=0.4]{pic/rendering3.pdf} \caption{レンダリングの流れ} \label{rendering} \end{center} \end{figure} \vspace{-6mm} \section{レンダリングエンジンの高速化と高機能化} \subsection{光源の実装} レンダリングエンジンに光源処理の実装をした。光源は SceneGraph のオブジェクトと して実装され、SceneGraph 側から、操作できる。光源は点光源であり、光源数は 4 つに 設定している。 \vspace{0mm} \begin{figure}[htbp] \begin{center} \includegraphics[scale=0.4]{pic/nonlightearth.pdf} \includegraphics[scale=0.4]{pic/lightearth.pdf} \caption{光源実装前後の表示結果} \label{nonlightearth} \end{center} \end{figure} \subsection{実装手法} 光源処理は DrawSpan タスク内で行う。描画対象となる Span は法線ベクトルの情報 を持っている。光源の座標情報は、あらかじめ、各 SPE のローカルストアに確保してい る。描画対象のドット座標と光源の座標から光源ベクトルを求める。光源ベクトルと法線 ベクトルとの内積を計算し、rgb 値に乗算する。 \subsubsection{光源座標のLoad,Update} 光源座標のメモリ領域を各 SPE のローカルストアに確保するのは DataLoad タスクで 行う。確保された光源座標は DataUpdate タスクで、タスクに引数として渡された光源 座標に更新される。SPE 側でのメモリ領域の確保、参照には TaskManager の API を用 いている。%DataLoad タスクはレンダリングのはじめで各 SPE で実行される。DataUpdate タスクはSceneGraph を更新した後、DrawSpan タスクの前に実行される。 \subsubsection{光源処理のSIMD化} 光源処理の演算をSIMD演算で実装した。 Cell では、SPEに実装されている128ビットレジスタを用いてSIMD (Single Instruction Multiple Data)を行うことが 出来る。 SIMDとは、1つの命令で複数のデータに対して処理を行う演算方式である。 そのSIMDを用いて、本来4つの光源を計算するため同じ処理を4回行うところを、 1度の光源処理で4つ分の光源の計算を行うことができた。以下にSIMDを用いない場合の光源ベクトルの算出コードを示す。 \begin{verbatim} light_vector[0] = world_x - light_xyz[i*4]; light_vector[1] = world_y - light_xyz[i*4+1]; light_vector[2] = world_z - light_xyz[i*4+2]; light_vector[3] = light_xyz[i*4+3]; \end{verbatim} 次に上記のコードをSIMD化したコードを示す。 \begin{verbatim} *vlight_vector = spu_sub(v_world[i],vlight_xyz[i]); \end{verbatim} このように、SIMD演算を用いて、4つの演算命令を1つの演算命令で行うことができる。 \section{評価と課題} \subsection{実行速度評価} 光源を実装した後と、光源処理をSIMD化した時のFPS(Frame Per Second)を計測した。 計測対象として地球と月のオブジェクトを表示する例題プログラムを、Cell上のPPE1個、SPE6個で実行した。 以下にFPSを示す。 \begin{table}[htb] \caption{光源実装後の実行速度} \begin{center} \begin{tabular}{lrrrr} \toprule 光源数 & FPS \\ \midrule %未実装 & 8.286088 FPS \\ 1 & 7.568590 FPS \\ %2 & 7.448494 FPS \\ %3 & 7.341228 FPS \\ 4 & 7.211832 FPS \\ 4(SIMD) & 7.602995 FPS \\ \bottomrule \end{tabular} \end{center} \end{table} 計測結果より、SIMDを用いた4つ分の光源処理が、SIMDを用いていない処理より約 0.4FPS の速度向上が見られた。 また、SIMDを用いていない1つ分の光源処理との実行速度差が約 0.04FPS と近いものとなった。 このことより、SIMD化が有効に働いており、4つの分の光源処理を一度に処理できていると言える。 \subsection{課題} Rendering Engine はまだ、高速化の余地がある。今回の光源処理でも見られたように、各タスクでの演算をSIMD化することで高速化が望める。また SceneGraph から Polygon の生成はSPEによって並列実行されていない。Polygon 生成のタスクをSPEで並列実行することでも高速化が望める。 \thispagestyle{fancy} \begin{thebibliography}{9} \bibitem{1} 宮國渡 "Implementation of Fine-grain Task Manager for Cell" 平成20年度 学位論文(修士) \bibitem{2} 多賀野海人 "並列プログラミングを用いたゲームフレームワークの設計と実装" 2008年 卒業研究中間報告資料 \bibitem{3} fixstars: http://cell.fixstars.com/ps3linux/index.php/メインページ \bibitem{4} OpenCL: http://www.khronos.org/opencl/ \end{thebibliography} \end{document}