changeset 24:a05d9335563f

Update
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Sat, 13 May 2017 19:19:41 +0900
parents 69d99910fc15
children 678e6992c8ae
files 2016/2016_11_22/slide.md 2016/2016_12_13/slide.md 2016/2016_12_20/slide.md 2017/2017_04_25/slide.md 2017/2017_05_02/slide.md 2017/2017_05_09/slide.md
diffstat 6 files changed, 377 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2016/2016_11_22/slide.md	Sat May 13 19:19:41 2017 +0900
@@ -0,0 +1,101 @@
+title: Gears OS
+author: Tatsuki IHA
+profile:
+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 によって依存関係が決定し、それにそって並列実行を行う.
+- 依存関係の解決やモデル検査等の本論の計算を行うためのメタな計算を Meta Code Gear で行う.
+- 現在の Gears では Stack や Queue の operatation の API が存在しなため, 記述が困難になっている. そのため, この研究では Gears OS における API の記述方法を設計し, 実装する
+
+## 今週
+- しゅうかつ!()
+- SynchronizedQueue のインターフェースをとりあえず作った
+- slack に \#times_innparusu作った, 多分やっていることと愚痴をつぶやく用
+    - \#gears 作らなきゃ -> 既にあった
+
+## SynchronizedQueue のインターフェース
+- 中身はSingleLinkedQueue
+
+``` c
+union Data* createSynchronizedQueue(struct Context* context) {
+    struct Queue* queue = &ALLOCATE(context, Queue)->queue;
+    struct SingleLinkedQueue* singleLinkedQueue = &ALLOCATE(context, SingleLinkedQueue)->singleLinkedQueue;
+    queue->queue = (union Data*)singleLinkedQueue;
+    singleLinkedQueue->top  = NULL;
+    singleLinkedQueue->last = NULL;
+    queue->take  = C_takeSynchronizedQueue;
+    queue->put  = C_putSynchronizedQueue;
+    queue->isEmpty = C_isEmptySynchronizedQueue;
+    queue->clear = C_clearSynchronizedQueue;
+    return (union Data*)(queue);
+}
+```
+
+## SynchronizedQueue の CS
+- SingleLinkedQueue の take と put と違って CAS を挟んでいる
+- まだ 何回かtry したら諦めるコード入れていない
+
+``` c
+__code putSynchronizedQueue(struct Context* context, struct SingleLinkedQueue* queue, struct Element* element, union Data* data, enum Code next) {
+    element->next = NULL;
+    element->data = data;
+    if (queue->last) {
+        Element* last = queue->last;
+        if (__sync_bool_compare_and_swap(&queue->last, last, element)) {
+            last->next = element;
+        } else {
+            goto meta(context, C_putSynchronizedQueue);
+        }
+    } else {
+        if (__sync_bool_compare_and_swap(&queue->top, NULL, element)) {
+            queue->last = element;
+        } else {
+            goto meta(context, C_putSynchronizedQueue);
+        }
+    }
+    goto meta(context, next);
+}
+
+__code takeSynchronizedQueue(struct Context* context, struct SingleLinkedQueue* queue, union Data** data, enum Code next) {
+    if (queue->top) {
+        struct Element* top = queue->top;
+        if (__sync_bool_compare_and_swap(&queue->top, top, top->next)) {
+            *data = top->data;
+        } else {
+            goto meta(context, C_takeSynchronizedQueue);
+        }
+    } else {
+        *data = NULL;
+    }
+    goto meta(context, next);
+}
+```
+
+## SynchronizedQueue のput の呼び出し
+- meta_spawnTask で格納する Queue を入れ替えている
+    - Queue が複数あった場合, どうやって入れるQueue を選択するか?
+
+``` c
+__code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) {
+    context->data[D_Queue] = (union Data *)queue;
+    goto meta(context, context->next);
+}
+
+__code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) {
+    struct Queue* queue;
+    if (task->idsCount == 0) {
+        // enqueue activeQueue
+        queue = activeQueue;
+    } else {
+        // enqueue waitQueue
+        queue = waitQueue;
+    }
+    queue->data = element->data;
+    queue->next = context->next;
+    goto meta_spawnTask(context, queue, queue->put);
+}
+```
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2016/2016_12_13/slide.md	Sat May 13 19:19:41 2017 +0900
@@ -0,0 +1,50 @@
+title: Gears OS
+author: Tatsuki IHA
+profile:
+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 によって依存関係が決定し、それにそって並列実行を行う.
+- 依存関係の解決やモデル検査等の本論の計算を行うためのメタな計算を Meta Code Gear で行う.
+- 現在の Gears では Stack や Queue の operatation の API が存在しなため, 記述が困難になっている. そのため, この研究では Gears OS における API の記述方法を設計し, 実装する
+
+
+## 今週
+- Elixir の実測してました
+    - Erlang vm を使ってるので message passing
+- nkmr 研が前に用意していたVM 16台で実測
+- 例題は一番早くなった Twice で
+
+## 実装方法
+- 1台は scheduler(FIFO ですが)
+- 1台あたりの割当の長さは length/(n-1)
+- scheduler 用のプロセスに答えを集約
+
+## 早くなった?
+- length: 2000万で実測
+- 1台に比べて13台だと 7.11倍にはなった
+- スケジューラが13台にメッセージ送ってるのでそれで遅くなった?
+
+<div style="text-align: center;">
+    <img src="./pictures/result2.svg" alt="message" width="500">
+</div>
+
+
+## こんな感じ
+- 1, 10415678
+- 2, 5657481
+- 3, 2709888
+- 4, 2539298
+- 5, 1856163
+- 6, 1821989
+- 7, 1687275
+- 8, 1646491
+- 9, 1711476
+- 10, 1514989
+- 11, 1641582
+- 12, 1477745
+- 13, 1464196
+- 14, 1504841
+- 15, 1483625
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2016/2016_12_20/slide.md	Sat May 13 19:19:41 2017 +0900
@@ -0,0 +1,54 @@
+title: Gears OS
+author: Tatsuki IHA
+profile:
+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 によって依存関係が決定し、それにそって並列実行を行う.
+- 依存関係の解決やモデル検査等の本論の計算を行うためのメタな計算を Meta Code Gear で行う.
+- 現在の Gears では Stack や Queue の operatation の API が存在しなため, 記述が困難になっている. そのため, この研究では Gears OS における API の記述方法を設計し, 実装する
+
+
+## 今週
+- Gears の各データ構造のテストコードを一応書いてみました
+
+
+## Queue Test
+- meta でtestしたいよね,ということでとりあえずstubに assert を埋め込みました
+
+
+``` c
+__code stack_test1(struct Context* context, struct Task* task, struct Stack* stack) {
+    task->code = C_stack_test1;
+    stack->next = C_stack_test2;
+    stack->data = (union Data*)task;
+    goto meta(context, stack->push);
+}
+
+__code stack_test1_stub(struct Context* context) {
+    Task* task = &ALLOCATE(context, Task)->Task;
+    struct Stack* stack = &(createSingleLinkedStack(context)->Stack);
+    assert(stack->stack->SingleLinkedStack.top == NULL);
+    context->data[D_Stack]->Stack.stack = (union Data*)stack;
+    goto stack_test1(context,
+            task,
+            &context->data[D_Stack]->Stack.stack->Stack);
+}
+
+__code stack_test2(struct Context* context, struct Task* task, struct Stack* stack) {
+    task->code = C_stack_test2;
+    stack->next = C_stack_test3;
+    stack->data = (union Data*)task;
+    goto meta(context, stack->push);
+}
+
+__code stack_test2_stub(struct Context* context) {
+    assert(context->data[D_Stack]->Stack.stack->Stack.stack->SingleLinkedStack.top->data->Task.code == C_stack_test1);
+    Task* task = &ALLOCATE(context, Task)->Task;
+    goto stack_test2(context,
+            task,
+            &context->data[D_Stack]->Stack.stack->Stack);
+}
+```
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2017/2017_04_25/slide.md	Sat May 13 19:19:41 2017 +0900
@@ -0,0 +1,74 @@
+title: Gears
+author: Tatsuki IHA
+profile:
+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 によって依存関係が決定し、それにそって並列実行を行う.
+- 信頼性の確保はモデルチェック、検証等を使用して行う。この信頼性のための計算は通常の計算とは別の階層のメタ計算として記述する。
+- 本研究では、 Gears OS の並列処理機構の実装を行う。また、並列処理の検証をメタ計算として記述することで、 並列処理の精度を保証する。
+
+## お話
+- 先生印鑑ください もらった
+- par goto の話
+
+## 今の並列実行
+- メタレベルで行っている
+- しかしこの処理は並列実行されることを除けば通常の CbC の goto と同等になるはず
+
+```
+__code createTask2(TaskManager* taskManager, struct Context *task, Integer *integer1, Integer *integer2, Integer *integer3) {
+    task->next = C_add;
+    task->idgCount = 0;
+    task->data[task->idg] = (union Data*)integer1;
+    task->data[task->idg+1] = (union Data*)integer2;
+    task->maxIdg = task->idg + 2;
+    task->odg = task->maxIdg;
+    task->data[task->odg] = (union Data*)integer3;
+    task->maxOdg = task->odg + 1;
+    taskManager->next = C_createTask1;
+    goto meta(context, taskManager->taskManager->TaskManager.spawn);
+}
+```
+
+## par goto
+- ノーマルレベルの並列構文を用意
+- par goto は 各 Thread で実行される
+- \_\_exit は この Task の終わりを示している
+    - Taskの context を開放する
+    - 実際には Gears では 直接exitするのではなく, Output Data Gear への書き込み処理をする Code Gear に継続するはず
+
+```
+ __code createTask(Integer *integer1, Integer * integer2, Integer *output, __code next(...)) {
+    par goto add(integer1, integer2, output, __exit);
+    goto next(...);
+}
+```
+
+- 今の Task の Code Gear がこんな感じ
+
+```
+// 今の Code Gear
+__code add(Integer *integer1, Integer *integer2, Integer *output, next(...)) {
+      ....
+      goto next(...)
+}
+```
+
+## par goto
+- input と output の切り分けを入れたいような
+- par goto に書き出し先を指定できるようにする?(Todo の lambda みたいに書き出し先を指定する)
+- 複数outputを受け取る場合は?
+
+```
+par goto A->init(in1, in2, \A -> outPut = A)
+```
+
+```
+__code add(Integer *integer1, Integer *integer2, Integer *output) {
+     ...
+      goto next(output); // Output Data Gear commit?
+}
+```
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2017/2017_05_02/slide.md	Sat May 13 19:19:41 2017 +0900
@@ -0,0 +1,26 @@
+title: Raspberry Pi のお話
+author: Tatsuki IHA
+profile:
+lang: Japanese
+code-engine: coderay
+
+## お話
+- Raspberry Pi zero に Raspbian を入れました
+
+## Raspbian
+- https://www.raspberrypi.org/downloads/raspbian/
+- ↑のRASPBIAN JESSIE LITE を入れた(minimal image)
+- 初期設定
+    - といっても oneユーザーにすべての権限を与えただけ
+
+## 問題
+- Raspberry Pi zero の無線LANユニットがない
+- その辺にある Usb to Ethernet では接続できず
+
+## 解決方法
+- mac のネットワーク共有を使えばネットに繋げられる様です(なんなら SSH も出来る)
+    - なぜか、最初やったときは、 ラズパイにクラスAのアドレスが振られて, 学科の端末とコンフリクト
+    - 試しに今日やってみたら, クラスCが振られてssh出来るようになった
+- ググった感じは https://www.amazon.co.jp/exec/obidos/ASIN/B010EGTPVY/hogesuke-22/ で接続出来るみたいです
+- 他のものは最初から無線ユニットが入った物がいいかもですね(zero シリーズだと zero w が無線のほかにbluetooth が入っている)
+    - https://www.raspberrypi.org/products/pi-zero-w/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2017/2017_05_09/slide.md	Sat May 13 19:19:41 2017 +0900
@@ -0,0 +1,72 @@
+title: Gears OS
+author: Tatsuki IHA
+profile:
+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 の並列処理機構の実装を行う。また、並列処理の実行を検証をメタ計算として記述することで、 並列処理の精度を保証する。
+
+## 先週
+- GW たのしかったです
+
+## par goto
+- par goto の変換スクリプトを書きたい
+
+```
+par goto add(integer1, integer2, output, __exit)
+```
+
+## 問題点
+- par goto は↓のように変換されるはず
+- idg, odg をtaskのdataをセットするための切り分けをしたい
+
+```
+    task->next = C_add;
+    task->idgCount = 2;
+
+    // DG のセットを切り分けたい
+    task->data[task->idg] = (union Data*)integer1;
+    task->data[task->idg+1] = (union Data*)integer2;
+    task->maxIdg = task->idg + 2;
+    task->odg = task->maxIdg;
+    task->data[task->odg] = (union Data*)integer3;
+
+
+    task->maxOdg = task->odg + 1;
+    taskManager->next = C_createTask1;
+    goto meta(context, taskManager->taskManager->TaskManager.spawn);
+```
+
+## Task で実行される Code Gear
+- 実際 task で実行される Code Gear は 引数に output data もとっている
+
+```
+__code add(struct Integer* input1, struct Integer* input2, struct Integer* output) { 
+    output->value = input1->value + input2->value; 
+    printf("%d + %d = %d\n", input1->value, input2->value, output->value); 
+    goto meta(context, context->next); 
+}
+```
+
+- ↓のように Code Gear の引数は Input Data Gear のみにして、あとで変換
+- そうすると, 引数で input Data の数がわかる
+
+```
+__code add(Integer *intege1, Integer *integer2, next(output, output2,...)) {
+    union Data* output = integer1->value + integer1->value;
+    union Data* output2 =....
+    goto next(output, output2, ...)
+}
+```
+
+## Par goto で切り分ける?
+- output に何かしらのフラグを付ける
+
+```
+par goto(input1, input2, +output)
+```