changeset 20:1ea2032fbc31

Add task section
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Sun, 28 Jan 2018 19:22:54 +0900
parents cea271f8aa67
children f3322ccfc818
files paper/fig/dependency.graffle paper/master_paper.pdf paper/parallelism_gears.tex paper/src/codeGearExample.cbc paper/src/metaCodeGearExample.cbc
diffstat 5 files changed, 40 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
Binary file paper/fig/dependency.graffle has changed
Binary file paper/master_paper.pdf has changed
--- a/paper/parallelism_gears.tex	Sun Jan 28 03:04:54 2018 +0900
+++ b/paper/parallelism_gears.tex	Sun Jan 28 19:22:54 2018 +0900
@@ -1,14 +1,35 @@
+% Todo
+% 並列処理 の全体的な説明
+% 構成のセクションいるかしら?
+
 \chapter{Gears OSの並列処理}
+Gears OS では Input Data Gear が揃っている Code Gear から 並列に実行される。
 \section{並列処理の構成}
 
 \section{Task}
-Gears OS の Task は Context で表現される。
+Gears OS では 並列実行する Task は Context で表現される。
 Context には Task 用の情報として、実行される Code Gear、Input/Output Data Gear の格納場所、待っている Input Data Gear のカウンタ等を持っている。
+Task は Input Data Gear が揃っているかを TaskManager で判断し、 Worker に送信される。 
+Worker は送信された Task が指定した Code Gear を実行し、 Output Data Gear を書き出す。
 
 実行される Code Gear の例を \coderef{codeGearExample} に示す。
+\coderef{codeGearExample} は Integer 型 の Input Data Gear を2つ受け取り、 加算処理を行い、 Integer 型 の Output Data Gear に書き出す。
+並列処理を行う Code Gear は Interface の Code Gear と同じく、引数に Input Data Gear、処理が終了した後に継続する Code Gear、 引数の Code Gear の中に Output Data Gear を記述する(\coderef{codeGearExample} 1行目)。
+引数のCode Gear の中には書き出される Output Data Gear を記述する。
+処理が終了した Code Gear は Output Data Gear を書き出す Code Gear に継続する。
+実際に Output Data Gear を書き出す場合、 goto 文に Output Data Gear を引数に渡す(\coderef{codeGearExample} 3行目)。
 
 \lstinputlisting[caption=並列実行される Code Gear の例, label=code:codeGearExample]{./src/codeGearExample.cbc}
 
+% Context の話を書く
+% 生成されるstub は Context から input/output に index を指定して生成する。
+Task のInput/Output Data Gear の格納場所は Context の Task 情報が持っている。
+その為、Task に対応する Code Gear の stub Code Gear は context が持っている Input/Output Data Gear用のインデックスから Data Gear を取り出す。
+\coderef{metaCodeGearExample} に \coderef{codeGearExample} の stub Code Gear を示す。
+この stub Code Gear も Interface の stub Code Gear と同等にスクリプトによって自動生成される。
+
+\lstinputlisting[caption=並列実行される Code Gear のstub Code Gear, label=code:metaCodeGearExample]{./src/metaCodeGearExample.cbc}
+
 \section{TaskManager}
 Gears OS の TaskManager は Task を実行する Worker の生成、管理、Task の送信を行う。
 \coderef{taskManagerInterface} に TaskManager の Interface を示す。
@@ -19,7 +40,7 @@
 
 \begin{itemize}
     \item Task の実行(spawn, spawnTasks)
-    \item Task の依存関係の設定(setWaitTask)
+    \item Task の依存関係の設定(setWaitTask) 
     \item TaskManager が管理している Task 数のインクリメントとデクリメント(increment/decrementTaskCount)
     \item TaskManager(shutdown)の終了処理
 \end{itemize}
@@ -179,12 +200,15 @@
 \coderef{metaCreateTask} では実行する Code Gear、待ち合わせ中の Input Data Gear の数、 Input/Output Data Gear への参照等の設定を記述している。
 これらの記述は Context などを含む煩雑な記述であるが、並列実行されることを除けば通常の CbC の goto 文と同等である。
 そこで、 Context を直接用いないノーマルレベルの並列構文である par goto 文を用意した。
+
+\lstinputlisting[caption=メタレベルによる Task の生成, label=code:metaCreateTask]{./src/metaCreateTask.cbc}
+
 \coderef{parGotoCreateTask}に par goto文による記述例を示す。
 この記述はスクリプトにより、Task で実行される Code Gear の Input/Output の数を解析し、\coderef{metaCreateTask} に変換される。
 
-\lstinputlisting[caption=メタレベルによる Task の生成, label=code:metaCreateTask]{./src/metaCreateTask.cbc}
 \lstinputlisting[caption=par goto による並列実行, label=code:parGotoCreateTask]{./src/parGotoCreateTask.cbc}
 
+par goto の引数には Input/Output Data Gear と 実行後に継続する Code Gear を渡す。
 par goto で生成された Task は \_\_exit に継続することで終了する。
 Gears OS の Task は Output Data Gear を生成した時点で終了するので、 par goto では直接 \_\_exit に継続するのではなく、Output Data Gear への書き出し処理に継続される。
 これにより Code Gear と Data Gear の依存関係をノーマルレベルで記述できるようになる。
--- a/paper/src/codeGearExample.cbc	Sun Jan 28 03:04:54 2018 +0900
+++ b/paper/src/codeGearExample.cbc	Sun Jan 28 19:22:54 2018 +0900
@@ -1,5 +1,4 @@
 __code add(struct Integer* input1, struct Integer* input2, __code next(struct Integer* output, ...)) {
     output->value = input1->value + input2->value;
-    printf("%d + %d = %d\n", input1->value, input2->value, output->value);
     goto next(output, ...);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/metaCodeGearExample.cbc	Sun Jan 28 19:22:54 2018 +0900
@@ -0,0 +1,13 @@
+__code add_stub(struct Context* context) {
+    // Input Data Gear
+	Integer* input1 = &context->data[context->idg + 0]->Integer;
+	Integer* input2 = &context->data[context->idg + 1]->Integer;
+
+    // set Continuation
+	enum Code next = context->next;
+
+    // Output Data Gear
+	Integer** O_output = (Integer **)&context->data[context->odg + 0];
+	goto add(context, input1, input2, next, O_output);
+} 
+