view resume/finalutf8.tex @ 4:986baf7fad44

amend
author Yutaka_Kinjyo
date Tue, 16 Feb 2010 08:34:57 +0900
parents dadfafc34c6e
children 891d6c50c05c
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{0mm}
\begin{figure}[htbp]
  \begin{center}
    \includegraphics[scale=0.3]{pic/cell_arch.pdf}    
    \caption{Cell Broadband Engine Architecture} \label{cell}
  \end{center}
\end{figure}

\vspace{-8mm}
\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上で動作し、コンパイル方法によってアーキテクチャを切り替えられる。

\vspace{-6mm}
\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{-8mm}
\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を用いない場合の光源ベクトルの算出コードを示す。

そのSIMDを用いて、本来4命令である処理を、1命令で行うことができる。これにより光源処理の命令数を減らすことができた。
以下に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つの演算命令で行っている。

\vspace{-6mm}
\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 と近いものとなった。
光源数4のSIMDを用いた光源処理と、用いていない処理で、SIMDを用いた処理の方が約 0.4FPS の速度向上があった。また光源数1のSIMDを用いていない光源処理と比較すると 約 0.04FPS と近いものになった。


このことより、SIMD化によって光源数4の処理を、光源数1の処理とほぼ同じ速度で実行できたと言え、実行速度が向上したことがわかる。
%FPSは光源処理部分だけでなく、Cerium全体を対象としているため、
%光源処理の速度が4倍になってもFPSが4倍になるわけではない。
%光源数が1から4になり光源処理の計算が4倍なっても、FPSが4分の1になるわけではない。

\vspace{-6mm}
\subsection{まとめ}
%Rendering Engine はまだ、高速化の余地がある。今回の光源処理でも見られたように、各タスクでの演算をSIMD化することで高速化が望める。また SceneGraph から Polygon の生成はSPEによって並列実行されていない。Polygon 生成のタスクをSPEで並列実行することでも高速化が望める。

本研究ではCell上のソフトウェアレンダリングに光源機能を実装し、SIMD演算を用いることで高速化を行った。
WordCount\\
ZeroClear タスク
Mail Time


\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}