# HG changeset patch # User mir3636 # Date 1487216202 -32400 # Node ID fecc23286565c80c609574d0b7cf41fdb2b69b1e # Parent f38236c1362e380f186f8c8aae33c2dd78779336 update diff -r f38236c1362e -r fecc23286565 presen/fig/context.svg --- a/presen/fig/context.svg Thu Feb 16 11:27:20 2017 +0900 +++ b/presen/fig/context.svg Thu Feb 16 12:36:42 2017 +0900 @@ -138,12 +138,12 @@ id="g96"> \ No newline at end of file + d="m 286.4435,133.9104 -4.8335,-7.0454 -3.4408,4.9154 8.2743,2.13 z" /> \ No newline at end of file diff -r f38236c1362e -r fecc23286565 presen/slide.html --- a/presen/slide.html Thu Feb 16 11:27:20 2017 +0900 +++ b/presen/slide.html Thu Feb 16 12:36:42 2017 +0900 @@ -87,17 +87,17 @@

メタ計算の重要性

    -
  • プログラムを記述する際、通常の処理の他に、メモリ管理やスレッド管理、CPU や GPU の資源管理等、記述しなければならない処理が存在する。これらの計算を Meta Computation と呼ぶ。
  • -
  • Meta Computation はノーマルレベルの計算から切り離して記述したい。
  • +
  • プログラムを記述する際、ノーマルな処理の他に、メモリ管理やスレッド管理、CPU や GPU の資源管理等、記述しなければならない処理が存在する。これらの計算をメタ計算と呼ぶ。
  • +
  • メタ計算はノーマルな計算から切り離して記述したい。
  • そのためには処理を細かく分割する必要があるが、関数やクラスなどの単位は容易に分割できない。
  • -
  • そこで当研究室では Meta Computation を柔軟に記述するためのプログラミング言語の単位として Code Gear、Data Gear という単位を提案している。
  • +
  • そこで当研究室ではメタ計算を柔軟に記述するためのプログラミング言語の単位として Code Gear、Data Gear という単位を提案している。
@@ -107,7 +107,7 @@

Code Gear と Data Gear

  • Code Gear とはプログラムの処理の単位である。
  • -
  • Code Gear は関数に比べて細かく分割されているので Meta Computation をより柔軟に記述できる。
  • +
  • Code Gear は関数に比べて細かく分割されているのでメタ計算をより柔軟に記述できる。
  • Data Gear はデータの単位であり、Code Gear は 任意の数の Input Data Gear を参照して処理を行い、Output Data Gear を出力し処理を終える。
@@ -140,9 +140,20 @@
  • Gears OS は Code Gear、 Data Gear の単位を用いて開発されており、CbC で記述されている。
  • 並列実行するための Task を、実行する Code Gear 、実行に必要な Input Data Gear 、Output Data Gear の組で表現する。
  • -
  • またGears OS では Meta Computation を Meta Code Gear、Meta Data Gear で表現する。
  • -
  • Meta Code Gear は通常の Code Gear の直後に遷移され、Meta Computation を実行する。
  • -
  • Meta Code Gear で OS の 機能であるメモリ管理やスレッド管理を行う。
  • +
  • またGears OS ではメタ計算を Meta Code Gear、Meta Data Gear で表現する。
  • +
  • Meta Code Gear はノーマルの Code Gear の直後に遷移され、メタ計算を実行する。
  • +
  • Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う。
  • +
+ + + +
+ +

CbC による Gears OS 記述の問題点

+
    +
  • Gears OS を CbC で実装する上でメタ計算の記述が煩雑であることがわかった。
  • +
  • 本研究ではこれらのメタ計算を自動生成することにより Gears OS を記述する上においてより良い構文をユーザーに提供することにした。
  • +
  • そのためのプロトタイプとして perl スクリプトを作成した。
@@ -151,10 +162,38 @@

Context

    -
  • Gears OS には Context と呼ばれる接続可能な Code/Data Gear のリスト、Temporal Data Gear のためのメモリ空間等を持っている Meta Data Gear がある。
  • -
  • Gears OSは必要なCode/DataGearに参照したい場合、このContext を通す必要がある。
  • +
  • Gears OS には Context と呼ばれる接続可能な Code Gear、Data Gear のリスト、Temporal Data Gear のためのメモリ空間等を持っている Meta Data Gear がある。
  • +
  • Gears OSは必要なCode Gear、Data Gearに参照したい場合、このContext を通す必要がある。
  • +
+ +

message

+ + +
+
+ +

interface の記述

+
    +
  • interface を記述することでデータ構造のapiと Data Gear を結びつけることが出来、呼び出しが容易になった。
  • +
  • create は関数呼び出しで呼び出され、interface と impliment の初期化と Code Gear のポインタの設定を行う。
+
Stack* createSingleLinkedStack(struct Context* context) {
+    struct Stack* stack = new Stack();
+    struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
+    stack->stack = (union Data*)singleLinkedStack;
+    singleLinkedStack->top = NULL;
+    stack->push = C_pushSingleLinkedStack;
+    stack->pop  = C_popSingleLinkedStack;
+    stack->pop2  = C_pop2SingleLinkedStack;
+    stack->get  = C_getSingleLinkedStack;
+    stack->get2  = C_get2SingleLinkedStack;
+    stack->isEmpty = C_isEmptySingleLinkedStack;
+    stack->clear = C_clearSingleLinkedStack;
+    return stack;
+}
+
+
@@ -162,7 +201,7 @@

