changeset 9:8e5011d1947d

Add par goto
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Sat, 22 Apr 2017 16:23:28 +0900
parents 6cd7ad437a85
children a7d96c2f588b
files paper/pic/gears_structure.graffle paper/pic/gears_structure.pdf paper/sigos.pdf paper/sigos.tex paper/src/par_goto.c paper/src/setting_task.c
diffstat 6 files changed, 46 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
Binary file paper/pic/gears_structure.graffle has changed
Binary file paper/pic/gears_structure.pdf has changed
Binary file paper/sigos.pdf has changed
--- a/paper/sigos.tex	Fri Apr 21 21:23:59 2017 +0900
+++ b/paper/sigos.tex	Sat Apr 22 16:23:28 2017 +0900
@@ -102,7 +102,6 @@
 Code Gear は処理の基本として、 Input Data Gear を参照し、一つまたは複数の Output Data Gear に書き込む。また、接続された Data Gear 以外には参照を行わない。(図\ref{fig:codeGear_dataGear})
 Input Data Gear と Output Data Gear の2つによって、Code Gear の Data に対する依存関係が解決し Code Gear の並列実行を可能とする。
 
-\end{itemize}
 \begin{figure}[ht]
   \begin{center}
     \includegraphics[width=60mm]{./pic/codeGear_dataGear.pdf}
@@ -133,7 +132,6 @@
 \end{figure}
 
 
-\newpage
 %図で言うよりも goto の説明をしたほうがわかりやすいかも、gotoがどういったものでどういう事に使われているのか、これがわかればわかるのでは?
 
 \section{GearsOSの構成}
@@ -150,16 +148,26 @@
 また、 並列実行を行う際はこの Context を生成し、それを Task として実行する。
 そのため、 Context は 接続に必要な Code/Data Gear のリスト、 Data Gear を確保するためのメモリ空間、 実行する Code Gear、 Code Gear の実行に必要な Input Data Gear のカウンタ等をもっている。
 
-TaskManager は Task、 Worker の生成、 Worker に 実行する Task を送信を行う。
-また、 生成した Worker の終了処理等を行う。
+TaskManager は Task、 Worker の生成、 Worker に生成した Task を送信する。
+また、生成した Worker の終了処理等を行う。
 
-Worker は thread と 実行するTaskが入っているQueueを持っている。
-Worker は TaskManager から送信された Task を Queue から取り出し、Code Gear, Input Data Gear を取り出し、 Code Gearを実行する。
+Worker は thread と実行する Task が入っているQueueを持っている。
+Worker は TaskManager から送信された Task を Queue から取り出し、Code Gearを実行する。
+Task は Context なので、Code Gear の実行に必要な Input Data Gear はその Context から参照される。
 Code Gear を実行した後は出力される Output Data Gear から依存関係を解決する。
 
 Gears OS の並列処理の構成を図\ref{fig:gears_structure}に示す。
 %\lstinputlisting[label=src:sync\_dequeue, caption=sync\_dequeue.c]{./src/sync\_dequeue.c}
 
+\begin{figure}[ht]
+    \begin{center}
+        \includegraphics[width=70mm]{pic/gears_structure}
+    \end{center}
+    \caption{並列処理の構成}
+    \label{fig:gears_structure}
+\end{figure}
+
+
 \section{並列処理の依存関係の解決}
 Gears OS の並列処理の依存関係の解決は Data Gear に依存関係解決のための Queue をもたせることで行う。
 Queue にはその Data Gear を Input Data Gear として使用する Task(Context) が入っている。
@@ -200,7 +208,6 @@
   \caption{Gears OS による GPGPU}
   \label{fig:gpgpu}
 \end{figure}
-\newpage
 
 % CPUからGPUにTaskを振り分ける図があってもいい
 \section{CUDA}
@@ -224,10 +231,19 @@
 CUDAライブラリの初期化を行う以外の動作はCUDAWorker と全く同じになる。
 GPUへのデータ転送及びGPU側でのTaskの実行はTaskのMeta Code Gear で行われる。
 
+% session 名変えたい
+\section{Task の設定の Meta Computation の問題}
+現在の Gears OS では 並列実行する Task の設定を Code\ref{src:setting_task} のように行っている。
+Code\ref{src:setting_task} では 実行する CodeGear、揃っていない Input Data Gear の数、Input/Output Data Gear への参照等の設定をノーマルレベルで記述している。
+しかし、この記述方法では Meta Data Gear である Task(Context) を直接参照しているため、ノーマルレベルとしては好ましくなく、 メタレベルでの記述を行いたい。
+そこで、 Code\ref{src:par_goto} のような goto の記述方法を新たに考案した。
+par goto は Code\ref{src:setting_task} に変換される記述である。
+この記述を行うことで、ノーマルレベルでは直接 Task を参照せずに par goto の引数で Task の設定を行うことが出来る。
+また、この記述を拡張することで、 CPU、 GPU での実行の切り替え等を行うことが可能であると考える。
 
-\newpage
-
-%今後の課題
+% この例題微妙かなぁ
+\lstinputlisting[label=src:setting_task, caption=createTask]{./src/setting_task.c}
+\lstinputlisting[label=src:par_goto, caption=parGoto]{./src/par_goto.c}
 
 \section{結論}
 \section{まとめ}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/par_goto.c	Sat Apr 22 16:23:28 2017 +0900
@@ -0,0 +1,3 @@
+__code createTask(Integer *integer1, Integer *integer2, Integer *output) {
+    par goto add(integer1, integer2, output);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/setting_task.c	Sat Apr 22 16:23:28 2017 +0900
@@ -0,0 +1,17 @@
+__code createTask(TaskManager* taskManager, Context* task, Integer *integer1, Integer *integer2, Integer *output) {
+    task->next = C_add; // set Code Gear
+    task->idgCount = 2; // set Input Data Gear Counter
+    task->data[task->idg] = (union Data*)integer1; // set Input Data Gear reference
+    task->data[task->idg+1] = (union Data*)integer2;
+    task->maxIdg = task->idg + 2;
+    task->odg = task->maxIdg; // Output Data Gear index
+    task->data[task->odg] = (union Data*)output; // set Output Data Gear reference
+    task->maxOdg = task->odg + 1;
+    taskManager->next = C_createTask1;
+    goto meta(context, taskManager->taskManager->TaskManager.spawn); // spawn task
+}
+
+// code gear
+__code add(Integer *integer1, Integer *integer2, Integer *output) {
+    ....
+}