changeset 9:ddf62b739703

update
author mir3636
date Fri, 25 Jan 2019 03:48:23 +0900
parents 3d42e57b60f9
children 6c375f3eef72
files paper/gearsOS.tex paper/generate_code.tex paper/interface.tex paper/master_paper.pdf paper/master_paper.tex paper/meta_computation.tex paper/src/context.h
diffstat 7 files changed, 156 insertions(+), 95 deletions(-) [+]
line wrap: on
line diff
--- a/paper/gearsOS.tex	Thu Jan 24 16:10:56 2019 +0900
+++ b/paper/gearsOS.tex	Fri Jan 25 03:48:23 2019 +0900
@@ -15,7 +15,7 @@
 
 \begin{figure}[ht]
  \begin{center}
-  \includegraphics[width=140mm]{./fig/gears_structure}
+  \includegraphics[width=160mm]{./fig/gears_structure}
  \end{center}
  \caption{Gears OS の構成図}
  \label{fig:gearsos}
@@ -36,13 +36,20 @@
 Context は Task でもあり、Taskは通常のOSのスレッドに対応する。
 Task は実行する Code Gear と Data Gear をすべて持っている。
 Context は、ソースコード \ref{contexth} のように定義されている。
+ソースコード \ref{contexth} 5、6行目で記述されているように Code Gear のリスト、Data Gear のリストを持っている。
+ソースコード \ref{contexth} 13〜30行目は並列実行用の Task として扱うための情報である。
+Context が持つ Data Gear のメモリ空間は事前に確保され、
+Data Gear のメモリ確保の際に heap の値をずらしメモリを割り当てる。
 
+Data Gear は構造体で定義されている。
+メタ計算では任意の Data Gear を一律で扱うため、全て union で定義されている。(ソースコード \ref{contexth} 33行目〜)
 
+\lstinputlisting[label=contexth, caption=Context]{./src/context.h}
 
 Context は、ソースコード \ref{enumCodeh} のように Code Gear の番号を持っており。
 初期化の際に Code Gear のアドレスと対応付けている。(ソースコード \ref{initContext})
 
-\begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize enumCodeh}]
+\begin{lstlisting}[frame=lrbt,label=enumCodeh,caption={\footnotesize enum で定義された Code Gear の番号}]
 enum Code {
     C_popSingleLinkedStack,
     C_pushSingleLinkedStack,
@@ -52,7 +59,7 @@
 };
 \end{lstlisting}
 
-\begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize initContext}]
+\begin{lstlisting}[frame=lrbt,label=initContext,caption={\footnotesize Context の初期化}]
     context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub;
     context->code[C_pushSingleLinkedStack]  = pushSingleLinkedStack_stub;
     context->code[C_stackTest3] = stackTest3_stub;
@@ -60,7 +67,11 @@
 \end{lstlisting}
 
 Data Gear も Code Gear と同様に Context が番号を持っている。(ソースコード \ref{enumDatah})
