Mercurial > hg > Papers > 2016 > masa-master
view c2.tex @ 40:e6ca2c4eedeb
fix
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 10 Feb 2016 03:04:40 +0900 |
parents | ea3e6f3219a5 |
children |
line wrap: on
line source
\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/cerium/createTask.pdf} \end{center} \caption{Task Manager} \label{fig:TaskManager} \end{figure} \newpage \section{Cerium TaskManager} 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<length; i++) { o_data[i] = i_data1[i] * i_data2[i]; } return 0; } \end{lstlisting} また表\ref{table:taskAPI}は Task 側で利用する API である。 Task 生成時に設定した Input Data や parameter を取得することができる。 \begin{tiny} \begin{table}[ht] \begin{center} \caption{Task 側で使用する API} \label{table:taskAPI} \small \begin{tabular}[t]{c|l} \hline get\_input & Scheduler から input data を取得 \\ \hline get\_output & Scheduler から output data を取得 \\ \hline get\_param & set\_param した値を取得 \\ \hline \end{tabular} \end{center} \end{table} \end{tiny} \newpage Task 生成時に設定できる要素を以下に列挙する。 \begin{itemize} \item Input Data \item Output Data \item Parameter \item CpuType \item Dependency \end{itemize} Input/Output Data、Parameter は関数の引数に相当する。 Cpu Type は Task を動作させるデバイスを設定することができ、Dependency は他の Task との依存関係を設定することができる。