Mercurial > hg > Papers > 2010 > yutaka-thesis
view resume/finalutf8.tex @ 3:dadfafc34c6e
amendment
author | Yutaka_Kinjyo |
---|---|
date | Tue, 16 Feb 2010 03:46:18 +0900 |
parents | f9330d7fcfb0 |
children | 986baf7fad44 |
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上のソフトウェアレンダリング} 我々は、8SPE+2PPEのヘテロCPU構成を持つCell / PS3 上での ソフトウェアレンダリングエンジン を開発中である。これは、Cerium Task Manager 上に実装され、琉球大学情報工学科の 3年生の実験で使用中である。PS3 のGraphics Engine の仕様は公開されていない ために、ソフトウェアレンダリングを 実装する必要がある。 ソフトウェアレンダリングは、SceneGraph、Polygon、Span、Z buffer の各段階があり、 それぞれの段階で、並列処理を行なう必要がある。現在は、Span の生成を1 SPE上で行ない、Z buffer を複数のSPE上で処理している。さらに、他の段階でも並列処理を 行なう必要がある。PPEよりもSPEの方が高速なので、1SPE 上で実行するだけでも 意味がある。 \vspace{-5mm} \section{Cell BROADBAND ENGINE} 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が用いられる。 現在Ceriumはlinux,macosx上で動作し、コンパイル方法によってアーキテクチャを切り替えられる。 \section{Task Manager} TaskManagerは、タスクと呼ばれる、分割された各プログラムを管理する。タスクの単位はサブルーチンまたは関数とし、タスク同士の依存関係を考慮し、実行可能状態になったタスクを各SPEに割り振る。タスクは通常PPEスレッドで生成され、SPEスレッドに送られる。 SPEスレッドでは、受け取ったタスクをパイプラインに沿ってステージを遷移しながら複数のタスクを同時に実行していく。 \vspace{-6mm} \section{Rendering Engine} Rendering Engineは主に、CreatePolygonFromSceneGraph、CreateSpan、DrawSpanという3つのタスクから構成されている。 それぞれのタスクの動作とレンダリングの流れを示す。 {\small \begin{enumerate} \item CreatePolygonFromSceneGraph タスクによってSceneGraphをもとにモデリングデータから、実際に表示するポリゴンを生成する。 \item CreateSpan タスクで生成したポリゴンからSpanの生成する。 \item DrawSpan タスクでSpanをRGBにマッピングし描画する。 ここでいうSpanとは、ポリゴンに対するある特定のY座標に関するデータを抜き出したものである。 \end{enumerate} } \vspace{0mm} \begin{figure}[htbp] \begin{center} \includegraphics[scale=0.4]{pic/rendering3.pdf} \caption{レンダリングの流れ} \label{rendering} \end{center} \end{figure} \vspace{-10mm} \section{レンダリングエンジンの高速化と高機能化} \subsection{光源の実装} Rendering Engine に光源処理の実装をした。光源は 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} \vspace{-6mm} \subsection{実装手法} 光源処理は DrawSpan タスク内で行う。描画対象となる Span は法線ベクトルの情報 を持っている。光源の座標情報は、あらかじめ、各 SPE のローカルストアに確保してい る。描画対象のドット座標と光源の座標から光源ベクトルを求める。光源ベクトルと法線 ベクトルとの内積を計算し、rgb 値に乗算する。 それにより描画されるrgb値が、点光源の位置から 光のあたり具合を考慮にいれた値になる。 \vspace{-6mm} \subsubsection{光源座標の Load,Update の為のタスク} 光源実装のために DataLoad タスクと DataUpdate タスクを実装した。 DataLoad タスクは指定されたサイズ分の領域をSPEに確保するタスクである。 光源座標のメモリ領域を各 SPE のローカルストアに確保するために使用している。 DataUpdate タスクは DataLoad タスクで確保された領域に、指定されたデータを書き込むタスクである。 確保された領域の光源座標情報を更新するために使用している。 SPE 側でのメモリ領域の確保、参照には TaskManager の API を用いている。 \vspace{-6mm} \subsubsection{光源処理のSIMD化} 光源処理の演算をSIMD演算で実装した。 Cell では、SPEに実装されている128ビットレジスタを用いてSIMD (Single Instruction Multiple Data)を行うことが 出来る。 SIMDとは、1つの命令で複数のデータに対して処理を行う演算方式である。 そのSIMDを用いて、本来4つの光源を計算するため同じ処理を4回行うところを、 1度の光源処理で4つ分の光源の計算を行うことができた。以下にSIMDを用いない場合の光源ベクトルの算出コードを示す。 {\small \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化したコードを示す。 {\small \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個で実行した。解像度は1920×1080である。 以下にFPSを示す。 %2 & 7.448494 FPS \\ %3 & 7.341228 FPS \\ \vspace{3mm} \begin{table}[htb] \begin{center} \vskip -\lastskip \vskip -20pt \caption{SIMD を用いることによる実行速度の比較} \hbox to\hsize{\hfil \begin{tabular}{c|l|l} \hline \hline & SIMDなし(FPS) & SIMDあり (FPS)\\ \hline \hline %Mac OSX & 7.0 & 8.5\\ \hline Cell (光源数 1) & 7.56 & 8.12 \\ \hline Cell (光源数 4) & 7.21 & 7.60 \\ \hline \end{tabular}\hfil} \label{tb:lightspeed} \end{center} \end{table} \vspace{-5mm} 計測結果より、SIMDを用いた4つ分の光源処理が、SIMDを用いていない処理より約 0.4FPS の速度向上が見られた。 また、SIMDを用いていない1つ分の光源処理との実行速度差が約 0.04FPS と近いものとなった。 このことより、SIMD化が有効に働いており、4つの分の光源処理を一度に処理できていると言える。 FPSはCerium全体の実行速度を対象としているため、光源数が1から4になり光源処理の計算が4倍 なっても、FPSが4分の1になるわけではない。 \vspace{-6mm} \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{3} fixstars: http://cell.fixstars.com/ps3linux/index.php/メインページ \bibitem{4} OpenCL: http://www.khronos.org/opencl/ \end{thebibliography} \end{document}