-\begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize enumDatah}]
+Context の初期化の際に引数格納用の Data Gear が生成される。
+この Data Gear は Code Gear が継続する際に、継続先の Code Gear が要求する引数を格納するためのものである。
+生成された Data Gear は data のリストと番号の対応から参照される。
+
+\begin{lstlisting}[frame=lrbt,label=enumDatah,caption={\footnotesize enum で定義された Data Gear の番号}]
 enum DataType {
     D_Code,
     D_SingleLinkedStack,
@@ -72,5 +83,15 @@
 \end{lstlisting}
 
 \section{TaskManager}
+TaskManager は、CPU、GPU の数に応じた Worker の生成、管理、Task の送信を行う。
+ソースコード \ref{TaskManager} は TaskManager の Interface である。
+
+
+TaskManager は、初期化の際にそれぞれ指定した CPU、GPU の数の Worker を生成する。
+また、実行する Task の Input Data Gear が用意されているかどうか判断し、
+全て用意されていた場合、その Task を Worker の Queue に送信する。
+
+\lstinputlisting[label=TaskManager, caption=TaskManager の Interface]{./src/taskManagerInterface.cbc}
 \section{TaskQueue}
+
 \section{Workers}
--- a/paper/generate_code.tex	Thu Jan 24 16:10:56 2019 +0900
+++ b/paper/generate_code.tex	Fri Jan 25 03:48:23 2019 +0900
@@ -1,21 +1,103 @@
 \chapter{コードの自動生成}
 
-\section{stub Code Gear の生成}
+stub Code Gear などの Meta Code Gear は通常ユーザーレベルからは見ることのできない Meta Data Gear である Context を扱うため、ユーザー自身が記述することは望ましくない。
+stub Code Gear は Code Gear 毎に記述する必要があるためユーザーの記述量が多くなる。
+また、stub Code Gear でユーザーが Context から Data Gear を参照するためのコードが非常に煩雑である。
+このため Meta Code Gear は自動生成されるのが望ましい。
+そこで Meta Gear を自動生成するためのスクリプトを導入した。
+また、このスクリプトによって Context の参照をユーザーレベルから隠すことができ、
+ユーザーレベルの Code Gear もシンプルになった。
+
+\section{Meta Code Gear の生成}
+
+stub Code Gear は Code Gear 間の継続に挟まれる 必要な Data Gear を Context から参照し、
+継続する Code Gear へと渡すための Meta Code Gear である。
+Code Gear 毎に記述する必要があり、継続する Code Gear の引数を見て取り出す Data Gear を選択する。
+stub Code Gear はユーザーが任意に記述することも出来るが、Meta を扱うため自動生成を行いたい。
+そのため、stub Code Gear を 自動生成する generate stub を Perl スクリプトで作成した。
+これにより Code Gear の記述量を約半分にすることができる。
+
+
+ソースコード \ref{Gears_code} は ユーザーレベルの Code Gear である。
+この Code Gear を generate stub によって変換、
+stub Code Gear の生成を行なったコードがソースコード \ref{MetaCodeGear} である。
 
-stub Code Gear は Code Gear 間の継続に挟まれる Code Gear が必要な Data Gear を Context から取り出す処理を行うものである。
-Code Gear 毎に記述する必要があり、そのCode Gear の引数を見て取り出す Data Gear を選択する。
-stub Code Gear を 自動生成する generate stub を Perl スクリプトで作成することによって Code Gear の記述量を約半分にすることができる。
+\begin{lstlisting}[frame=lrbt,label=MetaCodeGear,caption={\footnotesize Stack pop の MetaCodeGear}]
+
+__code popSingleLinkedStack_stub(struct Context* context) {
+        SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
+        enum Code next = Gearef(context, Stack)->next;
+        Data** O_data = &Gearef(context, Stack)->data;
+        goto popSingleLinkedStack(context, stack, next, O_data);
+}
+
+__code popSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data) {
+        Data* data = *O_data;
+    if (stack->top) {
+        data = stack->top->data;
+        stack->top = stack->top->next;
+    } else {
+        data = NULL;
+    }
+        *O_data = data;
+    goto meta(context, next);
+}
+
+__code meta(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
+}
 
-stub を生成するために generate\_stub は指定された cbc ファイルの \_\_code型である Code Gear を取得し、引数から必要な Data Gear を選択する。
-generate\_stub は引数と interface を照らし合わせ、Gearef または GearImpl を決定する。
-また、この時既に stub Code Gear が記述されている Code Gear は無視される。
+\end{lstlisting}
+
+生成された stub  Code Gear は、
+継続先が引数で指定した Input Code Gear、Output Code Gear を Context から参照している。
+Gearef は Context から Data Gear を参照するためのマクロである。
+Context には Allocation 等で生成した Data Gear へのポインタが格納されている。
+Code Gear が Context にアクセスする際、
+ポインタを使用してデータを取り出すため煩雑なコードとなる。
+そこで Code Gear がデータを参照するための Gearef というマクロを定義した。
+Gearef は Context から Interface の引数格納用の Data Gear を取り出す。
+Gearef に Context と Data Gear の型を渡すことでデータの参照が行える。
+
+GearImpl マクロは Interface の方に包まれた Data Gear から
+実装の Data Gear を取り出すためのマクロである。
+実装の Data Gear を取り出す際も、ポインタでの記述が複雑になってしまうため 同様に GearImpl を定義した。
+GearImpl は Context と Data Gear の型、実装の Data Gear 名を指定することで参照する。 
+
+ソースコード\ref{Gearef} は Gearef、GearImpl を用いずに書いた popSingleLinkedStack\_stub である。
+
 
-cbc ファイルから、生成した stub Code Gear を加えて stub を加えたコードに変換を行う。(Code\ref{stack_c})
+\begin{lstlisting}[frame=lrbt,label=ref,caption={Gearef、GearImplのないコード}]
+__code popSingleLinkedStack_stub(struct Context* context) {
+    SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack;
+    enum Code next = context->data[D_Stack]->Stack.next;
+    Data** O_data = &context->data[D_Stack]->Stack.data;
+    goto popSingleLinkedStack(context, stack, next, O_data);
+}
+\end{lstlisting}
 
