# HG changeset patch # User gongo # Date 1216020517 -32400 # Node ID 3ee6deaab278b009bf570fccf22524b3e6018bff # Parent 44fb87ea539a93e68fdc9cc30f277c9999600239 *** empty log message *** diff -r 44fb87ea539a -r 3ee6deaab278 cerium.tex --- a/cerium.tex Mon Jul 14 13:30:06 2008 +0900 +++ b/cerium.tex Mon Jul 14 16:28:37 2008 +0900 @@ -23,6 +23,8 @@ 行う。さらに、この 3 つのタスクは表示画面毎にパイプライン的に実行される。 そのため、Ceritum では並列度を維持することができる。 +Cerium は、C++ で実装されており、プログラム行数は 6075 行である。 + \subsection{Scene Graph} 本研究では、ゲーム中の一つの場面 (Scene) を構成するオブジェクトやその振る舞い、 ゲームのルールの集合を Scene Graph とする \cite{chiaki} 。 diff -r 44fb87ea539a -r 3ee6deaab278 compare.tex --- a/compare.tex Mon Jul 14 13:30:06 2008 +0900 +++ b/compare.tex Mon Jul 14 16:28:37 2008 +0900 @@ -36,16 +36,28 @@ \tabref{tab:hyoka3} より、SPE の台数を増やす事によって、 実行速度が向上しているのがわかる。 しかし、正しく台数効果が出ているとは言えない。 -原因として -\begin{enumerate} -\item アルゴリズムのミス -\item 効率的なデータ及びコード分割がされていない -\item 全てのタスクを SPE 上で実行していない \label{list:d3} -\end{enumerate} +%%原因として +%% +%%\begin{enumerate} +%%\item アルゴリズムのミス +%%\item 効率的なデータ及びコード分割がされていない +%%\item 全てのタスクを SPE 上で実行していない \label{list:d3} +%%\end{enumerate} +%% +%%等といった事が考えられる。 +%%ここでは、原因(\ref{list:d3})について考察する。 -等といった事が考えられる。 -ここでは、原因(\ref{list:d3})について考察する。 +今回の実験環境で、SPE 上で実行している Rendering タスクの処理は、 +PPE から取得した Span から、実際に描画する RGB 値を計算して FrameBuffer に +書き込む事である。将来的にシェーディングやアルファブレンディングを +実装する事になるが、現在はそこまで多くの計算をしているわけではない。 +主に PPE からの大量の Span データの取得、 +そして FrameBuffer へのメモリコピーとなる。 +従って、今回の実験結果は、Rendering タスク内のメモリネックが +影響しているものと考えられる。 +この事に関し、描画領域を広げ、メモリコピーの量を増やす事で +検証していく必要がある。 %その原因として、TaskManager の実装の不備があげられる。 @@ -59,9 +71,9 @@ %全てのタスクを SPE 上で実行できるようになれば、 %実行速度はさらに向上すると考えられる。 +また、Rendering のタスクだけを SPE 上で実行しているのは、 SPE の 256KB という容量では、現在の Cerium の全てのタスクを -SPE 上に乗せる事は出来ないため、\tabref{tab:hyoka1} のように -Rendering のタスクだけを SPE 上で実行している。 +SPE 上に乗せる事が出来ないからである。 これを回避するために、SPE プログラムの on-demand load の実装が必要となる。 実装の方法として、以下のような手段が考えられる。 diff -r 44fb87ea539a -r 3ee6deaab278 ess2008.bib --- a/ess2008.bib Mon Jul 14 13:30:06 2008 +0900 +++ b/ess2008.bib Mon Jul 14 16:28:37 2008 +0900 @@ -31,6 +31,14 @@ year = 2005 } +@article{gongo2, +author = "{Wataru MIYAGUNI}", +title = "{Cell 用の Fine-grain Task Manager の実装}", +journal = "{情報処理学会 システムソフトウェアとオペレーティング・システム研究会}", +year = 2008, +month = April +} + @journal{chiaki, author = "{Chiaki SUGIYAMA}", title = "{SceneGraph と StatePattern を用いたゲームフレームワークの設計と実装}", @@ -75,3 +83,9 @@ journal = "{IBM PROVISION No.48}", year = 2006 } + +@misc{sdl, +author = "", +title = "{Simple DirectMedia Layer}", +howpublished = "\url{http://www.libsdl.org/}" +} \ No newline at end of file diff -r 44fb87ea539a -r 3ee6deaab278 ess2008.tex --- a/ess2008.tex Mon Jul 14 13:30:06 2008 +0900 +++ b/ess2008.tex Mon Jul 14 16:28:37 2008 +0900 @@ -72,6 +72,7 @@ \input{manycore} % many core system \input{task_manager} % Task Manager \input{dev} % 開発過程 +\input{student} % 学生の反応 \input{cerium} % Cerium \input{compare} % 評価と考察 \input{conclusion} % まとめ diff -r 44fb87ea539a -r 3ee6deaab278 student.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/student.tex Mon Jul 14 16:28:37 2008 +0900 @@ -0,0 +1,45 @@ +\section{学生によるTaskManagerを用いた開発} +4月から6月にかけて、学生に TaskManager を用いて +簡単な並列プログラムを書いてもらった。 +開発環境は Mac OS X と PS3 Linux である。 +ここでは学生の反応について報告する。 + +\subsection{タスクの概念} +最初は Hello, World のプログラムを書かせた。 +通常のCのプログラムと違い、「Hello, World」を表示させる部分を +タスクとして記述する、そのタスクを SPE 上で実行するということが +理解しきれない学生がいた。 +TaskManager の仕様だけでなく、Cell のような並列実行環境についても +学ぶ必要があった。 + +\subsection{タスクへのデータ入出力} +SPE へ整数の配列を DMA で送り、各要素を2倍にして +PPE へ DMA で戻すというプログラムを書かせた。 +Cell の DMA にはアライメントの問題があり、 +Cell の仕様を理解しきれていない学生が居た。 +TaskManager ではその部分を意識させないようにしている +(\tabref{tab:tm-api}:\verb|TaskManager::allocate(size);|)。 + +\subsection{画像の拡大縮小回転、色の変換} +文献\Cite{gongo2} の TaskManager では、 +タスクに対して入出力は一つずつしか設定できなかった。 +しかし、画像の複数の行を読み込む際、メモリアドレスに間が出来るため、 +一つの入力出力では足りないという学生からの意見があった。 +そこで新たに、複数の入出力を設定できる \verb|add_inData()、add_outData()| +を追加した。これらで設定したデータはリスト構造になっており、 +Cell の場合、 MFC List DMA \cite{cell} の機能を使用してDMA を行っている。 + +また、送ったピクセルデータの長さやその他のパラメータも送りたいという意見から、 +32ビットパラメーターを複数送れる \verb|add_param()| というAPIを追加した。 + +画像の読み込みは SDL \cite{sdl} を使用しており、 +最初学生は生成された SDL のデータ構造 (SDL\_Surface) を +そのまま SPE に送っていた。 +SDL\_Surface にあるピクセルデータはアドレスしか無く、実体はPPE 側にしかない。 +しかし、SPE 側で PPE と同じようにそのアドレスを読みに行くということをする +学生が多かった。ここでも SPE の仕様に関して学ぶ必要があった。 + +その問題を回避するために、アドレスではなくデータを、SDL\_Surface ではなく、 +自分たちが作ったタスクに合うようなデータ構造への変換を行った。 + +\subsection{ソートプログラム} diff -r 44fb87ea539a -r 3ee6deaab278 task_manager.tex --- a/task_manager.tex Mon Jul 14 13:30:06 2008 +0900 +++ b/task_manager.tex Mon Jul 14 16:28:37 2008 +0900 @@ -10,13 +10,15 @@ \hbox to\hsize{\hfil \begin{tabular}{c|l} \hline \hline create\_task & Task を生成する \\ \hline + run & 実行 Task Queue の実行 \\ \hline + allocate & 環境のアライメントを考慮した allocater \\ \hline + \hline add\_inData & Task への入力データのアドレスを追加 \\ \hline add\_outData & Task からのデータ出力先アドレスを追加 \\ \hline add\_param & Task のパラメータ (32 bits) \\ \hline wait\_for & Task の依存関係の考慮 \\\hline set\_cpu & Task を実行する CPU の設定 \\ \hline spawn & Task を実行 Task Queue に登録する \\ \hline - run & 実行 Task Queue の実行 \\ \hline \end{tabular}\hfil} \end{table}