Mercurial > hg > Papers > 2008 > akira-ieice
changeset 4:00ef3b6ef98a
*** empty log message ***
author | akira |
---|---|
date | Tue, 04 Mar 2008 19:09:01 +0900 |
parents | 4ee5cef03d5f |
children | cba427f17200 |
files | bibitem.tex cbc.tex debug.tex fig/pipeline.bb fig/pipeline.pdf fig/span.bb fig/span.graffle fig/span.pdf multicore.tex rendering.tex src/fact.c thesis.tex |
diffstat | 12 files changed, 100 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/bibitem.tex Tue Mar 04 13:41:40 2008 +0900 +++ b/bibitem.tex Tue Mar 04 19:09:01 2008 +0900 @@ -4,4 +4,6 @@ 日本ソフトウェア科学会第17回大会, 2000. \bibitem{bib:Mesa} OSMesa. http://www.mesa3d.org/ +\bibitem{bib:Blender} +Blender. http://www.blender.org/ \end{thebibliography}
--- a/cbc.tex Tue Mar 04 13:41:40 2008 +0900 +++ b/cbc.tex Tue Mar 04 19:09:01 2008 +0900 @@ -1,7 +1,10 @@ \section{CbCの概要} CbCはC言語からループ制御構造とサブルーチンコールを取り除き、継続を導入し た言語である\cite{bib:CbC}。code-segmentは引数付きgotoで接続することで継 -続を実現する。 +続を実現する。以下は階乗の計算の例題である。\\ +\begin{small} +\input{src/fact.c} +\end{small} code-segmentはキーワードcodeを用いることで関数のように定義される。引数部 分はinterfaceと呼ぶ。code-segmentからの脱出は引数付きgotoである。よって CbCのプログラムは複数のcode-segmentがgotoで接続された物になる。(図\ref{fig:cbc-goto})
--- a/debug.tex Tue Mar 04 13:41:40 2008 +0900 +++ b/debug.tex Tue Mar 04 19:09:01 2008 +0900 @@ -1,7 +1,9 @@ \section{シミュレーションによるデバッグ} 前述したCbCをいったんシーケンシャルなアルゴリズムで実装することにより、 デバッグが可能となる。 +\begin{small} \input{src/debug.c} +\end{small} ここではcode-segmentの頭にPPUがついたものがPPUが実行される物で、SPUがついたものがSPUで実行されるものとして表される。\\ 実際の環境ではSPUがついたものがタスクマネージャによってSPUにロードされ実 行されることになる。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fig/pipeline.bb Tue Mar 04 19:09:01 2008 +0900 @@ -0,0 +1,5 @@ +%%Title: ./pipeline.pdf +%%Creator: ebb Version 0.5.2 +%%BoundingBox: 0 0 473 410 +%%CreationDate: Tue Mar 4 19:36:25 2008 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fig/span.bb Tue Mar 04 19:09:01 2008 +0900 @@ -0,0 +1,5 @@ +%%Title: ./span.pdf +%%Creator: ebb Version 0.5.2 +%%BoundingBox: 0 0 552 278 +%%CreationDate: Tue Mar 4 18:07:56 2008 +
--- a/multicore.tex Tue Mar 04 13:41:40 2008 +0900 +++ b/multicore.tex Tue Mar 04 19:09:01 2008 +0900 @@ -1,7 +1,9 @@ \section{マルチコアシステムの要求仕様} -ここでは簡単な例題としてCell上のDMA転送について考える。 +ここでは例題としてCell上のDMA転送について考える。 DMAを用いたSPEプログラムは基本的に次のようになる。 +\begin{small} \input{src/spe.c} +\end{small} この例で示したように、Cell上でSPEを用いる場合、次のような要素がまず必要になる。 \begin{itemize} \item 実行プログラム @@ -9,4 +11,4 @@ \item 入力データサイズ \item 出力データアドレス \end{itemize} -その後でRead、Exec、Writeという構造でCellのプログラムは記述できる。 +その後でRead、Exec、Writeという構造でCellのプログラムは記述できる。またReadとWriteはDMAで行われるためパイプライン形式で実行が可能となっている。f
--- a/rendering.tex Tue Mar 04 13:41:40 2008 +0900 +++ b/rendering.tex Tue Mar 04 19:09:01 2008 +0900 @@ -11,13 +11,28 @@ ムのルールの集合をSceneGraphとする。SceneGraphの各ノードがゲームの一部で あるオブジェクトのファイルやゲームのルールとなり、ノードをたどり実行する ことでゲームの中の一つの場面となる。SceneGraphはゲームプログラムとしての -条件を満たす物なので、一つのSceneGraphで小さなゲームと言える。\\ +条件を満たす物なので、一つのSceneGraphで小さなゲームと言える。SceneGraph +はBlender3Dモデリングツール\cite{bib:Blender}から出力されるxmlをパースし、 +ポリゴンを取得する。ポリゴンとは図\ref{fig:SPAN}の三角形の各頂点の値のこ +とである。そのポリゴン座標を次の動作を汲み取った上で、動作に伴う行列演算 +を行う。 +\begin{figure}[htb] +\begin{center} +\includegraphics[scale=.4]{fig/span.pdf} +\end{center} +\caption{データ構造} +\label{fig:SPAN} +\end{figure} +\\ レンダリングエンジンはOSMesaの機能を簡素化し、よりシンプルに設計されたフ レームワークである。OSMesaではいろいろな機能を付加し続けた結果、様々な計 算の部分でコピーがたくさん行われていた。それはCPUに多大な負荷を与えると ともに動作が遅くなる大きな要因となっていた。そこで我々が提案するレンダリ ングエンジンはシーングラフからポリゴンの各頂点を受け取り、頂点からSPANを -生成し、SPANに対応するテクスチャを生成するシンプルな物を目指す。\\ +生成し、SPANに対応するテクスチャを生成するシンプルな物を目指す。ここで +SPANとは図\ref{fig:SPAN}のポリゴンに対するある特定のY座標に関数データを +抜き出した構造体で、そのSPANに対応するテクスチャは右の図のあるラインに対 +応する。\\ タスクマネージャはタスクを管理するライブラリで、タスクと呼ばれる分割され た各プログラムを依存関係を考慮しながらメモリ上にマッピングし、SPU上では そのプログラムをDMAによりロードする。(図\ref{fig:taskmanager})\\ @@ -28,14 +43,43 @@ \caption{タスクマネージャ} \label{fig:taskmanager} \end{figure} +\\ これらをCbCで実装すると次のようになる。 +\begin{small} \input{./src/render.c} +\end{small} 上記のソースはシーケンシャルなアルゴリズムでの実装コードである。 SCENEGRAPH2POLYGONではシーングラフの計算を行い、ポリゴンの情報から回転や 拡大、平行移動などの計算を行い、ポリゴンの情報を次のcode-segmentに渡す。 POLYGON2SPANでも同様に、受け取ったPOLYGONからSPANを出力する。SPAN2DRAWで も基本的に変わらないが、ここで終了条件をみることになる。\\ -これらのcode-segmentはすべてSPUで実行される。SPUで実行するときは前述した -通り、入力データアドレス、入力データサイズ、出力データアドレスが必要とな -る。これらはタスクマネージャに登録される。 -タスクマネージャは登録されたcode-segmentをみて、プログラムのロードを行い、入力データの読み込み、計算、出力データの書き出しを行う。 +これらのcode-segmentはすべてSPUで実行される。しかし、これだけでは足りな +い。実際にはSPUにテクスチャ情報をロードするcode-segmentが存在する。SPUで +実行するときは前述した通り、入力データアドレス、入力データサイズ、出力デー +タアドレスが必要となる。これらはタスクマネージャに登録される。 +タスクマネージャは次のような関数で実行することができる。 +\begin{table}[htb] +\begin{center} +\begin{tabular}{|c|c|} +\hline +set\_symbol & タスクのID登録 \\ \hline +open & IDの取得 \\ \hline +create\_task & タスクを作る \\ \hline +spawn\_task & 実行タスクQueueに追加 \\ \hline +set\_depend & 依存関係の考慮 \\ \hline +run & 実行タスクQueueの実行 \\ \hline +\end{tabular} +\caption{タスクマネージャの関数} +\label{table:task_func} +\end{center} +\end{table} +\\ +タスクマネージャは登録されたcode-segmentをみて、プログラムのロードを行い、 +入力データの読み込み、計算、出力データの書き出しを行う。タスクマネージャはPPUで実行するかSPUで実行するかを明示的に書くことができる。またSPUを使う場合はSPUコアを使うことができる。そうすると、以下のようなことができる可能性もある。 +\begin{figure}[htb] +\begin{center} +\includegraphics[scale=.5]{./fig/pipeline.pdf} +\end{center} +\caption{タスクマネージャが行うパイプライン} +\label{fig:pipeline} +\end{figure}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fact.c Tue Mar 04 19:09:01 2008 +0900 @@ -0,0 +1,27 @@ +\begin{verbatim} +__code factorial(int n,int result,int orig, + __code(*print)(),__code(*exit1)(), + void *exit1env) +{ + if (n<0) { + printf("#0005:err %d!\n",n); + goto (*exit1)(0),exit1env; + } + if (n==0) + goto (*print)(n,result,orig, + print,exit1,exit1env); + else { + result *= n; + n--; + goto factorial(n,result,orig, + print,exit1,exit1env); + } +} + +int main( int ac, char *av[]) +{ + int n; + n = 10; + goto factorial(n,1,n,print,return,environment); +} +\end{verbatim}
--- a/thesis.tex Tue Mar 04 13:41:40 2008 +0900 +++ b/thesis.tex Tue Mar 04 19:09:01 2008 +0900 @@ -15,7 +15,7 @@ \def\BibTeX{{\rmfamily B\kern-.05em{\scshape i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125em X}} -\jtitle{CからCellアーキテクチャを利用したCbCへの変換} +\jtitle{Cellアーキテクチャを利用したCbCの応用} \jsubtitle{} \etitle{ Conversion to CbC which used the Cell architecture from C } \esubtitle{}