# HG changeset patch # User ikkun # Date 1494848873 -32400 # Node ID 896596d841c91931d2a1b05e99df403654ee99d9 # Parent 3969cb54328a2679bf1296313293e82efd3b91d4 add diff -r 3969cb54328a -r 896596d841c9 presen/fig/gears_structure.graffle Binary file presen/fig/gears_structure.graffle has changed diff -r 3969cb54328a -r 896596d841c9 presen/s6/themes/blank.css --- a/presen/s6/themes/blank.css Mon May 15 18:24:55 2017 +0900 +++ b/presen/s6/themes/blank.css Mon May 15 20:47:53 2017 +0900 @@ -72,6 +72,7 @@ font-size: 160%; } li { + margin-top: 15px; margin-bottom: 15px; } p, diff -r 3969cb54328a -r 896596d841c9 presen/s6/themes/projection.css --- a/presen/s6/themes/projection.css Mon May 15 18:24:55 2017 +0900 +++ b/presen/s6/themes/projection.css Mon May 15 20:47:53 2017 +0900 @@ -20,7 +20,7 @@ top: 0; left: 0; margin: 0; - padding: 0% 4% 0% 4%; + padding: 2% 4% 0% 4%; /* css note: order is => top right bottom left */ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; diff -r 3969cb54328a -r 896596d841c9 presen/scripts/prettify.css --- a/presen/scripts/prettify.css Mon May 15 18:24:55 2017 +0900 +++ b/presen/scripts/prettify.css Mon May 15 20:47:53 2017 +0900 @@ -1,14 +1,18 @@ /* CSS from google html5slides(https://code.google.com/p/html5slides/) */ +code { + display: inline-block; +} + pre > code { + display: block; + font-family: 'Droid Sans Mono', 'Courier New', monospace; font-size: 20px; line-height: 28px; padding: 5px 10px; - letter-spacing: -1px; - margin-top: 40px; margin-bottom: 40px; diff -r 3969cb54328a -r 896596d841c9 presen/slide.html --- a/presen/slide.html Mon May 15 18:24:55 2017 +0900 +++ b/presen/slide.html Mon May 15 20:47:53 2017 +0900 @@ -4,7 +4,7 @@ Gears OS における並列処理 - + @@ -32,7 +32,6 @@ $('code').each(function(_, el) { if (!el.classList.contains('noprettyprint')) { el.classList.add('prettyprint'); - el.style.display = 'block'; } }); prettyPrint(); @@ -86,16 +85,31 @@
-

メタ計算を使った並列処理

+

研究目的

+ + + +
+
+ +

メタ計算を使った並列処理

-

Code Gear Data Gear

+

Code Gear と Data Gear

@@ -118,7 +132,7 @@
-

Code Gear Data Gear を用いた計算

+

Code Gear と Data Gear を用いた計算

-

メタ計算

+

Code Gear の例

+ + +
_code clearSingleLinkedStack(struct SingleLinkedStack* stack,__code next(...)) {
+    stack->top = NULL;
+    goto next(...);
+}
+
+__code pushSingleLinkedStack(struct SingleLinkedStack* stack,union Data* data, __code next(...)) {
+    Element* element = new Element();
+    element->next = stack->top;
+    element->data = data;
+    stack->top = element;
+    goto next(...);
+}
+
+ + +
+
+ +

メタ計算

+
+ message +
+
@@ -159,7 +201,7 @@

Gears OS の並列性

@@ -176,8 +218,11 @@ @@ -192,9 +237,20 @@

Gears OS の構成