-\lstinputlisting[label=stack_c, caption=stub Code Gear を加えたコード]{./src/ex_stub}
+また、Code Gear は継続の際 meta へと goto する。
+Context はすべての Code Gear のリストを持っており、継続先の Code Gear のアドレスは
+enum で対応付けられた Code Gear のアドレスのリストを参照して継続を行う。
+この meta もスクリプトにより自動生成される。
+
+stub Code Gear を生成するために generate\_stub は、
+ソースコード上の Code Gear を全て取得し、引数からその Code Gear に必要な Data Gear を選択する。
+
+generate\_stub は stub Code Gear を生成する際、Code Gear の引数と Interface を照らし合わせ、
+Code Gear が要求する引数の Data Gear を Context から取り出すための Gearef または GearImpl を決定する。
+
+この時既に stub Code Gear が記述されている Code Gear は stub Code Gear が生成されずに無視される。
+
+generate\_stub は Code Gear の変換も行う。
+ソースコード \ref{MetaCodeGear} では、popSingleLinkedStack の引数の Output Data Gear を見て、
+Output Data Gear の格納を行うコードが挿入されている。
+また、継続のコードが goto meta へと変換されている。
 
 \section{Context の生成}
-generate\_context は Context.h、Interface.cbc、generate\_stub で生成されたImpl.cbc を見て Context を生成する Perl スクリプトである。
+generate\_context は Context を生成する Perl スクリプトである。
+Context は生成する際に Code Gear のリストとアドレスの対応、
+引数格納用の Data Gear の生成、
 
 \begin{figure}[ht]
  \begin{center}
--- a/paper/interface.tex	Thu Jan 24 16:10:56 2019 +0900
+++ b/paper/interface.tex	Fri Jan 25 03:48:23 2019 +0900
@@ -1,36 +1,28 @@
-% Todo
-% interface の前には何か軽い説明が必要
-% interface 用の章を作る
- % なぜ, interface が必要になったのか?
-   % Code と Data が全てフラットに展開すると, 記述が煩雑になるので モジュール化して扱いたい
-   % java の interface のようなものがほしい
-   % どうしてもグローバルな Data Gear にアクセスしたくなっちゃう
-   %  ここでいうグローバルな変数は Context
- % interface は Data Gear
- % interface を使うことで Gear OS のモジュール化ができるようになった
- % interface は Meta Data Gear で、引数の Data Gear 群, Code Gear の引数のパターンの集合, Code Gear の引数のパターンは全部 interface に記述されている必要がある。
- % interface 内部の Code Gearは 自由に 引数の Data Gear, 実装のData Gear にアクセス出来る。
- % inteface の実装の際は Code Gear に代入して書く
- % C++ で言うとCode Gearは virtual 
-% Impl の説明いれてない
-% Interface 抜きのプログラミングも可能だが, 通常な言語だとアセンブラで書いてるような感覚(決まった位置にデータを書き出す)
-% Interface はコールフレームの性質を持っている(入出力に使われている変数はInterface で定義する必要がある)
-% 図のput の位置を直す
-% Context and stub の詳細な説明はここに書く
-% stub の説明は スクリプトによる goto の変換後
 
 \chapter{Interface}
-Code Gear と 
+Interface は Gears OS のモジュール化の仕組みである。 
 Interface は呼び出しの引数になる Data Gear の集合であり、そこで呼び出される Code Gear のエントリである。
 呼び出される Code Gear の引数となる Data Gear はここで全て定義される。
 
-Code\ref{interface}は stack の Interface である。
-Code Gear、Data Gear に参照するために Context を通す必要があるが、
-Interface を記述することでデータ構造の API と Data Gear を結びつけることが出来る。
+ソースコード\ref{interface}は Stack の Interface である。
+\_\_code で記述されているものは Stack が実装するべき push や pop などの Code Gear、
+union Data で記述されているものは、Stack の Code Gear の引数の Data Gear である。 
 
 \lstinputlisting[label=interface, caption=StackのInterface]{./src/Stack.cbc}
 
-Code\ref{implement}は stack の実装の例である。
-createImpl は関数呼び出しで呼び出され、初期化と Code Gear のスロットに対応する Code Gear の番号を入れる。
+
+通常 Code Gear、Data Gear に参照するためには Context を通す必要があるが、
+Interface を記述することでデータ構造の API と Data Gear を結びつけることが出来る。
+
+\section{Interface の実装}
+ソースコード\ref{implement}は Stack の実装の例である。
+create の関数は 実装の初期化である。
+ソースコード\ref{implement} 6〜12行目で実装の Code Gear に代入しているものは Context が
+持つ enum で定義された Code Gear の番号である。
+ソースコード \ref{Gears_code} 3行目で stack->pop へと goto しているが、
+stack->pop には Code Gear の番号が入っているため実装した Code Gear へと継続する。
+このため、ソースコード \ref{Gears_code} では 6行目の popSingleLinkedStack へと継続している。
 
 \lstinputlisting[label=implement, caption=SingleLinkedStackの実装]{./src/stackimpl.cbc}
