Mercurial > hg > Papers > 2013 > yuhi-prosym
view paper/cerium.tex @ 8:ad68ef71b28e
minor fix
author | Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 05 Nov 2013 04:49:02 +0900 |
parents | e41467771c8a |
children | c44f787fbac6 |
line wrap: on
line source
\section{Cerium TaskManager}\label{section:cerium} \begin{figure}[ht] \begin{center} \includegraphics[scale=0.4]{./images/createTask.pdf} \end{center} \caption{Task Manager} \label{fig:createTask} \end{figure} Cerium Task Manager では、 並列処理を Task 単位で記述する。関数やサブルーチンを Task として扱い、 Task には input データ、 output データ及び依存関係を設定する。 Cerium Task Manager によってそれらの Task は管理され、実行される。 図\ref{fig:createTask}は Cerium が Task を作成/実行する場合のクラスの構成となる。 user が createtask() を行い、input data や依存関係の設定を行うと TaskManager で 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}