changeset 10:8d0be7f20a33

Update Context
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Mon, 09 May 2016 13:38:46 +0900
parents 8fde693282cc
children 04cb189ec841
files paper/sigos.pdf paper/sigos.tex paper/src/context.c paper/src/context.h paper/src/openmp.c
diffstat 5 files changed, 157 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
Binary file paper/sigos.pdf has changed
--- a/paper/sigos.tex	Sun May 08 19:27:32 2016 +0900
+++ b/paper/sigos.tex	Mon May 09 13:38:46 2016 +0900
@@ -202,6 +202,32 @@
 Temporal Data Gear のためのメモリ空間は Context 毎に異なり、互いに干渉することは出来ない。
 Worker 間の相互作用は Persistent Data Tree への読み書きのみで行う。
 
+Code \ref{src:context}, Code \ref{src:initContext} に実際の Context の定義と初期化を示す。
+
+\lstinputlisting[label=src:context, caption=Context]{./src/context.h}
+\lstinputlisting[label=src:initContext, caption=initContext]{./src/context.c}
+
+Code \ref{src:context}, Code \ref{src:initContext} は以下の事を定義している。
+
+\paragraph* {Code Gear の名前とポインタのリスト}
+Code Gear の名前とポインタの対応は Code \ref{src:context} の enum Codeと 関数ポインタによって表現される。
+実際に Code Gear に接続する際は enum Code を指定することで接続を行う。
+これにより、実行時のルーチンなどを動的に変更することが可能となる。
+
+\paragraph* {Data Gear の Allocation 用の情報}
+Context の生成時に Allocation 用に Code \ref{src:context} の ALLOCATE\_SIZE 文の領域を確保する。
+Context にはその領域へのポインタとサイズが格納されている(Code \ref{src:context}の struct Context 内の heap, heapLimit)。
+実際に Allocation する際は heap を 必要な Data Gear のサイズに応じてインクリメントすることで Data Gear の Allocation を実現する。
+
+\paragraph* {Data Gear へのポインタ}
+Context には Allocation 等で生成した Data Gear へのポインタが格納されている。
+Code Gear は Context を通して Data Gear へアクセスする。
+
+\paragraph* {Data Gear に格納される Data Type の情報} 
+Data Gear は Code \ref{src:context} の union Data と その中の struct によって表現される。
+Context には Data Gear の Data Type の情報が格納されている。
+この情報から確保される Data Gear のサイズなどを決定する。
+
 \section{TaskQueue}
 Gears OS における Task Queue は Synchronized Queue で実現される。
 メインとなる Context と Worker 用 の Context で共有され、 Worker が TaskQueue から Task を取得し、実行することで並列処理を行う。
@@ -345,48 +371,48 @@
 また、Gears OS は以下のような性質を有している。
 
 \begin{itemize}
-\item リソース管理 \\
-  Context 毎に異なるメモリ空間を持ち、それを管理する。
-  Meta Code Gear, Meta Data Gear を用いてネットワーク管理、並行制御等を行う。
-\item 処理の効率化 \\
-  依存関係のない Code Gear は並列実行することが可能である。
-  また、Code Gear 自体が処理の最小単位となっており Code Gear を利用してプログラムを記述するとプログラム全体の並列度を高めることに繋がる。
-\item プロセッサ利用の抽象化 \\
-  Multi Core CPU, GPU を同等の実行機構で実行可能である。
+    \item リソース管理 \\
+        Context 毎に異なるメモリ空間を持ち、それを管理する。
+        Meta Code Gear, Meta Data Gear を用いてネットワーク管理、並行制御等を行う。
+    \item 処理の効率化 \\
+        依存関係のない Code Gear は並列実行することが可能である。
+        また、Code Gear 自体が処理の最小単位となっており Code Gear を利用してプログラムを記述するとプログラム全体の並列度を高めることに繋がる。
+    \item プロセッサ利用の抽象化 \\
+        Multi Core CPU, GPU を同等の実行機構で実行可能である。
 \end{itemize}
 
 これらの性質を有する Gears OS はオペレーティングシステムであると言えるので既存の OS との比較も行う。
 
 \paragraph*{Cerium}
 \begin{itemize}
-\item 依存関係 \\
-  Cerium では Task 間で依存関係を設定する。
-  Task の途中でデータが破損しても完了を TaskManager に通知し、依存関係を解決して次の Task が実行される。
-  これではデータの正しさを保証することができない。
+    \item 依存関係 \\
+        Cerium では Task 間で依存関係を設定する。
+        Task の途中でデータが破損しても完了を TaskManager に通知し、依存関係を解決して次の Task が実行される。
+        これではデータの正しさを保証することができない。
 
-  Gears OS では Task に Input/Output Data Gear を設定することで Input と Output の関係から依存関係を決定する。
-  TaskManager は Persistent Data Tree を監視し、必要な Data Gear が揃っていることを確認すると依存関係を解決する。
-\item データの型情報 \\
-  Cerium では Task にデータを引き渡すとき汎用ポインタを用いる。
-  このときデータの型情報が落ちるので Task の組み合わせが型的に安全なのか保証することができない。
+        Gears OS では Task に Input/Output Data Gear を設定することで Input と Output の関係から依存関係を決定する。
+        TaskManager は Persistent Data Tree を監視し、必要な Data Gear が揃っていることを確認すると依存関係を解決する。
+    \item データの型情報 \\
+        Cerium では Task にデータを引き渡すとき汎用ポインタを用いる。
+        このときデータの型情報が落ちるので Task の組み合わせが型的に安全なのか保証することができない。
 
