Mercurial > hg > Papers > 2008 > gongo-sigos
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}