Mercurial > hg > Members > kokubo > 2013-mid-thesis
diff paper/cerium.tex @ 0:9e88a388ec83
first commit
author | Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 05 Nov 2013 23:18:04 +0900 |
parents | |
children | f4b3de446113 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/cerium.tex Tue Nov 05 23:18:04 2013 +0900 @@ -0,0 +1,94 @@ +\section{Cerium での Task の生成}\label{section:cerium} +Cerium では,user が createtask を行い、input data や依存関係の設定を行うと TaskManager で Task が生成される。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[scale=0.4]{./images/createTask.pdf} + \end{center} + \caption{Task Manager} + \label{fig:createTask} +\end{figure} +図\ref{fig:createTask}は Cerium が Task を作成/実行する場合のクラスの構成となる。 +Task 毎に依存関係を表す wait\_i と wait\_me というリストがあり、依存関係が解消されて実行可能になった +Task は ActiveTaskList に移される。さらに、Scheduler に転送しやすい TaskList に変換してから各 Scheduler に +転送される。 +\subsection{Taskの生成} +以下に Task を生成する例題を示す。 +input data を二つ用意し、 input 同士を乗算し、 output に格納する multiply という例題となる。 +\begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm] +void +multiply_init +(HTaskPtr twice, int *i_data, int *o_data) { + multiply = + manager->create_task(MULTIPLY_TASK); + // MULTIPLY_TASK is task id(enum) + multiply->set_inData(0, i_data1, + sizeof(int)*length); + multiply->set_inData(1, i_data2, + sizeof(int)*length); + multiply->set_outData(0, o_data, + sizeof(int)*length); + multiply->set_param(0, (memaddr)length); + multiply->set_cpu(SPE_ANY); + multiply->spawn(); +} +\end{Verbatim} + +\begin{tiny} + \begin{table}[ht] + \begin{center} + \caption{ Task 生成における API } + \label{table:create_taskAPI} + \scalebox{0.5}[0.9] + \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 を ActiveTaskList に登録 \\ + \hline + \end{tabular} + \end{center} + \end{table} +\end{tiny} +Task ( OpenCL における kernel )の記述は以下のようになる。 +\begin{Verbatim}[fontsize=\footnotesize,xleftmargin=1cm] +static int +run(SchedTask *s,void *rbuf, void *wbuf) +{ + float i_data1=(float*)s->get_input(rbuf,0); + float i_data2=(float*)s->get_input(rbuf,1); + float o_data=(float*)s->get_output(wbuf,0); + long length=(long)s->get_param(0); + for (int i=0;i<length;i++) { + outdata[i]=indata1[i]*indata2[i]; + } + return 0; +} +\end{Verbatim} +\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}