+
+ message +
+
@@ -204,7 +260,8 @@ @@ -250,7 +307,7 @@
  • Worker thread で動くTaskスケジューラーである。
  • synchronized queue からTask の List を読み込み実行する。
  • Data Gear の待ち合わせ管理を行う。
  • -
  • CPU Worker はreceive Tasl というAPI を持ち、Taskがなくなるまで繰り返す。
  • +
  • CPU Worker はreceive Task というAPI を持ち、Taskがなくなるまで繰り返す。
  • @@ -264,11 +321,65 @@
  • GPU へのデータ転送及びGPU側でのTaskの実行はTaskのMeta Code Gear で行われる。
  • + + + +
    -

    依存関係の解決

    +

    依存関係の解決

    diff -r 3969cb54328a -r 896596d841c9 presen/slide.md --- a/presen/slide.md Mon May 15 18:24:55 2017 +0900 +++ b/presen/slide.md Mon May 15 20:47:53 2017 +0900 @@ -4,6 +4,14 @@ lang: Japanese code-engine: coderay +# 研究目的 +- 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて 信頼性が高い並列処理を行う Gears OS を開発している +- Gears OS では Task を Code Gear と実行するときに必要な Input Data Gear と出力するための Output Data Gear の組で表現される。 Input Data Gear/Output Data Gear によって依存関係が決定し、それにそって並列実行を行う. +- 信頼性の確保はモデルチェック、検証等を使用して行う。この信頼性のための計算は通常の計算とは別の階層のメタ計算として記述する。 +- また、 メタ計算は信頼性の他に CPU, GPU などの実行環境の切り替え, データ拡張等の柔軟性を提供する。 +- 本研究では、 Gears OS の並列処理機構の実装を行う。また、並列処理の実行を検証をメタ計算として記述することで、 並列処理の精度を保 +証する。 + # メタ計算を使った並列処理 - 並列処理のプログラミングはチューニングや信頼性の確保が困難である。 @@ -12,14 +20,14 @@ - CbC は Code Gear と Data Gear という処理とデータの単位を持っており、メタ計算を行うための Meta Code Gear、Meta Data Gear がある。 - Gears OS は CbC を用いて記述されている。 -# Code Gear Data Gear +# Code Gear と Data Gear -- Code Gear Data Gear とはプログラムを分解し、処理の部分を Code Gear、int や文字列などの部分を Data Gear という単位で分割したものである。 -- Code Gearの処理はその処理に必要な Data Gear が揃ってから行われる。 +- Code Gear、Data Gear とはプログラムを分解し、処理の部分を Code Gear、int や文字列などの部分を Data Gear という単位で分割したものである。 +- Code Gear の処理はその処理に必要な Data Gear が揃ってから行われる。 - Code Gear の処理の移行は goto を使って行い、この移行の仕方を継続という。 - goto による移行は戻り値を持たないため、スタックを積む必要のない、スタックに積まない継続を軽量継続と呼ぶ。 -# Code Gear Data Gear を用いた計算 +# Code Gear と Data Gear を用いた計算 - Code Gear の処理の実行は、接続された Data Gear が揃ってから実行される。 - Data Gear には Output Data Gear と Input Data Gear があり、Code Gear は接続された Data Gear 以外を変更することはない。 @@ -27,12 +35,35 @@ - Code Gear の処理は tail call のみで遷移を行う関数型プログラミングである。 - agda に変換することができ、プログラムの正しさを証明できる。 +# Code Gear の例 +- 下記のコードは Code Gear で記述された stack のコードの一部である +- Code Gear は \_\_code Code Gear で始まり、次の Code Gear へ goto で遷移する。 + +```c +_code clearSingleLinkedStack(struct SingleLinkedStack* stack,__code next(...)) { + stack->top = NULL; + goto next(...); +} + +__code pushSingleLinkedStack(struct SingleLinkedStack* stack,union Data* data, __code next(...)) { + Element* element = new Element(); + element->next = stack->top; + element->data = data; + stack->top = element; + goto next(...); +} +``` + # メタ計算 - メタ計算は通常の計算のための計算である - 並列処理の依存関係の解決、GPUなどのアーキテクチャ実行のための処理を行う。 - Gears OSではメタ計算は Meta Code Gear、Meta Data Gear で表現される。 +
    + message +
    + # Gears OS - Gears OS は Code Gear、Data Gearの単位を用いて開発されており、CbCで記述される。 @@ -41,7 +72,7 @@ # Gears OS の並列性 -- Code Gear が処理するのに必要なinput Data Gear と処理実行後に出力される Input Data Gear の組を Task と呼ぶ。 +- Code Gear が処理するのに必要な Input Data Gear と処理実行後に出力される Input Data Gear の組を Task と呼ぶ。 - Code Gear は Task 以外とは依存関係がない - 依存関係が明確化されている Code Gear Data Gear で記述することで、並列化し易い。 @@ -52,8 +83,8 @@ # Gears OS の柔軟性 - Gears OS はメタ計算を使用することで --- データ拡張や機能の追加 --- GPU 等の様々なアーキテクチャでも同じプログラムの動作 + - データ拡張や機能の追加 + - GPU 等の様々なアーキテクチャでも同じプログラムの動作 - メタ計算は通常の処理と階層を分けて処理を行う。
    @@ -63,12 +94,22 @@ # Gears OS の構成 - Gears OS は以下の要素で構成される。 + - Context + - TaskQueue + - TaskManager + - Worker + +
    + message +
    # Context - Gears OS は Context と呼ばれる接続可能な Code Gear、Data Gear のリスト、Temporal Data Gear のためのメモリ空間等を持っている Meta Data Gear を持つ。 - Gears OS は必要な Code Gear、Data Gear に参照したい場合、この Context を通す必要がある。 - Context は 接続に必要な Code/Data Gear のリスト、 Data Gear を確保するためのメモリ空間、実行する Code Gear、Code Gear の実行に必要な Input Data Gear のカウンタ等をもっている。 + + # TaskManager - TaskManager は Task、Worker の生成 @@ -90,7 +131,7 @@ - Worker thread で動くTaskスケジューラーである。 - synchronized queue からTask の List を読み込み実行する。 - Data Gear の待ち合わせ管理を行う。 -- CPU Worker はreceive Tasl というAPI を持ち、Taskがなくなるまで繰り返す。 +- CPU Worker はreceive Task というAPI を持ち、Taskがなくなるまで繰り返す。 # CUDAWoker - CPUWoker を再利用して作成するTask スケジューラー @@ -112,13 +153,42 @@ - 呼び出される Code Gear の引数となる Data Gear はここで全て定義される。 - Code Gear、Data Gear に参照するために Context を通す必要があるが、interface を記述することでデータ構造の API と Data Gear を結びつけることが出来、 呼び出しが容易になった。 +```c +typedef struct Stack{ + union Data* stack; + union Data* data; + union Data* data1; + __code whenEmpty(...); + __code clear(Impl* stack,__code next(...)); + __code push(Impl* stack,union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data*, ...)); + __code pop2(Impl* stack, union Data** data, union Data** data1, __code next(union Data**, union Data**, ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + __code get(Impl* stack, union Data** data, __code next(...)); + __code get2(Impl* stack,..., __code next(...)); + __code next(...); +} Stack; +``` + # stub Code Gear - Code Gear が必要とする Data Gear を取り出す際に Context を通す必要があるが、Context を直接扱うのはセキュリティ上好ましくない。 - そこで Context から必要なデータを取り出して Code Gear に接続する stub Code Gear を定義し、これを介して間接的に必要な Data Gear にアクセスする。 - stub Code Gear は Code Gear 毎に生成され、次の Code Gear へと継続する間に挟まれる。 -# 生成 +# stub Code Gear の生成 + +- stub Code Gear は Code Gear 毎に記述する必要があり、そのCode Gear の引数を見て取り出す Data Gear を選択する。 +- stub Code Gear を 自動生成する generate stub を Perl スクリプトで作成することによって Code Gear の記述量を約半分にすることができる。 +- stub を生成するために generate_stub は指定された cbc ファイルの __code型である Code Gear を取得し、引数から必要な Data Gear を選択する。 +- generate_stub は引数と interface を照らし合わせ、Gearef または GearImpl を決定する。 +- また、この時既に stub Code Gear が記述されている Code Gear は無視される。 +- cbc ファイルから、生成した stub Code Gear を加えて stub を加えたコードに変換を行う。 + +# Context の生成 + +- generate_context は Context.h、Interface.cbc、generate_stub で生成されたImpl.cbc を見て Context を生成する Perl スクリプトである。 + --> # 依存関係の解決 @@ -134,9 +204,62 @@ # Task の設定におけるメタ計算の問題 - 現在のGears OS では並列実行するTask の設定を以下の用に行っている。 - 実行するCode Gear 揃っていない Input Data Gear の数、Input Data Gear/Output Data Gear への参照等をノーマルレベルで記述している。 +- ここに論文で使っていたcode1を入れる # Task の設定におけるメタ計算の問題 - この記述方法では Meta Data Gearである Task を直接参照しているためノーマルレベルでの記述は好ましくなく、メタレベルでの記述を行いたい。 - そこで以下のような記述を新たに考案した。 -- par goto は先に上げたCode1 に変換されるきじゅつであり、これによりノーマルレベルでは直接 Taskを参照せずに par goto の引数で Task の設定を行うことができる。 +- par goto は先に上げたCode1 に変換される記述であり、これによりノーマルレベルでは直接 Taskを参照せずに par goto の引数で Task の設定を行うことができる。 - この記述を拡張することでCPU GPUでの切り替えを行うことも可能であると考える。 +- ここに論文で使っていたcode2をいれる + +# 従来のシステムとの比較 +- Microware OS/9 モジュール単位で実装されたりreal-time OS +- compiler directve を使用する HPC +- CUDA +- golang +- Unix +- Aspect J + +# Microware OS/9 +- モジュール単位で記述された real-time OS +- モジュール内部では普通のシステムコールを行う +- ユーザーレベルとシステムレベルの区別がある +- Gears OS はメタ計算のサポートがある +- データモジュールの待ち合わせなどの機能はOS/9にはない + +# compiler directve +- C や Fortran のコードに並列用の指示を埋め込む手法 +- 専用のコンパイラが用意される +- チューニングはコンパイラが用意された機能の範囲内で行う +- Gears OS ではメタ計算を使った個別のチューニングが可能 + +# CUDA +- NVIDIA GPGPU 用の並列計算ライブラリ +- 並列計算を行うカーネルとデータ転送を記述する部分からなる +- 細かい最適化を行う場合はDriver APIを用いる +- Gears OS ではCUDAのカーネルをそのまま Code Gear として使うことができる +- データ転送部分はメタレベルで記述する + +# golang +- シンプルな構文を持つ並列言語 +- go routine 単位で並列処理を行う +- データの単位としてunion が入っている +- go routine 間の通信はchannel を用いて行う +- Gears OSでは並列処理の実装はmeta Code Gear で行う +- 通信は Data Gear の待ち合わせで行う + +# Aspect J +- Java用のメタ計算記述 +- ポイントカットと呼ばれる方法でメタ計算を挟む位置を指定する +- 計算のログを取るのに使われている +- Code Gear ではCode segment 間の任意の位置にメタ計算を挿入することができる +- Aspect J よりも下位のメタ計算を記述することが可能 + +# まとめ +- Gears OS のメタ計算を用いた並列処理の実装について考察した +- CPUWoker とGPUWoker が稼働している +- ノーマルレベルでの記述からstub とContext そしてメタ計算部分を生成するスクリプトを作成した +- 他のシステムとの比較を行った +- 今後は実装の詳細化、raspberry pi への実装 +- メタ計算を用いたプログラム検証などを行っていく