# HG changeset patch # User gongo # Date 1206546534 -32400 # Node ID a91e9596404542f32c7ebc500fe5309e5e89fffa # Parent 8748eb526921483b97c1f7636807ff29d0aafd64 *** empty log message *** diff -r 8748eb526921 -r a91e95964045 cerium-manager.tex --- a/cerium-manager.tex Wed Mar 26 17:17:27 2008 +0900 +++ b/cerium-manager.tex Thu Mar 27 00:48:54 2008 +0900 @@ -67,5 +67,149 @@ \end{verbatim} } -\input{manager-task} -\input{manager-cr} + +\subsubsection{Task の定義} +タスクの定義を以下に示す。 + +{\small +\begin{verbatim} + + class Task { + public: + int command; + int size; + unsigned int in_addr; + unsigned int out_addr; + struct task *self; + }; + + class HTask : public Task { + public: + TaskQueue wait_me; + TaskQueue wait_i; + CPU_TYPE cpu_type; + }; + +\end{verbatim} +} + +Task クラスは SPE が実行するタスクの単位オブジェクトである。 +SPE はメインメモリの \verb|in_addr| から DMA で入力データを取得し、 +command に対応するコードを実行し、 +結果を メインメモリの \verb|out_addr| に DMA で送信する。 +これらの処理はパイプラインに沿って動作する (\ref{sec:pipeline}) 。 + +HTask クラスは TaskManager で管理する実行前のタスクオブジェクトである。 +\verb|wait_me, wait_i| はタスク依存の条件 (\ref{sec:task}) に、 +\verb|cpu_type| は PPE と SPE のタスクの切り替え (\ref{sec:change}) に用いる。 + + +\subsubsection{スケジューラ} \label{sec:pipeline} +Cell ではそれぞれのコアがメインメモリを +直接参照することは出来ず、DMA 転送によりデータをやりとりする。 +DMA は CPU を介さず直接データ転送を行う方式である。 +SPE は DMA 完了を待たずに他の処理を行うことが出来るので、 +DMA のレイテンシを隠すことが出来る。 + +また、ダブルバッファリングを行うことで +パイプライン処理が可能となる (\figref{fig-pipeline}) 。 + +\begin{figure}[tb] + \begin{center} + \includegraphics[scale=0.43]{figure/pipeline.pdf} + \caption{Pipeline} + \label{fig-pipeline} + \end{center} +\end{figure} + +パイプライン処理を入れた Task Manager の Scheduler を以下に示す。 + +\begin{verbatim} + + do { + task3->write(); + task2->exec(); + task1->read(); + + taskTmp = task3; + task3 = task2; + task2 = task1; + task1 = task1->next(this, taskTmp); + } while (task1); + +\end{verbatim} + +Task Manager を \figref{fig-cerium} に適用させると、 +\figref{fig-manager-pipeline} のようにパイプライン的に動作する。 + +\begin{figure}[tb] + \begin{center} + \includegraphics[scale=0.36]{figure/manager-pipeline.pdf} + \caption{Task Manager が行う Pipeline} + \label{fig-manager-pipeline} + \end{center} +\end{figure} + +\subsubsection{Dependency} \label{sec:task} +Task Manager はタスク依存を解決する機能を持っている。 +以下は記述例である。 + +\begin{verbatim} + + // task2 は task1 が終了してから開始する + task2->set_depend(task1); + +\end{verbatim} + +タスク依存が満たされたものをアクティブキューにいれ、SPE を起動する。 +SPE はアクティブキューから、処理するコードとデータを取得し、 +自律的に実行を行う。 +終了したタスクは PPE に対して終了のコマンドを発行し、PPE はそれを見て +ウェイトキューのタスクを調べ、タスク依存を満たしたものが出てきたら +アクティブキューに入れ、SPE を再び起動する。 + +\subsubsection{PPE コードと SPE コードの互換性} \label{sec:change} +Cerium では、 SPE を用いる Cell 上でのみ動作するプログラムの他に、 +Linux や Mac OS X などで動く、アーキテクチャに依存しないプログラムを +記述することが可能である。 +依存しないプログラムの場合、スケジューラはもちろんメインメモリ上で +動作する。パイプライン処理は SPE と + +{\small +\begin{verbatim} + + task1->set_cpu(CPU_PPE); // PPE 上で実行される + task2->set_cpu(CPU_SPE); // SPE 上で実行される + +\end{verbatim} +} + +\subsubsection{PPE と SPE 間の同期} +\ref{sec:task} で述べたように、PPE から SPE へはタスクの実行命令を、 +SPE から PPE へはタスクの終了などを伝える必要がある。 +その際、待ち合わせを行うと処理が止まってしまい、並列度が下がってしまう。 + +Cell では、PPE と SPE 間のメッセージのやりとりには +Mailbox という FIFO メッセージキューを用いることができる。 +メッセージ交換なので待ち合わせを避けることが可能である。 + +%%PPE が SPE からメールを受け取る場合、 +%%\verb|spe_out_mbox_read()| という、 +%%SPE Runtime Management Library \cite{libspe2} を用いる。 +%%しかし、\verb|spe_out_mbox_read()| は Non-blocking function のため、 +%%busy-wait なメールの待ち方は避けるべきである。 +%%今回は、PPE 側でメールチェックを行う際に、SPE からのメールをチェックする。 +%% +%%PPE と SPE のメールチェックを分離させたい場合、 +%%メールをチェックする Blocking Function を作る必要がある。 +%% +%%もしくは SPE Event Handling を用いる手法もある。 +%%これは、メールが来たら event を起こすことを Event Handler に登録する。 +%%この場合、通常の Mailbox ではない、割り込み用の interrupting Mailbox を +%%使用しなくてはならない。 +%%interrupting Mailbox を使用する spe\_out\_intr\_mbox\_read() は、 +%%Event が起きたときに呼ばれるため Blocking Function である。 +%%SPE のどれかからメッセージが来たらポーリングによってメールチェックを行う。 +%% +%%今回は、PPE と SPE のメールチェックは分離しない実装をした。 +%% diff -r 8748eb526921 -r a91e95964045 cerium-scene_graph.tex --- a/cerium-scene_graph.tex Wed Mar 26 17:17:27 2008 +0900 +++ b/cerium-scene_graph.tex Thu Mar 27 00:48:54 2008 +0900 @@ -33,12 +33,12 @@ \end{itemize} \end{itemize} -Scene Graph の親子関係に沿って TransMatrix を計算し、Move(), Collision() を -実行することで Scene Graph 内のオブジェクトが変化する。 -Collision() によって Move() が変更され、Move() によって Coordinates や -Angle が変更される。ここが、\figref{fig-cerium} の Transform にあたる。 -計算が終わると、Gather で頂点を PolygonPack にまとめる。 -PolygonPack は光源の情報とテクスチャの情報、頂点の情報から構成される。 +%%Scene Graph の親子関係に沿って TransMatrix を計算し、Move(), Collision() を +%%実行することで Scene Graph 内のオブジェクトが変化する。 +%%Collision() によって Move() が変更され、Move() によって Coordinates や +%%Angle が変更される。ここが、\figref{fig-cerium} の Transform にあたる。 +%%計算が終わると、Gather で頂点を PolygonPack にまとめる。 +%%PolygonPack は光源の情報とテクスチャの情報、頂点の情報から構成される。 今回は Scene Graph の作成に、オープンソースの 3D モデリングツールである Blender \cite{blender} を用いる。Blender でオブジェクトを作成し、 diff -r 8748eb526921 -r a91e95964045 cerium_dev.tex --- a/cerium_dev.tex Wed Mar 26 17:17:27 2008 +0900 +++ b/cerium_dev.tex Thu Mar 27 00:48:54 2008 +0900 @@ -32,15 +32,3 @@ 段階 (\ref{list_dev_3}) から 段階 (\ref{list_dev_4}) へのプログラムの変換は 非常に容易である。Task Manager の API である set\_cpu() を用いることにより、 Task を PPE で実行するか SPE で実行するかを明示的に書くことが出来るからである。 - -{\small -\begin{verbatim} - - Task *task1 = create_task(cmd1,siz1,in1,out1); - Task *task2 = create_task(cmd2,siz2,in2,out2); - - task1->set_cpu(CPU_PPE); // PPE 上で実行される - task2->set_cpu(CPU_SPE); // SPE 上で実行される - -\end{verbatim} -} diff -r 8748eb526921 -r a91e95964045 manager-cr.tex --- a/manager-cr.tex Wed Mar 26 17:17:27 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -\subsubsection{パイプライン処理} -Cell ではそれぞれのコアがメインメモリを -直接参照することは出来ず、DMA 転送によりデータをやりとりする。 -DMA は CPU を介さず直接データ転送を行う方式である。 -SPE は DMA 完了を待たずに他の処理を行うことが出来るので、 -DMA のレイテンシを隠すことが出来る。 - -また、ダブルバッファリングを行うことで -パイプライン処理が可能となる (\figref{fig-pipeline}) 。 - -\begin{figure}[tb] - \begin{center} - \includegraphics[scale=0.43]{figure/pipeline.pdf} - \caption{Pipeline} - \label{fig-pipeline} - \end{center} -\end{figure} - -パイプライン処理を入れた Task Manager の Scheduler を以下に示す。 - -\begin{verbatim} - - do { - task3->write(); - task2->exec(); - task1->read(); - - taskTmp = task3; - task3 = task2; - task2 = task1; - task1 = task1->next(this, taskTmp); - } while (task1); - -\end{verbatim} - -Task Manager を \figref{fig-cerium} に適用させると、 -\figref{fig-manager-pipeline} のようにパイプライン的に動作する。 - -\begin{figure}[tb] - \begin{center} - \includegraphics[scale=0.36]{figure/manager-pipeline.pdf} - \caption{Task Manager が行う Pipeline} - \label{fig-manager-pipeline} - \end{center} -\end{figure} diff -r 8748eb526921 -r a91e95964045 manager-task.tex --- a/manager-task.tex Wed Mar 26 17:17:27 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -\subsubsection{Dependency} \label{sec:task} -Task Manager はタスク依存を解決する機能を持っている (set\_depend) 。 -タスク依存が満たされたものをアクティブキューにいれ、SPE を起動する。 -SPE はアクティブキューから、処理するコードとデータを取得し、 -自律的に実行を行う。 -終了したタスクは PPE に対して終了のコマンドを発行し、PPE はそれを見て -ウェイトキューのタスクを調べ、タスク依存を満たしたものが出てきたら -アクティブキューに入れ、SPE を再び起動する。 - - -\subsubsection{PPE と SPE 間の同期} -\ref{sec:task} で述べたように、PPE から SPE へタスクはの実行命令を、 -SPE から PPE へはタスクの終了などを伝える必要がある。 -その際、待ち合わせを行うと処理が止まってしまい、並列度が下がってしまう。 - -Cell では、PPE と SPE 間のメッセージのやりとりには -Mailbox という FIFO メッセージキューを用いることができる。 -メッセージ交換なので待ち合わせを避けることが可能である。 - -%%PPE が SPE からメールを受け取る場合、 -%%\verb|spe_out_mbox_read()| という、 -%%SPE Runtime Management Library \cite{libspe2} を用いる。 -%%しかし、\verb|spe_out_mbox_read()| は Non-blocking function のため、 -%%busy-wait なメールの待ち方は避けるべきである。 -%%今回は、PPE 側でメールチェックを行う際に、SPE からのメールをチェックする。 -%% -%%PPE と SPE のメールチェックを分離させたい場合、 -%%メールをチェックする Blocking Function を作る必要がある。 -%% -%%もしくは SPE Event Handling を用いる手法もある。 -%%これは、メールが来たら event を起こすことを Event Handler に登録する。 -%%この場合、通常の Mailbox ではない、割り込み用の interrupting Mailbox を -%%使用しなくてはならない。 -%%interrupting Mailbox を使用する spe\_out\_intr\_mbox\_read() は、 -%%Event が起きたときに呼ばれるため Blocking Function である。 -%%SPE のどれかからメッセージが来たらポーリングによってメールチェックを行う。 -%% -%%今回は、PPE と SPE のメールチェックは分離しない実装をした。 -%%