Gearef、GearImpl

  • Context には Allocation で生成した Data Gear へのポインタが格納されている。
  • -
  • Code Gear が Context にアクセスする際、ポインタを使用してデータを取り出すためコードが煩雑になってしまう。
  • +
  • Code Gear が Context にアクセスする際、ポインタを用いてデータを取り出すためコードが煩雑になってしまう。
__code clearSingleLinkedStack_stub(struct Context* context) {
@@ -190,8 +229,8 @@
 

stub Code Gear

  • Code Gear が必要とする Data Gear を取り出す際に Context を通す必要がある。
  • -
  • しかし、Context を直接扱うのはセキュリティ上好ましくない。
  • -
  • そこで Context から必要なデータを取り出して Code Gear に接続する stub Code Gear を定義し、これを介して間接的に必要な Data Gear にアクセスする。
  • +
  • しかし、メタであるContext をノーマルレベルの Code Gear から直接アクセスするのはよろしくない。
  • +
  • そこで Context から必要なデータを取り出して Code Gear に接続する、メタレベルの stub Code Gear を定義し、これを介して間接的に必要な Data Gear にアクセスする。
__code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) {
@@ -210,36 +249,10 @@
 
-

interface の記述

-
    -
  • interface を記述することで Context を通して Code Gear が参照できるようになった。
  • -
  • create は関数呼び出しで呼び出され、interface と impliment の初期化と Code Gear のポインタの設定を行う。
  • -
  • return で interface を返し、その先で inter face の持つ Code Gear へと継続できるようになる。
  • -
-
Stack* createSingleLinkedStack(struct Context* context) {
-    struct Stack* stack = new Stack();
-    struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
-    stack->stack = (union Data*)singleLinkedStack;
-    singleLinkedStack->top = NULL;
-    stack->push = C_pushSingleLinkedStack;
-    stack->pop  = C_popSingleLinkedStack;
-    stack->pop2  = C_pop2SingleLinkedStack;
-    stack->get  = C_getSingleLinkedStack;
-    stack->get2  = C_get2SingleLinkedStack;
-    stack->isEmpty = C_isEmptySingleLinkedStack;
-    stack->clear = C_clearSingleLinkedStack;
-    return stack;
-}
-
- - -
-
-

Context、stub Code Gear の自動生成

    -
  • Gears OS では通常の計算の他に Context や stub などの meta computation を記述する必要がある。
  • -
  • 現在の CbC で Gears OS を記述すると、この meta computation の記述も行わなくてはならず、これには多くの労力を要する。
  • +
  • Gears OS ではノーマルレベルの計算の他に Context や stub などのメタ計算を記述する必要がある。
  • +
  • 現在の CbC で Gears OS を記述すると、このメタ計算の記述も行わなくてはならず、これには多くの労力を要する。
  • この記述を助けるために Context を生成する generate_context と stub Code Gear を生成する generate_stub を perl スクリプトで作成した。
@@ -256,6 +269,18 @@
  • cbc ファイルのから、生成した stub Code Gear を加えて、c ファイルを生成する。
  • +
    __code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) {
    +    stack->top = NULL;
    +    goto meta(context, next);
    +}
    +
    +__code clearSingleLinkedStack_stub(struct Context* context) {
    +        SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
    +        enum Code next = Gearef(context, Stack)->next;
    +        goto clearSingleLinkedStack(context, stack, next);
    +}
    +
    +
    @@ -265,7 +290,9 @@
  • Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。
  • generate_context は context.h から Data Gear、c ファイルから Code Gear を取得。
  • 取得した Code/Data Gear の enum の定義は enumCode.h、enumData.h に生成される。
  • +
  • Code/Data Gear の名前とポインタの対応は この enum と関数ポインタによって表現される。
  • generate_context は取得した Code/Data Gear から Context の生成を行うコードを生成する。
  • +
  • Context には Allocation で生成した Data Gear へのポインタも格納されているが、Data Gear の Allocation を行うコードは dataGearInit.c に生成される。
  • これらを自動生成することで Gears OS の記述量を約半分にすることができます。 message
  • @@ -278,8 +305,8 @@
    • 本研究では interface の記述、CbC ファイルから Gears OS の記述に必要な Context と stub の生成を行う perl スクリプトの生成を行なった。
    • これにより Gears OS のコードの煩雑さは改善され、ユーザーは Context への接続を意識する必要がなくなった。
    • -
    • 今後の課題は Code Gear から meta computation を行う meta Code Gear を生成できるようにし、ユーザーがメタレベルの処理を意識せずにコードを記述できるようにする。
    • -
    • また、今回 perl スクリプトによって Context や stub の生成を行なったが、LLVM/clang 上で実装しコンパイラで直接 CbC を実行できるようにすることも優先する。
    • +
    • 今後の課題は Code Gear からメタ計算を行う meta Code Gear を生成できるようにし、ユーザーがメタレベルの処理を意識せずにコードを記述できるようにする。
    • +
    • また、今回 perl スクリプトによって Context や stub の生成を行なったが、LLVM/clang 上で実装しコンパイラで直接 CbC を実行できるようにすることを目的とする。
    diff -r f38236c1362e -r fecc23286565 presen/slide.md --- a/presen/slide.md Thu Feb 16 11:27:20 2017 +0900 +++ b/presen/slide.md Thu Feb 16 12:36:42 2017 +0900 @@ -12,7 +12,7 @@ # Code Gear と Data Gear - Code Gear とはプログラムの処理の単位である。 -- Code Gear は関数に比べて細かく分割されているので Meta Computation をより柔軟に記述できる。 +- Code Gear は関数に比べて細かく分割されているのでメタ計算をより柔軟に記述できる。 - Data Gear はデータの単位であり、Code Gear は 任意の数の Input Data Gear を参照して処理を行い、Output Data Gear を出力し処理を終える。 # Continuation based C (CbC) @@ -44,14 +44,35 @@ - そのためのプロトタイプとして perl スクリプトを作成した。 # Context -- Gears OS には Context と呼ばれる接続可能な Code/Data Gear のリスト、Temporal Data Gear のためのメモリ空間等を持っている Meta Data Gear がある。 -- Gears OSは必要なCode/DataGearに参照したい場合、このContext を通す必要がある。 +- Gears OS には Context と呼ばれる接続可能な Code Gear、Data Gear のリスト、Temporal Data Gear のためのメモリ空間等を持っている Meta Data Gear がある。 +- Gears OSは必要なCode Gear、Data Gearに参照したい場合、このContext を通す必要がある。 + +message + +# interface の記述 +- interface を記述することでデータ構造のapiと Data Gear を結びつけることが出来、呼び出しが容易になった。 +- create は関数呼び出しで呼び出され、interface と impliment の初期化と Code Gear のポインタの設定を行う。 -message +```impl +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = new Stack(); + struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack(); + stack->stack = (union Data*)singleLinkedStack; + singleLinkedStack->top = NULL; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->pop2 = C_pop2SingleLinkedStack; + stack->get = C_getSingleLinkedStack; + stack->get2 = C_get2SingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->clear = C_clearSingleLinkedStack; + return stack; +} +``` # Gearef、GearImpl - Context には Allocation で生成した Data Gear へのポインタが格納されている。 -- Code Gear が Context にアクセスする際、ポインタを使用してデータを取り出すためコードが煩雑になってしまう。 +- Code Gear が Context にアクセスする際、ポインタを用いてデータを取り出すためコードが煩雑になってしまう。 ``` __code clearSingleLinkedStack_stub(struct Context* context) { @@ -89,27 +110,6 @@ } ``` -# interface の記述 -- interface を記述することで Context を通して Code Gear が参照できるようになった。 -- create は関数呼び出しで呼び出され、interface と impliment の初期化と Code Gear のポインタの設定を行う。 -- return で interface を返し、その先で inter face の持つ Code Gear へと継続できるようになる。 -```impl -Stack* createSingleLinkedStack(struct Context* context) { - struct Stack* stack = new Stack(); - struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack(); - stack->stack = (union Data*)singleLinkedStack; - singleLinkedStack->top = NULL; - stack->push = C_pushSingleLinkedStack; - stack->pop = C_popSingleLinkedStack; - stack->pop2 = C_pop2SingleLinkedStack; - stack->get = C_getSingleLinkedStack; - stack->get2 = C_get2SingleLinkedStack; - stack->isEmpty = C_isEmptySingleLinkedStack; - stack->clear = C_clearSingleLinkedStack; - return stack; -} -``` - # Context、stub Code Gear の自動生成 - Gears OS ではノーマルレベルの計算の他に Context や stub などのメタ計算を記述する必要がある。 - 現在の CbC で Gears OS を記述すると、このメタ計算の記述も行わなくてはならず、これには多くの労力を要する。 @@ -122,11 +122,26 @@ - 引数と interface を照らし合わせ、Gearef または GearImpl を決定する。 - cbc ファイルのから、生成した stub Code Gear を加えて、c ファイルを生成する。 +```stub +__code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) { + stack->top = NULL; + goto meta(context, next); +} + +__code clearSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); + enum Code next = Gearef(context, Stack)->next; + goto clearSingleLinkedStack(context, stack, next); +} +``` + # Context の生成 - Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。 - generate_context は context.h から Data Gear、c ファイルから Code Gear を取得。 - 取得した Code/Data Gear の enum の定義は enumCode.h、enumData.h に生成される。 +- Code/Data Gear の名前とポインタの対応は この enum と関数ポインタによって表現される。 - generate_context は取得した Code/Data Gear から Context の生成を行うコードを生成する。 +- Context には Allocation で生成した Data Gear へのポインタも格納されているが、Data Gear の Allocation を行うコードは dataGearInit.c に生成される。 - これらを自動生成することで Gears OS の記述量を約半分にすることができます。 message