diff paper/cerium.tex @ 0:e41467771c8a

first commit
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Wed, 30 Oct 2013 14:02:43 +0900
parents
children ad68ef71b28e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/cerium.tex	Wed Oct 30 14:02:43 2013 +0900
@@ -0,0 +1,96 @@
+\section{Cerium TaskManager}\label{section:cerium}
+\begin{figure}[ht]
+  \begin{center}
+    \includegraphics[scale=0.45]{./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}
+      \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}