# HG changeset patch # User Masataka Kohagura # Date 1452479977 -32400 # Node ID 7a67daa0d39f7406b10e508012cbb6d19c6e1273 # Parent 515e18cdb197c9c60d91e824b1c4a26ec11b1d83 add createTask images diff -r 515e18cdb197 -r 7a67daa0d39f cerium.tex --- a/cerium.tex Sat Jan 09 21:07:11 2016 +0900 +++ b/cerium.tex Mon Jan 11 11:39:37 2016 +0900 @@ -1,5 +1,149 @@ \chapter{Cerium} +Cerium は、Cell 向けに開発された並列プログラミングフレームワークである。 +Cell は Sony Computer Entertainment 社が販売した PlayStation3 に搭載されているヘテロジニアスマルチコア・プロセッサである。 +本章では Cerium の実装について説明する。 + \section{Cerium の概要} +Cerium は当初 Cell 向けに開発され、C/C++ で実装されている。 +現在では Linux、 MacOS X 上で動作する並列プログラミングフレームワークである。 + +Cerium は TaskManager、SceneGraph、Rendering Engine の3要素から構成されている。 +本研究では汎用計算フレームワークである TaskManager を利用して文字列の並列計算を行なった。 + +図\ref{fig:TaskManager}は Cerium が Task の生成/実行する場合のクラス構成図である。 +TaskManager で依存関係が解消され、実行可能になった Task は ActiveTaskList に格納される。 +ActiveTaskList に格納された Task は、依存関係が解消されているのでどのような順番で実行されても問題はない。 +Task は転送を行いやすい TaskList に変換され、CpuType に対応した Scheduler に転送される。 +なお、転送はSynchronozed Queue である mail を通して行われる。 + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.7]{images/createTask.pdf} + \end{center} + \caption{Task Manager} + \label{fig:TaskManager} +\end{figure} + +\newpage + \section{Cerium TaskManager} -\section{Cerium における Task} -\section{並列 I/O} +Cerium TaskManager では、処理の単位を Task として記述していく。 +関数やサブルーチンを Task として取り扱い、その Task にて Input Data/Output Data 及び Task の依存関係を設定する。 +そして Task は設定された依存関係を考慮しながら実行される。 + +Input Data で格納した 2 つの数を乗算し、Output Data に演算結果を格納する multiply という例題のソースコード\ref{src:createTask}を以下に示す。 + +また、Task の生成時に用いる API 一覧を表\ref{table:TaskCreateAPI}に示す。 +\begin{lstlisting}[frame=lrbt,label=src:createTask,caption=Task の生成,numbers=left] +multi_init(TaskManager *manager) +{ + float *A, *B, *C; + + // create Task + HTaskPtr multiply = manager->create_task(MULTIPLY_TASK); + + // set device + multiply->set_cpu(SPE_ANY); + + // set inData + multiply->set_inData(0, (memaddr)A, sizeof(float)*length); + multiply->set_inData(1, (memaddr)B, sizeof(float)*length); + + // set outData + multiply->set_outData(0, (memaddr)C, sizeof(float)*length); + + // set parameter + multiply->set_param(0,(long)length); + + // spawn task + multiply->spawn(); +} +\end{lstlisting} + +\begin{tiny} + \begin{table}[ht] + \begin{center} + \label{table:TaskCreateAPI} + \small + \begin{tabular}[t]{c|l} + \hline + create\_task& Task を生成する \\ + \hline + set\_inData & Task への入力データのアドレスを追加 \\ + \hline + set\_outData & Task への出力データのアドレスを追加 \\ + \hline + set\_param & Task へ値を一つ渡す。ここでは length \\ + \hline + set\_cpu & Task を実行するデバイスの設定 \\ + \hline + spawn & 生成した Task を TaskList に set \\ + \hline + \end{tabular} + \caption{Task 生成における API} + \end{center} + \end{table} +\end{tiny} + +次に、デバイス側で実行される Task のソースコードを\ref{src:task}に示す。 +\begin{lstlisting}[frame=lrbt,label=src:task,caption=Task,numbers=left] +static int +run(SchedTask *s) { + // get input + float *i_data1 = (float*)s->get_input(0); + float *i_data2 = (float*)s->get_input(1); + + // get output + float *o_data = (float*)s->get_output(0); + + // get parameter + long length = (long)s->get_param(0); + + // calculate + for (int i=0; i - - + + - + + +