Mercurial > hg > Papers > 2015 > yuhi-master
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 はパイプラインによる実行を可能にしている。 +