Mercurial > hg > Papers > 2018 > parusu-master
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
--- 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); +} +