Mercurial > hg > Papers > 2019 > mitsuki-master
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} + +
--- 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