-  Gears OS では型情報を持つ分割されたデータとして Data Gear を定義し、Data Gear 単位でデータを Task に引き渡す。
-  Data Gear を型シグネチャとして Task の組み合わせが正しいことを保証する。
-\item Allocator \\
-  Cerium では Thread 間で Allocator を共有している。
-  ある Thread がメモリ確保を行うとその間、他の Thread はメモリを確保することができず並列度が低下する。
+        Gears OS では型情報を持つ分割されたデータとして Data Gear を定義し、Data Gear 単位でデータを Task に引き渡す。
+        Data Gear を型シグネチャとして Task の組み合わせが正しいことを保証する。
+    \item Allocator \\
+        Cerium では Thread 間で Allocator を共有している。
+        ある Thread がメモリ確保を行うとその間、他の Thread はメモリを確保することができず並列度が低下する。
 
-  Gears OS では Thraed ごとに Context を割り当てる。
-  Context は独立したメモリ空間を持つので他の Thread と干渉することないメモリの確保を行うことができる。
-\item 並列処理との相性 \\
-  Cerium はオブジェクト指向言語である C++ で実装されている。
-  オブジェクト指向は保守性と再利用性を高めるためにカプセル化とポリモフィズムを重視する。
-  オブジェクトの状態によって振る舞いが変わるため参照透過な処理でなくなり並列処理との相性が悪い。
+        Gears OS では Thraed ごとに Context を割り当てる。
+        Context は独立したメモリ空間を持つので他の Thread と干渉することないメモリの確保を行うことができる。
+    \item 並列処理との相性 \\
+        Cerium はオブジェクト指向言語である C++ で実装されている。
+        オブジェクト指向は保守性と再利用性を高めるためにカプセル化とポリモフィズムを重視する。
+        オブジェクトの状態によって振る舞いが変わるため参照透過な処理でなくなり並列処理との相性が悪い。
 
-  Gears OS は本研究で開発している CbC を用いて実装する。
-  CbC は Code Segment という単位でプログラムを記述する。
-  Code Segment はスタックに値を積まない軽量継続を用いて他の Code Segment に遷移する。
-  この軽量継続により並列化、ループ制御などを意識した最適化がソースコードレベルで行うことができる。
+        Gears OS は本研究で開発している CbC を用いて実装する。
+        CbC は Code Segment という単位でプログラムを記述する。
+        Code Segment はスタックに値を積まない軽量継続を用いて他の Code Segment に遷移する。
+        この軽量継続により並列化、ループ制御などを意識した最適化がソースコードレベルで行うことができる。
 \end{itemize}
 
 \paragraph*{OpenCL/CUDA}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/context.c	Mon May 09 13:38:46 2016 +0900
@@ -0,0 +1,37 @@
+#include <stdlib.h>
+
+#include "context.h"
+
+extern __code code1_stub(struct Context*);
+extern __code code2_stub(struct Context*);
+extern __code code3_stub(struct Context*);
+
+__code initContext(struct Context* context) {
+    context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
+    context->code = (__code(**) (struct Context*)) NEWN(ALLOCATE_SIZE, void*);
+    context->data = NEWN(ALLOCATE_SIZE, union Data*);
+    context->heapStart = NEWN(context->heapLimit, char);
+    context->heap = context->heapStart;
+
+    context->codeNum = Code3;
+
+    context->code[Code1]      = code1_stub;
+    context->code[Code2]      = code2_stub;
+    context->code[Code3]      = code3_stub;
+
+    struct Worker* worker = ALLOC_DATA(context, Worker);
+    worker->num = 0;
+    worker->contexts = 0;
+
+    struct Allocate* allocate = ALLOC_DATA(context, Allocate);
+    allocate->size = 0;
+
+    struct Tree* tree = ALLOC_DATA(context, Tree);
+    tree->root = 0;
+
+    struct Node* node = ALLOC_DATA(context, Node);
+    node->key = 0;
+    node->value = 0;
+    node->left = 0;
+    node->right = 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/context.h	Mon May 09 13:38:46 2016 +0900
@@ -0,0 +1,58 @@
+/* define context */
+
+#define ALLOCATE_SIZE 20000000
+#define NEWN(n, type) (type*)(calloc(n, sizeof(type)))
+#define ALLOC_DATA(context, dseg) ({ context->data[dseg] = context->heap; context->heap += sizeof(struct dseg); (struct dseg *)context->data[dseg]; })
+
+enum Code {
+    Code1,
+    Code2,
+    Code3,
+};
+
+enum UniqueData {
+    Allocate,
+    Tree,
+    Queue,
+    Worker,
+};
+
+struct Context {
+    enum Code next;
+    int codeNum;
+    __code (**code) (struct Context*);
+    void* heapStart;
+    void* heap;
+    long heapLimit;
+    pthread_t thread;
+    int thread_num;
+    int dataNum;
+    union Data **data;
+};
+
+union Data {
+    struct Worker {
+        int num;
+        struct Context* contexts;
+    } worker;
+    struct Tree {
+        struct Node* root;
+    } tree;
+    struct Node {
+        // need to tree
+        enum Code next;
+        int key; // comparable data segment
+        union Data* value;
+        struct Node* left;
+        struct Node* right;
+        // need to balancing
+        enum Color {
+            Red,
+            Black,
+        } color;
+    } node;
+    struct Allocate {
+        enum Code next;
+        long size;
+    } allocate;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/openmp.c	Mon May 09 13:38:46 2016 +0900
@@ -0,0 +1,4 @@
+#pragma omp parallel for
+for(int i=0;i<N;i++) {
+    // Processing
+}