view paper/implement.tex @ 21:6b53dcfaab84

Cahpter4, Scheduler done. "pipeline improve" not yet.
author tkaito
date Thu, 03 Feb 2011 16:49:35 +0900
parents b250db0fada8
children 3fa4dbc5850d
line wrap: on
line source

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

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

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

\subsection{Scheduler} \label{sec: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)が
発生してしまう場合がある(\ref{sec:task_dma})。 \\

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

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

\begin{itemize}

\item SchedMail \\
メインスレッドからメッセージ(Mailbox)を取得する

\item SchedTaskList \\
TaskList を取得する

\item SchedTask, SchedTaskArrayLoad\\
受け取った TaskList の中の Task が 単一 Task か、Task Array なのかを判別する \\
Task Array の時は Task Array をメインメモリから転送する(SchedTaskArrayLoad)

\item SchedTaskArray, SchedTaskArrayLoad\\
TaskList から取得した Task Array を実行する

\item SchedExit \\
SPE の実行を終了する

\item SchedNop, SchedTaskArrayNop, SchedNop2Ready \\
何も行わない。パイプラインステージの待ち合わせ用

\end{itemize}

現在 Cerium では、単一 Task も Task Array も Task Array として処理している。

Scheduler (\ref{sec:scheduler}) によって上記のクラスは以下のように遷移する
( \figref{stb-state} )。

\begin{figure}[htb]
  \begin{center}
    \includegraphics[scale=0.80]{./images/stb-state.pdf}
  \end{center}
  \caption{ScheTaskBase クラスの状態遷移}
  \label{fig:stb-state}
\end{figure}

\subsection{DMA 命令}

Task の入力データや結果の出力データの操作は、TaskManager がパイプラインに沿って
 DMA を行って操作している。しかし、Task 内でメインメモリ上の新たなデータが必要に
なる可能性がある。この時、Task 内で明示的に DMA 転送命令を出すことができる。

\begin{description}
\item[dma\_load(ls, mm, size, tag) :] メインメモリ上のデータ mm から、SPE の
Local Store 上の領域 ls に size byte の DMA 転送を行う。Cell の DMA 転送ではタグ
を使用することになっており、指定したタグ毎に DMA 転送の完了待ちを行うことができる。
タグは Cell の仕様では 0 ~ 31 を使用することができる。

\item[dma\_store(ls, mm, size, tag) :] SPE から PPE への DMA 転送を行う。

\item[dma\_wait(tag) :] tag を元に DMA 転送の完了を待つ。

\end{description}

dma\_load() や dma\_store() は DMA 命令の発行だけなので、DMA 転送を行っている
データを使用する場合は dma\_wait() を用いて、転送完了を待たなければならない。
転送完了を待っている間は Task が一時ストップしてしまう(\figref{mail_wait})。

\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)を要求している。
a\_2 の転送完了を task\_a\_2  が待っているのでこの間、Task が一時ストップしてしまう。

また、Task が止まってしまう例として各ステージの終了タイミングのずれがある。 
\figref{mail_time} の Step 2 において、task\_b の 転送が完了しなければ 
Step 3 の task\_b の exec を開始することはできない。すると、task\_a の exec 
終了から、task\_b の exec 開始までの間は Task が止まってしまうことになる。\\


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

\subsection{Cerium のパイプラインの改良}
・DrawSpan は常に動いているようにしたいー>pipelineの見直しが絶対に必要

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

・CreatePolygonFromSceneGraph

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


\section{Segment}
\section{評価}