小久保翔平
処理とデータの単位として Code Gear, Data Gear を用いる
並列実行の単位となる
処理とデータの関係から依存関係を決定
Many Core CPU, GPU, Xeon Phi などを有効に利用するためにはそれぞれのアーキテクチャに合わせた記述が必要
Gears OS では Gear を用いて並列実行環境に合わせた設計・実装を行う
Gear を追加することでデータ拡張や機能の追加が可能
バージョンが異なる Gears OS でもの Gear 共通部分を用いて通信を行う
Code/Data Gear にはメタ計算に必要な情報として Meta Code/Data Gear が付属されている
関数型言語における Monad に相当
プログラムに対してメタレベルで Model Checking する
元のプログラムに影響を与えない
並列実行時のデッドロック検出
Code Gear 間での型検査
Cerium では Task という分割された処理を依存関係に沿って並列実行する
Task 同士の依存関係はプログラマ自身が記述する
Task の種類が増えるほど記述が複雑になる
Task 間の依存関係にのみ着目
データの依存関係を正しく保証しない
Task が取り扱うデータに型情報がない
汎用ポインタを型変換して利用
型検査できない
Alice では処理とデータの単位として Code Segment, Data Segment を用いる
処理とデータの関係から Code Segment 間の依存関係が決定
Data Segment を待ち合わせて Code Segment を実行することを Computaion と定義
Computaion を実現する Computaion を Meta Computaion と定義
切断や再接続時の処理、データの圧縮の機能などが相当
通常の Computaion に影響しない
Meta Computaion 自体は Alice で記述されていない
Data Segment にアクセスする API が設計上の問題で複雑化している
通常レベルとして Code/Data Gear を用いる
ポインタを扱わない
Code Gear は処理そのもの
OpenCL/CUDA の kernel に相当
接続された複数の Input Data Gear を参照
単一または複数の Output Data Gear に書き出す
自分が知らない Code/Data Gear は名前で指し示す
Data Gear はデータそのもの
C の構造体で表現
Primitive Data Type を格納
メタレベルとして Meta Code/Data Gear を用いる
ポインタを扱う
各 Gear の関連付け
Model Checking
平行制御
通常 List は要素と次へのポインタを持つ構造体で表現する
Gears OS では任意の要素を持つ Data Gear と次へのポインタを持つ Meta Data Gear の組によって List を表現する
ポインタの使用を通常レベルとメタレベルで分離
ポインタ関連のセキュリティフローを防止
処理が Code/Data Gear に閉じている
接続された Gear のみに干渉できる
処理の実行時間、メモリ使用量が予測可能
関数型言語における Monad に基づいて Meta Computation を行う
Monad を用いる手法は Moggi らが提案
Gears OS の Meta Computation は Meta Code/Data Gear を用いる
本研究室で開発している Continuation based C(CbC) で実装
LLVM をバックエンドした CbC コンパイラを用いる
CbC ではプログラムを Code Segment, Data Segment という単位で記述
Code Segment 間の処理の移動は goto を用いた軽量継続
末尾最適化を強制
実行に必要な情報をまとめた Context を生成
OS の Process, Thread に相当
メタレベル
Code Gear の名前とポインタの対応
Data Gear を Allocate するための情報
Code Gear が参照する Data Gear へのポインタ
Data Gear に格納される Data Type の情報
/* Context definition */
enum Code {
Code1,
Code2,
Allocator,
};
実行可能な Code Gear の名前を enum Code で宣言
初期化時に名前と関数ポインタを対応付ける
enum UniqueData {
Allocate,
Tree,
};
初期化時に確保する Data Gear を enum UniqueData で宣言
struct Context {
int codeNum;
__code (**code) (struct Context *);
void* heap_start;
void* heap;
long dataSize;
int dataNum;
union Data **data;
};
実行可能な Code Gear の数を示す codeNum
実行可能な Code Gear へのポインタ code
Data Gear の Allocate 用のポインタ heap_start, heap, dataSize
Data Gear の数を示す dataNum
Data Gear へのポインタ data
union Data {
struct Tree {
// Tree member definition
} tree;
struct Node {
// Node member definition
} node;
struct Allocate {
long size;
enum Code next;
} allocate;
};
Data Gear は C の共用体と構造体を用いた表現する
Data Gear の管理には木構造を用いる
非破壊で構成する
平行して読み書き・参照を行うことが可能
変更前の木構造をすべて保持しているので過去のデータにアクセス可能
Worker は Synchronized Queue から実行する Code Gear を取得
実行に必要な Data Gear は Persistent Data Gear から読み込む
処理が完了したら Persistent Data Gear に書き込む
List を表現する Code/Data Gear に CAS(Compare and Swap) を行う Meta Code/Data Gear を接続することで Synchronized Queue を実現する
Gears OS の機能は状態遷移図とクラスダイアグラムを組み合わせた GearBox という図で表現する
M:receiver/sender が CAS を行う Meta Code Gear となる
// Code Gear
__code code1(struct Context* context) {
context->data[Allocate]->allocate.size = sizeof(struct Node);
context->data[Allocate]->allocate.next = Code2;
goto meta(context, Allocate);
}
必要な情報を Data Gear に書き込み Allocate を行う Code Gear に接続する Code Gear
ポインタを扱っており設計思想と異なる
// Code Gear
__code code1(Allocate allocate) {
allocate.size = sizeof(struct Node);
allocate.next = Code2;
goto Allocate(allocate); // goes through meta
}
前の Code Gear として解釈するように CbC コンパイラを改良する
Code Gear
Cerium の Task
Alice の Code Segment
OpenCL/CUDA の kernel
Data Gear
Alice の Data Segment
Ceirum, OpenCL/CUDA には同等のものはない
Gears OS は Alice と同様に処理とデータの関係から依存関係を決定
Cerium, OpenCL/CUDA では処理同士の依存関係を記述する
データの依存関係を保証できない
必要な機能の実装
Synchronized Queue
Cerium と同様の例題を動かし比較・評価
Sort
Word Count
FFT
GPGPU のサポート
処理とデータの関係から処理同士の依存関係を解決し、並列実行するように設計を行なった
Gear という単位を用いて記述することでプログラムを柔軟に変更することを可能とした
Meta Code/Data Gear を用いて Meta Computation を実現する