Mercurial > hg > Papers > 2008 > gongo-sigos
changeset 14:091d888f7729
*** empty log message ***
author | gongo |
---|---|
date | Thu, 27 Mar 2008 02:24:48 +0900 |
parents | a91e95964045 |
children | 6c558cd2ac8b |
files | cerium-manager.tex cerium_dev.tex osmesa.tex sigos2008.pdf |
diffstat | 4 files changed, 58 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/cerium-manager.tex Thu Mar 27 00:48:54 2008 +0900 +++ b/cerium-manager.tex Thu Mar 27 02:24:48 2008 +0900 @@ -53,9 +53,6 @@ task2 = create_task(CMD_RUN2, size2, in_addr2, out_addr2); - // task2 は task1 が終了してから開始する - task2->set_depend(task1); - task1->spawn(); task2->spawn(); @@ -67,11 +64,11 @@ \end{verbatim} } +ここからは、Task Manager を構成する特徴について述べる。 \subsubsection{Task の定義} タスクの定義を以下に示す。 -{\small \begin{verbatim} class Task { @@ -85,13 +82,17 @@ class HTask : public Task { public: + // 自分を待っているタスクキュー TaskQueue wait_me; + + // 自分が待つタスクキュー TaskQueue wait_i; + + // 実行する CPU CPU_TYPE cpu_type; }; \end{verbatim} -} Task クラスは SPE が実行するタスクの単位オブジェクトである。 SPE はメインメモリの \verb|in_addr| から DMA で入力データを取得し、 @@ -99,6 +100,15 @@ 結果を メインメモリの \verb|out_addr| に DMA で送信する。 これらの処理はパイプラインに沿って動作する (\ref{sec:pipeline}) 。 +また、SPE が Task を取得する際、一つずつではなく、Task の集合である +TaskList を DMA で取得する。DMA の回数を抑えることで +実行速度を上げるためであるが、TaskList のサイズを大きくしすぎると +SPE の LS に入らなくなる可能性がある。本研究で並列に実行するタスクの数は、 +\figref{fig-cerium} の (SceneGraph $\rightarrow$ Polygonpack) タスクと +(PolygonPack $\rightarrow$ SpanPack) タスク、そして SpanPack の数 $\times$ +Rendering タスクとなる。そのため、SPE を 6 個使うと考えると +TaskList に格納する Task の数は最大で 25 としている。 + HTask クラスは TaskManager で管理する実行前のタスクオブジェクトである。 \verb|wait_me, wait_i| はタスク依存の条件 (\ref{sec:task}) に、 \verb|cpu_type| は PPE と SPE のタスクの切り替え (\ref{sec:change}) に用いる。 @@ -110,7 +120,6 @@ DMA は CPU を介さず直接データ転送を行う方式である。 SPE は DMA 完了を待たずに他の処理を行うことが出来るので、 DMA のレイテンシを隠すことが出来る。 - また、ダブルバッファリングを行うことで パイプライン処理が可能となる (\figref{fig-pipeline}) 。 @@ -122,10 +131,12 @@ \end{center} \end{figure} -パイプライン処理を入れた Task Manager の Scheduler を以下に示す。 +パイプライン処理を入れたスケジューラを以下に示す。 \begin{verbatim} + SpeTaskBase *task1, *task2, *task3; + do { task3->write(); task2->exec(); @@ -134,11 +145,14 @@ taskTmp = task3; task3 = task2; task2 = task1; - task1 = task1->next(this, taskTmp); + task1 = task1->next(); } while (task1); \end{verbatim} +TaskList にある Task が全て終了し、PPE からプログラム終了のメッセージを +受け取ったら while 文を抜ける。 + Task Manager を \figref{fig-cerium} に適用させると、 \figref{fig-manager-pipeline} のようにパイプライン的に動作する。 @@ -150,7 +164,19 @@ \end{center} \end{figure} -\subsubsection{Dependency} \label{sec:task} +SpeTaskBase クラスは、スケジューラによって実行されるオブジェクトである。 +スケジューラ自身のタスクとして、以下のようなタスクがある。 +これらのオブジェクトは全て SpeTaskBase を継承している。 + +\begin{itemize} +\item SpeMail : PPE からのメッセージを待つ +\item SpeTaskList : PPE から TaskList を取得する +\item SpeTask : TaskList にある Task を実行する +\item SpeExit : SPE を終了させる +\end{itemize} + + +\subsubsection{タスク依存} \label{sec:task} Task Manager はタスク依存を解決する機能を持っている。 以下は記述例である。 @@ -169,11 +195,15 @@ アクティブキューに入れ、SPE を再び起動する。 \subsubsection{PPE コードと SPE コードの互換性} \label{sec:change} -Cerium では、 SPE を用いる Cell 上でのみ動作するプログラムの他に、 -Linux や Mac OS X などで動く、アーキテクチャに依存しないプログラムを +Cerium では、 SPE を用いる Cell 上でのみ動作する SPE プログラムの他に、 +Linux や Mac OS X などで動く、アーキテクチャに依存しない FIFO プログラムを 記述することが可能である。 -依存しないプログラムの場合、スケジューラはもちろんメインメモリ上で -動作する。パイプライン処理は SPE と +FIFO プログラムの場合、スケジューラはメインメモリ上で動作する。 +DMA 命令は、バッファのアドレス参照によりシミュレートする。 +パイプライン処理も、SPE プログラムと同様の動作を行う。 + +Task Manager には、タスクを PPE、SPE のどちらで動かすかを決める +機能がある (\verb|set_cpu|) 。 {\small \begin{verbatim} @@ -184,6 +214,19 @@ \end{verbatim} } +これを用いることにより、環境依存によるプログラム変換は +分割したタスクの部分だけとなり、全体の変換は必要ない。 + +このことはデバッグにおいても有効である。 +デバッグが困難な並列プログラムである SPE プログラムの前に、 +まずは FIFO プログラムで開発を進める。 +FIFO プログラムはシーケンシャルな記述なため、 +二分法を用いたデバッグが可能となる。 +仕様やアルゴリズムの正しさを確認できたら、SPE プログラムに移行する。 +デバッグに関する詳細は第 \ref{cerium_dev} 節で述べる。 + + + \subsubsection{PPE と SPE 間の同期} \ref{sec:task} で述べたように、PPE から SPE へはタスクの実行命令を、 SPE から PPE へはタスクの終了などを伝える必要がある。
--- a/cerium_dev.tex Thu Mar 27 00:48:54 2008 +0900 +++ b/cerium_dev.tex Thu Mar 27 02:24:48 2008 +0900 @@ -1,4 +1,4 @@ -\section{Cerium によるゲーム開発} +\section{Cerium によるゲーム開発} \label{cerium_dev} Cerium 自身や Cerium を用いた開発では、以下の段階にそれぞれ実装とテストを行う。 \begin{enumerate}
--- a/osmesa.tex Thu Mar 27 00:48:54 2008 +0900 +++ b/osmesa.tex Thu Mar 27 02:24:48 2008 +0900 @@ -1,4 +1,4 @@ -\section{OSMesa/SDL を用いたゲームプログラミング} +\section{OSMesa/SDL を用いた Cell 上でのゲームプログラミング} 先行研究 \cite{akira} では、Frame Buffer Engine 用のレンダリングエンジンである OSMesa \cite{osmesa} と、マルチメディアライブラリの SDL \cite{sdl} の二つを 用いて開発を行った。