diff paper/chapter2.tex @ 49:c7678996940c

add pipeline in multicore
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Tue, 17 Feb 2015 03:53:19 +0900
parents 8d6a0f047d5a
children d64ab49a6cd4
line wrap: on
line diff
--- a/paper/chapter2.tex	Tue Feb 17 03:31:37 2015 +0900
+++ b/paper/chapter2.tex	Tue Feb 17 03:53:19 2015 +0900
@@ -161,4 +161,44 @@
   \label{fig:scheduler}
 \end{figure}
 
-Task をパイプライニングにより Scheduling している部分をソースコード:\ref{src:pipeline_multicore}
+Cerium の Task は SchedTask と呼ばれるデータ構造で表現されている。
+SchedTask は input/output data の length や合計 size を持っており、
+これらのパラメタから自分の data が格納されているアドレスを算出し、read/write を実行する。
+SchedTask を利用することで容易にパイプラインを構築できる。
+Task をパイプライニングにより Scheduling している部分をソースコード:\ref{src:pipeline_multicore}に示す。
+
+\begin{lstlisting}[frame=lrbt,label=src:pipeline_multicore,caption=Task,numbers=left]
+void
+Scheduler::run(SchedTaskBase* task1)
+{
+    // Pipeline Stage
+    SchedTaskBase* task2 = new SchedNop();
+    SchedTaskBase* task3 = new SchedNop();
+
+    // main loop
+    do {
+
+        task1->read();
+        task2->exec();
+        task3->write();
+
+        delete task3;
+
+        task3 = task2;
+        task2 = task1;
+        task1 = task1->next(this, 0);
+
+    } while (task1);
+
+    delete task3;
+    delete task2;
+}
+\end{lstlisting}
+
+引数として受け取っている task1 は Task のリストである。このリストがなくなるまでパイプライン実行のループを回す。
+task1 が read、task2 が exec、task3 が write を担当している。
+つまり task3 には read と exec が終わった Task が来るため、write が終わったら delete して良い。
+各 Task はそれぞれの処理を行い、task2 は task3 に、task1 は task2 に自分の Task を渡していく。
+
+このメインループを回すことで Cerium の Scheduler はパイプラインによる実行を可能にしている。
+