view cerium-manager.tex @ 5:30bf38a518e8

*** empty log message ***
author gongo
date Tue, 25 Mar 2008 09:48:38 +0900
parents 869c475cc108
children a46c6f313a0b
line wrap: on
line source

\section{Task Manager}
Task Manager は、Task と呼ばれる分割された各プログラムを
管理するライブラリである。Task 同士の依存関係を考慮しながら
メモリ上にマッピングし、SPE 上ではそのプログラムを
DMA 転送によりロードする (\figref{fig-manager-load}) 。
SPE は 256KB という小さなデータ量しか持てず、
大量のプログラムを全て SPE 上に置いておくことはできない可能性がある。
そのため、必要な時に必要な実行プログラムだけが SPE 上にロード
されていることが望ましい。

\begin{figure}[tb]
  \begin{center}
    \includegraphics[scale=0.45]{figure/manager-load.pdf}
    \caption{Task Manager}
    \label{fig-manager-load}
  \end{center}
\end{figure}

現在実装されている Task Manager の API を \tabref{tab:manager-api} に示す。

\begin{table}[b]
  \caption{Task Manager API} \label{tab:manager-api}
  \hbox to\hsize{\hfil
  \begin{tabular}{r|l} \hline \hline
    create\_task & Task を生成する \\ \hline
    spawn        & Task を実行 Task Queue に登録する \\ \hline
    set\_depend  & Task の依存関係の考慮 \\\hline
    set\_cpu     & Task を実行する CPU の設定 \\ \hline
    run          & 実行 Task Queue の実行 \\ \hline
  \end{tabular}\hfil}
\end{table}

以下に Task Manager を使った記述を示す。

{\small
\begin{verbatim}
int
main(void)
{
    TaskManager *manager = new TaskManager;
    Task *task1, *task2;

    /**
     * cmd  : 実行するタスクID
     * size : in_addr で取得するデータのバイト数
     * in_addr  : 入力データ元アドレス
     * out_addr : 出力データ先アドレス
     */
    task1 = create_task(CMD_RUN1, size1,
                        in_addr1, out_addr2);
    task2 = create_task(CMD_RUN2, size2,
                        in_addr2, out_addr2);

    // task2 は task1 が終了してから開始する
    task2->set_depend(task1);

    task1->spawn();
    task2->spawn();

    manager->run();

    return 0;
}
\end{verbatim}
}

\subsection{並列処理}

Cell ではあらゆるレベルで並列に動作させることが求められる。
ダブルバッファがその一例として挙げられる。
前述した通り、Cell ではそれぞれのコアがメインメモリを
直接参照することは出来ず、DMA 転送によりデータをやりとりする。
DMA は CPU を介さず直接データ転送を行う方式である。そのため、
DMA している間は SPE は何らかの処理を行うことが出来る。
また、ダブルバッファリングを行うことで
パイプライン処理が可能となる (\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}