+
+
Binary file paper/master_paper.pdf has changed
--- a/paper/master_paper.tex	Thu Jan 24 16:10:56 2019 +0900
+++ b/paper/master_paper.tex	Fri Jan 25 03:48:23 2019 +0900
@@ -95,10 +95,9 @@
 %chapters
 \input{introduction.tex}
 \input{meta_computation.tex}
+\input{GearsOS}
 \input{interface.tex}
-\input{GearsOS}
 \input{generate_code.tex}
-\input{parallelism_gears.tex}
 \input{xv6.tex}
 %\input{evaluation.tex}
 \input{conclusion.tex}
--- a/paper/meta_computation.tex	Thu Jan 24 16:10:56 2019 +0900
+++ b/paper/meta_computation.tex	Fri Jan 25 03:48:23 2019 +0900
@@ -104,52 +104,9 @@
 これを介して間接的に必要な Data Gear にアクセスする。
 この Meta Code Gear を stub Code Gear と呼ぶ。
 %code を入れる
-stub Code Gear は Code Gear 毎に生成され、次の Code Gear へと継続する前に挿入される。
-goto による継続を行うと、実際には次の Code Gear の stub Code Gear を呼び出す。
-
-\section{Meta Gear の自動生成}
-
-メタレベルの記述は Perl スクリプトによって生成される。
-stub Code Gear と meta によって Code Gear で記述される。
-リスト \ref{MetaCodeGear} は生成された Meta Code Gear のコードである。
-
-\begin{lstlisting}[frame=lrbt,label=Gears_code,caption={\footnotesize MetaCodeGear}]
-
-__code popSingleLinkedStack_stub(struct Context* context) {
-        SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
-        enum Code next = Gearef(context, Stack)->next;
-        Data** O_data = &Gearef(context, Stack)->data;
-        goto popSingleLinkedStack(context, stack, next, O_data);
-}
-
-__code popSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data) {
-        Data* data = *O_data;
-    if (stack->top) {
-        data = stack->top->data;
-        stack->top = stack->top->next;
-    } else {
-        data = NULL;
-    }
-        *O_data = data;
-    goto meta(context, next);
-}
-
-__code meta(struct Context* context, enum Code next) {
-    goto (context->code[next])(context);
-}
-
-\end{lstlisting}
-
-Gears OS では継続先の Code Gear へと継続する前に Meta Code Gear である
-stub Code Gear へと継続する。
-
+stub Code Gear は Code Gear 毎にあり、次の Code Gear へと継続する前に挿入される。
+つまり goto による継続を行うと、実際には次の Code Gear の stub Code Gear を呼び出す。
 stub Code Gear では、継続先が求める Input Code Gear、Output Code Gear を Context から参照している。
-Gearef は Context から Data Gear を参照するためのマクロである。
-stub Code Gear は自動生成されるため、ユーザーレベルでは Context を直接触ることなくプログラミングできる。
-
-また、Code Gear は継続の際 meta へと goto する。
-Context はすべての Code Gear のリストを持っており、継続先の Code Gear のアドレスは
-enum で対応付けられた Code Gear のアドレスのリストを参照して継続を行う。
 
 
 Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される。
--- a/paper/src/context.h	Thu Jan 24 16:10:56 2019 +0900
+++ b/paper/src/context.h	Fri Jan 25 03:48:23 2019 +0900
@@ -38,15 +38,25 @@
         struct Queue* wait; // tasks waiting this dataGear
     } Meta;
     struct Context Context;
-    struct Timer {
-        union Data* timer;
-        enum Code start;
-        enum Code end;
+    // Stack Interface
+    struct Stack {
+        union Data* stack;
+        union Data* data;
+        union Data* data1;
+        enum Code whenEmpty;
+        enum Code clear;
+        enum Code push;
+        enum Code pop;
+        enum Code pop2;
+        enum Code isEmpty;
+        enum Code get;
+        enum Code get2;
         enum Code next;
-    } Timer;
-    struct TimerImpl {
-        double time;
-    } TimerImpl;
+    } Stack;
+    // Stack implementations
+    struct SingleLinkedStack {
+        struct Element* top;
+    } SingleLinkedStack;
     ....
 }; // union Data end       this is necessary for context generator