view paper/implement.tex @ 19:b250db0fada8

Cerium chapter done. chapter 4 not yet.
author tkaito
date Thu, 03 Feb 2011 00:48:58 +0900
parents a2eb8fb059c3
children 6b53dcfaab84
line wrap: on
line source

\chapter{Task を用いたパイプラインの改良} \label{chapter:implement}

\section{CPU スレッドの実装}

各 CPU では、メインスレッドで生成された Task を受け取り、その情報を元に Task を実行する。ここでは、Task を
扱う Scheduler の実装と、Task の本体となる部分についての説明と改良された点についての説明を行う。

\subsection{Scheduler}

生成された Task に従って実際の Task を実行するのが Scheduler である。Scheduler は、メインスレッドで
生成された Task List を受け取り、その中にある Task をパイプラインに沿って、ステージを遷移
しながら実行していく(\figref{scheduler})。現在は処理する Task の種類に Task Array が追加されている。

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.70]{./images/scheduler.pdf}
  \end{center}
  \caption{Scheduler}
  \label{fig:scheduler}
\end{figure}

以下が Task ごとのパイプラインの記述である。

\begin{verbatim}
void
Scheduler::run(SchedTaskBase* task1)
{
    do {
        task1->read();
        task2->exec();
        task3->write();

        delete task3;

        task3 = task2;
        task2 = task1;
        task1 = task1->next(this, 0);
    } while (task1);
}
\end{verbatim}

メインメモリからの DMA 転送待ち時間に exec() を行うことで、
待ち時間を隠蔽することができる。しかし、Task の処理や
各ステージの終了タイミングによっては待ち時間(mail\_wait)が
発生してしまう場合がある(\figref{mail_time})

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.80]{./images/mailtime.pdf}
  \end{center}
  \caption{DMA 転送待ち時間の発生}
  \label{fig:mail_time}
\end{figure}

\figref{mail_time} では、task\_a の処理の途中で必要になったデータが SPE 上に
存在しない場合、Task の処理内でメインメモリからデータ(a\_2)を要求している。
そのデータの転送を待っている間、SPE は止まってしまう様子を示している。
また、SPE が止まってしまう例として各ステージの終了タイミングのずれがある。 
\figref{mail_time} の Step 2 において、task\_b の read が終了しなければ 
Step 3 の task\_b の exec を開始することはできない。すると、task\_a の exec 
終了から、task\_b の exec 開始までの間は SPE は止まってしまうことになる。\\

TaskList にある Task が全て終了し、メインスレッドから終了のメッセージ
を受け取ったら、 task1 は NULL となり、while 文を抜ける。

SchedTaskBase クラスは、Scheduler によって実行されるインターフェースである。
新たに Task Array を追加したので、SchedTaskBase を継承したクラスには
Task Array 関連のクラスが追加されている。

\begin{itemize}

\item SchedMail \\
メインスレッドからメッセージ(Mailbox)を取得する
\item SchedTaskList \\
TaskList を取得する
\item SchedTask, SchedTaskArray \\
TaskList から取得した Task, TaskArray を実行する
\item SchedExit \\
SPE の実行を終了する
\item SchedNop, SchedTaskArrayNop \\
何も行わない。パイプラインの待ち合わせ用

Task Array を用いた SchedTaskBase クラスのパイプラインの流れを以下に示す(\figref{})。

\end{itemize}

・queue info
・spu側からmailを送ったときにキューに溜まるようにした

\subsection{Rendering Engine 面からの見直し}
・DrawSpan は常に動いているようにしたいー>pipelineの見直しが絶対に必要

・pipelineに関連して double buffering の見直しも。

・CreatePolygonFromSceneGraph

・検証よりもpipelineでちゃんと動くところを見せたほうがいい


\section{Segment}
\section{評価}