view finalutf8.tex @ 0:8ccd555a6930

add pdf tex
author e065725@kinjyo.cr.ie.u-ryukyu.ac.jp
date Thu, 29 Oct 2009 16:18:01 +0900
parents
children c148a8712ac0
line wrap: on
line source

\documentclass[twocolumn,twoside,9.5pt]{jarticle}
\usepackage[dvips]{graphicx}

\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{\parpic{\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{ソフトウェアRenderingEngineの並列処理による高速化}
\author{065725F 金城裕 {}{} 指導教員 : 河野真治}
\date{}
\maketitle
\thispagestyle{fancy}

\section{概要}
近年、CPUの消費電力増加や、クロック周波数対効果の停滞により、 CPUコア数は増加傾向にある。コア数の増加にともない処理速度の向上が見込める。
しかし、 CPUのコア数が増加すると、コア数に見合った並列プログラミングを行う必要がある。

並列プログラミングを行う際、Amdahl則より、並列化を意識してプログラミングしなければならない。しかし、並列化を問題毎に毎回考えるのは面倒だ。ならば並列プログラミングを裏でサポートしてくれるソフトウェアを作ればよい。

研究では、Cellの並列プログラミングサポートフレームワークを開発する。当研究室で開発したCeriumは現在十分な並列化、また実行速度をサポートできていない。Cerium、特にRenderingEngine部分を改良し、信頼できる並列化サポートフレームワークを目指す


\section{Cell}
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.6]{pic/cell1.eps}
    \caption{Cellプロセッサの構成} \label{cell1}
  \end{center}
\end{figure}

\vspace{-6mm}
\section{Cerium}
当研究室ではCeriumと呼ばれるゲーム開発フレームワークがあり、以下の3つの要素から構成されている。

\begin{itemize}
\item SceneGraph
\item Rendering Engine
\item Task Manager
\end{itemize}
 
Ceriumは独自にRenderingEngineを持つ。ゲーム中のオブジャクトの振る舞いやルールはSceneGraphで管理し、それらの動きやレンダリングの処理を動的にSPEに割り振るカーネルとして、TaskMnagerが用いられる。
TaskManagerは、Taskと呼ばれる、分割された各プログラムを管理する。Taskの単位はサブルーチンまたは関数とし、Task同士の依存関係を考慮しながら実行していく。
現在Ceriumはlinux,macosx上で動作し、コンパイル方法によってCellのspeを使うかどうかを選択できる。

\section{RenderingEngine}
RenderingEngineでは、SceneGraphから、実際に表示するポリゴンの抽出、ポリゴンからSpanの生成、SpanにRGBをマッピングし描画する部分と3つに分ける事ができる。ここでいうSpanとは、ポリゴンに対するある特定のY座標に関するデータを抜き出したものである。
\subsection{光源}
RenderingEngineで、未実装だった光源の計算を実装した。各オブジェクトには自身の座標や親子関係などの情報を持っており、その中に法線がある。法線と光のベクトルとの内積をrgbにかけ算することにより光の計算を行っている。以下に抜粋したコードと、光源の計算をした画像を示す。

\newpage

\vspace{-3mm}
  \begin{figure}[htbp]
    \begin{center}
      {\tt {\small
        \begin{verbatim}

unsigned char rgb[4];
int light_rgb;
int flag;
float normal_vector[4] = {normal_x,normal_y,
                          normal_z,0};

float light_vector[4] = {0,0,-1,0};
float inner_product;

// 引数で受け取った color の rgb 情報の抜き出し
rgb[0] = (color & 0xff000000) >> 24;
rgb[1] = (color & 0x00ff0000) >> 16;
rgb[2] = (color & 0x0000ff00) >> 8;
rgb[3] = (color & 0x000000ff);

// 法線ベクトルと光源ベクトルとの内積をとる
inner_product = innerProduct(normal_vector,
                             light_vector);
// 内積がマイナスの場合は色がない。
flag = (inner_product > 0);
    
// 内積を rgb にかけていく
rgb[0] = (unsigned char)(rgb[0]*inner_product*flag);
rgb[1] = (unsigned char)(rgb[1]*inner_product*flag);
rgb[2] = (unsigned char)(rgb[2]*inner_product*flag);

//計算した rgb を light_rgb にまとめる。
light_rgb =   (rgb[0] << 24)
            + (rgb[1] << 16)
            + (rgb[2] << 8)
            + (rgb[3]);

      \end{verbatim}}}
    \caption{光源計算のコード} \label{lightcode}
  \end{center}
\end{figure}

\vspace{0mm}
\begin{figure}[htbp]
  \begin{center}
    \includegraphics[scale=0.4]{pic/ball.eps}
    \caption{光源計算をした描画画像} \label{ball}
  \end{center}
\end{figure}


現在、光源はppeだけを使ったfifo形式のみに実装されている。

\subsection{高速化}
CeriumのRenderingEngineは描画する対象がない部分も毎フレーム描画計算をしている。それでは計算する必要のない部分も計算してしまい、無駄な時間が生じる。そこで、描画する対象がない部分の計算は行わないようにすれば高速化が望める。

\vspace{0mm}
\begin{figure}[htbp]
  \begin{center}
    \includegraphics[scale=0.5]{pic/rendering1.eps}
    \caption{描画計算の範囲} \label{rendering}
  \end{center}
\end{figure}

\section{今後の課題}
光源がfifo形式でのみ有効になるので、Cellを使った並列処理をするときにも動作するように実装する。
RenderingEngineでの描画計算の際に、描画対象がない部分は計算しない実装に改良する。


\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/メインページ

\end{thebibliography}
\end{document}